先记录一些纲要
1、SpringCache是写库之后更新的策略,对缓存一致性的不太友好
2、继承RedisCacheManager重写createRedisCache,继承RedisCache重写put
3、缓存一致性有两个方案,一个是先写库再删除缓存、第二个是先删除缓存再写库。
先写库再删除缓存配合超时时间一般没啥问题,极端的情况遇到缓存失效,线程读库和加缓存之间,完成了一次写库和删缓存的操作,导致加的缓存是旧的。总结就是读中加入了一次写。A读库 B写库 B删缓存 A加缓存。
先删缓存再写库的话,是写中加入了一次读。A删缓存 B读库 B加缓存 A写库A。这个概率比上面的大。
这两种方案的问题的解决方式是一样的,就是延时双删策略。即:
删缓存 写库 延时再次删除缓存(需超过一次读库的时间,可以新启线程完成)
或者 写库 删缓存 延时再次删除缓存(需超过一次读库的时间,可以新启线程完成)
如果有主从读写分离,需要将延时再加上主从同步的时间。
还有个第二次删除失败的问题,这个问题可以通过消息中间件,反复尝试进行。或者通过订阅binlog,反复进行。
多级缓存可以参考阿里开源的JetCache的实现
后面会给出demo和源码解析。
网友评论