延时双删-争议与我的思路-001
目录
- 概括
- 大概思路
- 目的
- 场景
- 思路一
- 退货
- 时间差
- 思路2
- 思路3
- 最后
概括
延时双删,是指在代码中删除两次缓存.
第一次自己访问,先删除.之后直接访问数据库获得数据
第二次是指 在第一步之后,在删除一次缓存的数据
大概思路
不进行延时双删的.寻找别的解决方法
目的
主要是为了解决数据库和缓存之间数据不一致的情况
如果在详细解释,就是另外的请求操作了对应的这条数据
比如
抢购的情况,别的用户抢到了需要对库存进行操作,在持久化,就是落库
场景
这里不详细写了.
思路一
数据分片,对数据进行分片.比如一条数据,的字段值是:10
可能是销售的场景,如果访问的频率在秒内比较大,就是每秒100个,那么用户请求
从缓存里面获取的不是最新的数据
数据分片
,就是以关键字段,进行拆分
比如,上面的数据,count 是 10,
那么就拆分成10条数据.拆分到别的表里面,在放到缓存里面
比如 redis 的 list,如果用户1抢购商品,用户2也抢购商品,这时候请求就到了后端,
但是用户2网络比较好,请求先到服务,服务在发送请求到redis里面
用户1的请求后到,这时候redis执行命令
用户2 的命令redis先执行,执行pop命令,用户1在执行一遍pop命令
而redis是线程安全的. 服务实例获取的数据如果是空的话证明商品被抢完了.
退货
如果发生了退货,那么就对应的该一条数据状态即可.
在将这条数据放到redis里面
其他的用户在页面进行刷新,请求到了服务,而服务读取
redis,可以获取到这条数据
时间差
这里会发生时间差,导致用户刷新会获取不到最新数据
具体就不解决了.如果是抢手的,用户实际体验中
每次刷新的数据都会和后台不一致
思路2
思路2就是对数据加版本号
数据存入的数据加上版本号.服务实例1读取到的数据和redis不一致的情况下,就等待
而不是进行删除操作
就是不知道行不行 有心人可以推演一下逻辑看看到底行不行
思路3
思路3和思路二类似,但是版本号只有两个值,就是0和1
最后
文章写在失业的第X天.如果转载请说明来源