Redis缓存更新策略

双写不一致问题解决方案再下方

内存淘汰:不用自己维护,利用redis的内存淘汰机制,内存不足时自动淘汰部分数据,下次查询时更新缓存。

超时剔除:给缓存数据添加TTL时间,到期后自动删除缓存。下次查询时更新缓存。

主动更新:编写业务逻辑,在修改数据库的同时,更新缓存

                cache Aside Patten:由缓存的调用者,在更新数据库的同时更新缓存   企业运用多

                Read/Write Through Pattern:缓存与数据库整合为一个服务,由服务来维护一致性。

                调用者调用该服务,无需关心缓存一致性问题。

                Write Behind Caching Pattern:调用者只操作缓存,由其它线程异步的将缓存数据持

             

 Cache Aside Pattern:

                                删除缓存还是更新缓存?

                                        更新缓存:每次更新数据库都更新缓存,无效写操作较多

                                        删除缓存:更新数据库时让缓存失效,查询时再更新缓存

                                如何保证缓存与数据库的操作放在一个事务?

                                        单体系统,将缓存与数据库操作放在一个事务

                                        分布式系统,利用TTC等分布式事务方案

                                先操作缓存还是先操作数据库?

先删除缓存,再操作数据库   

可能存在的问题:如果线程1删除缓存,由于逻辑再太复杂,还没由更新完数据库,这时线程2,进行查询缓存,发现缓存没有,进行查询数据库,查询到还未更改的数据,线程2将查询到数据写入缓存中,再写入缓存中操作完成后,线程1更新数据库,

最终会导致:缓存中的数据还是原来的数据,数据库中数据时新数据。                                         

redissyncer 双写 redis双写不一致终极解决_redis

 先操作数据库,再删除缓存

可能存在的问题:当线程1 查询缓存的时候刚好缓存失效了,查询数据库,查到的是原数据,这时线程2对数据库进行更新操作,更新完之后删除缓存,再删除2删除缓存之后,线程1将查到的数据写入缓存,

最终会导致:数据库中是更新后的数据,缓存中是原数据,缓存与数据库不一致     

但是出现这种几率的很小,因为缓存的速度远远高于操作数据库的速度,所以先操作数据库,再删除缓存更好 

redissyncer 双写 redis双写不一致终极解决_数据_02

 

缓存数据库双写不一致  优化解决方法

        延时双删 再线程2删除缓存之后延时几百毫秒在删除一下缓存   不怎么靠谱。

        分布式的读写锁    读多写少的情况下用。(写要排队  读不用排队)

    写多读多的情况下还不知如何优化还请大佬帮忙,写在评论下,小弟带大家谢过大佬了

使用场景最佳实践方案:
低一致性需求:使用内存淘汰机制。

高一致性:主动更新,并以超时剔除作为补充

        读操作:

                缓存命中直接返回

                缓存未命中则查询数据库,并写于缓存,设置超时时间

        写操作:

                先写数据库,然后在删除缓存

                要确保数据库与缓存操作的原子性