背景
某服务使用了缓存和数据库,存储了计费规则相关信息,有一次在修改了规则之后,新规则没有生效。最后探究原因,是因为先删除了缓存,数据库还没修改,此时有请求打进来,查缓存没有,查数据库,将老数据更新到了缓存里,然后数据库才更新。导致后续的请求查缓存都是旧数据。
问题所在
1、数据库缓存一致性
2、缓存key的过期时间
3、@Transactional范围合理性,本次case代码中是先改库后删缓存,但是都在一个事务修饰的方法中,实际情况先执行了缓存操作后才提交的数据库事务
思考
数据库缓存一致性
对于这个问题,分成两个方面考虑
最终一致性
1、先改库后删缓存,监控改库/删缓存失败情况
2、缓存key的过期时间要合理评估
3、定时任务校验缓存和数据库相关数据的一致性
4、通过消息队里解耦缓存操作
5、通过单独服务监听数据库binlog解耦缓存操作
强一致性
1、考虑只使用数据库
2、通过内存队列,同一id(同一特征,取余等操作)的数据路由到同一台机器,且由同一个线程来处理,将读写请求串行化