保持一致性,常用的方法有三种:双写,失效,使用第三方中间件(比如Canal)。具体实现时还要根据对不一致的容忍度,考虑是否要加锁(比如使用Redisson)。加锁一定要考虑到锁的粒度。
1、 双写
发生更新时同时写数据库和缓存。在分布式情况下容易产生 写后写 问题。
2、 失效
发生更新时清理缓存,让其请求时自动重新加载数据到缓存。在分布式情况下容易出现重复读删导致缓存失效的情况。
3、使用第三方中间件
使用第三方中间件或者自己写服务,监听数据变化(比如mysql中订阅binlog),发生变更自动更新缓存。
上述方法1、2中的问题可以考虑通过加读写锁处理。