34|缓存一致性问题:高并发服务如何保证缓存一致性?
double-check 模式
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了高并发服务中缓存一致性的重要性及解决方案。首先介绍了 double-check 模式及其变种,以及数据不一致的根源和解决方案,如消息队列和版本号的方案。文章还探讨了多级缓存架构下的数据一致性问题,强调了更新数据库优先、本地缓存次之、最后更新 Redis 的顺序。此外,还介绍了一致性哈希和缓存的方案,以及分布式锁方案。在讨论中,强调了负载均衡算法和 singleflight 模式的重要性,以及在节点上线或下线时的处理方法。总体而言,本文内容丰富,涵盖了缓存一致性的多个方面,对于需要深入了解缓存一致性问题的读者具有很高的参考价值。文章内容涉及了 double-check 模式、数据不一致的根源和解决方案、多级缓存架构下的数据一致性问题、一致性哈希和缓存的方案、分布式锁方案等多个方面,为读者提供了全面的技术视角和解决思路。
《后端工程师的高阶面经》,新⼈⾸单¥59
全部留言(9)
- 最新
- 精选
- 木木夕现在面试都这样用一些在生产不切实际的方案吗?Cache Aside 就能满足百分之99的场景了。你们真的会在项目中这样应用嘛?
作者回复: 我从实践和面试上来讲这个问题。 实践中用不用?答案是基本不用,你说 99% 的比例我也差不多赞同。但是你说我有没有用过,我确实用过,各种骚操作。 面试中呢?答案就更加简单了,Cache Aside 大家都会,我凭什么给你 offer 呢? 我个人认为,即便公司用不着,你自己也应该尝试一下,毕竟还是那句话,简单的东西大家都会,你凭什么在面试中拿到 offer 呢?
2023-09-07归属地:广东26 - stevensafin实际有应用吗
作者回复: 嘿嘿,都搞过。
2023-09-06归属地:广东1 - penbox1. 分布式方案的思路二里面,是先提交事务再释放分布式锁,顺序能反过来吗? 不可以。释放分布式锁之后,读请求就能直接从数据库加载数据了,此时更新事务可能还没有提交,读到的就会是旧的数据。 2. 有一种使用分布式锁的方案是先加分布式锁,再执行本地事务并提交,最后删除缓存,释放分布式锁。这种方案有什么缺点?有没有可能出现数据不一致? 分布式锁的占用时间也会很长,还不能保证一致性。 在失败的情况下:如果事务提交失败,不会删除缓存,数据还是一致的;如果事务提交成功,但是缓存删除失败了,那么数据就不一致了。
作者回复: 赞!
2023-09-06归属地:四川1 - 天天有吃的在有分布式锁的情况下,seata tcc给redis值补回去也可以吧
作者回复: 这个我倒是没深入研究过,所以不太了解。
2024-03-03归属地:福建 - fd怎么通知到所有的本地缓存都更新呢?
作者回复: 1. RPC 中的广播调用 2. 借助某些配置中心,大家都监听 key,key 一旦变化,大家就重新加载缓存。 3. 订阅 Kafka,每个节点都是一个独立的消费者组,监听到消息就重新加载。
2024-02-21归属地:广东2 - 大将军Leo。。老师,一致性哈希 + Redis + 本地缓存这个方案我有个细节问题问下: 本地缓存的更新问题,文章里面提到,如果更新这个操作也是用户通过网关(一致性哈希)触发这种我们可以在一个pod里面解决。 但是如果这个更新操作不是用户触发,可能是通过其他系统内部rpc回调的没走网关,这种怎么处理?如果使用binglog订阅再加广播,但是这个消费这里怎么处理、需要和网关这里联动(因为节点数量加减很可能网关路由变更)?
作者回复: 你是为了更新数据的时候同步更新本地缓存?这种情况下没有特别好的做法。一种做法是虽然你不经过网关,但是你做客户端负载均衡的时候按照同样的算法来筛选节点。 你的场景没有说清楚,所以我也不了解你们的binlog 和广播是怎么一回事。不过如果有人能够绕过负载均衡,那么我不是很建议你实践中用这个方案。
2024-01-18归属地:广东2 - 好运来回查请求加分布式锁图中 右边加分布式锁 -》读数据a=2 -》更新缓存a=1 这里是不是错了,应该是 右边加分布式锁 -》读数据a=2 -》更新缓存a=2 这样吧?
作者回复: 嗯嗯,感谢勘误。
2023-09-13归属地:广东 - peter“同一个 key 的请求都落在同一个节点上,依旧存在并发更新的问题”,既然是同一个key的请求,为什么还会有并发问题?
作者回复: 没有 singleflight 的时候,你多个线程更新数据库和缓存这种场景。
2023-09-06归属地:河南2 - on这一讲中的读加锁,double check,在并发环境中基本不可取,会堵并发的2024-03-20归属地:上海