项目里面用到了关系型数据库和redis做缓存,并开启了事物。但是遇到异常的时候虽说数据库里面的数据能回滚,但是存在redis的数据却不对,
项目里面用到了关系型数据库和redis做缓存,并开启了事物。但是遇到异常的时候虽说数据库里面的数据能回滚,但是存在redis的数据却不对,
今天面试的时候,被问到跟你类似的问题,上网搜一下只搜到这个问题,就来说一下我的情况吧。
我的想法和其他人也一直,就是在保证入库的前提下(也就是事务完成之后)再进行缓存的更新,或者对缓存进行CAS校验。
但是面试官说,这样做无疑增加了开发的复杂性,因为把更新缓存和实际业务逻辑分离了,有没有更好的方法。
我觉得他说的也对,但最后也没想到什么好点子,原本以为面试官会有很棒的解题思路。
结果他的回答让我崩溃,他说:
1,在事务中的时候不做更新缓存操作,而是用删除缓存的操作
2,在读数据的时候,才去判断缓存时候过期或者是否需要更新。
3,为了保证删除缓存的操作万无一失,进行双删除操作,同步删一次,异步删一次。
我勒个去,先不提读数据时也是存在数据不一致的隐患,我一直没想去删除缓存这个方法,就是因为一旦删除缓存之后,万一突然来了个高并发请求,是会造成缓存穿透的,而缓存穿透的危害比数据不一致要大得多。他说这个是内部系统不会有很大的访问量,这种解释简直无语,他的这种做法和hack没任何区别。
15 回答8.2k 阅读
8 回答6k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.2k 阅读
2 回答3.9k 阅读
1 回答2.2k 阅读✓ 已解决
先入库在写缓存的吧,mysql的Innodb引擎才支持事务,流程正确了就不存在这个问题