记一次数据库缓存不一致导致的线上case

背景

某服务使用了缓存和数据库,存储了计费规则相关信息,有一次在修改了规则之后,新规则没有生效。最后探究原因,是因为先删除了缓存,数据库还没修改,此时有请求打进来,查缓存没有,查数据库,将老数据更新到了缓存里,然后数据库才更新。导致后续的请求查缓存都是旧数据。

问题所在

1、数据库缓存一致性
2、缓存key的过期时间
3、@Transactional范围合理性,本次case代码中是先改库后删缓存,但是都在一个事务修饰的方法中,实际情况先执行了缓存操作后才提交的数据库事务

思考

数据库缓存一致性

对于这个问题,分成两个方面考虑

最终一致性

1、先改库后删缓存,监控改库/删缓存失败情况

2、缓存key的过期时间要合理评估

3、定时任务校验缓存和数据库相关数据的一致性

4、通过消息队里解耦缓存操作

5、通过单独服务监听数据库binlog解耦缓存操作

强一致性

1、考虑只使用数据库

2、通过内存队列,同一id(同一特征,取余等操作)的数据路由到同一台机器,且由同一个线程来处理,将读写请求串行化

@Transactional注解范围考虑

猜你喜欢

转载自blog.csdn.net/lbh199466/article/details/107042482