数据库和缓存的数据一致性问题是 Web 开发中经常碰到的,一般我们都是采用 cache aside 方案,比如这篇文章介绍的。最近参考Scaling Memcache at Facebook,我想到了一个基于 redis 的简化版本,不知是否可行,希望大家帮忙参考下:
cacheKey + "_id"
,value 是随机数,expireTime=10 秒,若 key 已存在则失败),若生成 leaseId 失败则等待并重试。cacheKey + "_id"
、value=leaseId 的值)cacheKey + "_id"
的值)这样有什么问题吗?
1 yule111222 2023-09-20 17:49:20 +08:00 cacheMiss 后,先查 db 再更新缓存,这一步追加分布式锁不就行了吗? |
![]() | 2 pdxjun 2023-09-20 18:12:49 +08:00 为什么这么麻烦,加一个分布式锁,不就可以了吗 |
![]() | 3 luckyrayyy 2023-09-20 19:09:02 +08:00 miss 的时候生成 key ,不就是一个分布式锁么。更新缓存加分布式锁有热点风险 |
4 javaisthebest 2023-09-21 01:38:39 +08:00 只要是多机器通信就会牵扯到网络 只要牵扯到网络就会形成分区。。 所以放弃你这个想法吧。 天命不可违 后续的任何一次操作失败就代表形成了 P 。。 |
![]() | 5 xing393939 OP @yule111222 @pdxjun 要求数据强一致的话:加分布式锁,那么所有请求被阻塞的时间是[更新 db+删除缓存+查 db+更新缓存],而我的方案阻塞的时间是[查 db+更新缓存],我这个相当于是乐观锁。 @luckyrayyy 你说的热点风险具体场景是咋样的呢? |