作者回复: 👍👍👍
作者回复: 👍👍👍
作者回复: 首先这是个经典的方案,靠谱是没问题的。它可以解决问题是,不用真正去查询数据集,就可以判断,请求的数据是不是,不在数据集内。如果不在就不用去查询数据集了。 不少数据库都内置了布隆过滤器来提升查询效率,比如HBase。 布隆过滤器的缺点就是有点复杂,实现难度还是挺大的。
作者回复: 严格来说,在并发情况下,二种方式都有可能产生脏数据。Cache Aside Pattern建议,先操作数据库,再操作缓存。
作者回复: mvcc可以很好的解决读写冲突,但是对于写写冲突,要么加锁,要么引入冲突检测机制,否则就会导致写倾斜的问题。这个在23中有详细的说明。
作者回复: 这种情况理论上也没有完美的解决方案,来说说实际上的一些处理经验。 首先,避免短时间大量人为的空值攻击,这个事儿应该在上层安全或者风控层面去解决。(即使无法判断是否空值攻击,至少要拦截住短时间大量的不正常访问请求) 剩余下来的就是业务上正常的查询返回空的情况,这种可能要从业务上来设计一下,尽量避免大量可能的空值查询。 以上2点做了之后,空值查询就会少多了,这个时候可以根据实际情况选择缓存空值,或者让空值穿透。
作者回复: 这个还是得看业务,很多列表也可以缓存的,比如说一些排行榜数据。
作者回复: 你可以参考一下“GaGi”同学的留言,用锁来解决并发问题。
作者回复: 使用Redis命令INCR是可以保存原子性的。 如果是GET出来,在程序内加一,在SET回去,确实会存在并发问题。