前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >延迟双删解读

延迟双删解读

原创
作者头像
一个风轻云淡
发布2024-01-31 11:35:04
6650
发布2024-01-31 11:35:04

前言

双写一致性:只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题。我们需要保证redis跟数据库的中的数据保持一致,返回正确的数据。

引进

模拟场景:A线程先成功删除了redis里面的数据,然后去更新mysql,此时mysql正在更新中,还没有结束。(比如网络延时)B突然出现要来读取缓存数据。此时redis里面的数据是空的,B线程来读取,先去读redis里数据(已经被A线程delete掉了)。

时间

线程A

线程B

出现的问题

t1

请求A进行写操作,删除缓存后,工作正在进行中......

A还更新完mysql,致B读到了旧值线程B遵守回写机制,把旧值写回redis,导致其它请求读取的还是旧值,A白干了。

t2

缓存中读取不到,立刻读mysal,由于A还没有对mysal更新完,读到的是旧值。 还把从mysgl读取的旧值,写回了redis

t3

更新mysql数据库的值,over

redis是被B写回的旧值mysql是被A更新的新值出现了,数据不一致问题。

延时双删策略

可以先对缓存的数据先进行删除一次,再处理好数据库的业务以后睡眠一段时间后再进行一次删除。这就是延迟双删。

加上sleep的这段时间,就是为了让线程B能够先从数据库读取数据,再把缺失的数据写入缓存,然后,线程A再进行删除。所以,线程A Sleep的时间,就需要大于现场B读取数据再写入缓存的时间。这样一来,其他线程读取数据时,会发生缓存缺失,所以会从数据库中读取最新值。因为这个方案会在第一次删除缓存值后,延迟一段时间再去进行删除,所以我们也把它叫做"延迟双删"

缺点:

  1. 延时双删,有等待环节,如果系统要求低延时,这种场景就不合适了。
  2. 延时双删,不适合“秒杀”这种频繁修改数据和要求数据强一致的场景。
  3. 延时双删,延时时间是一个预估值,不能确保 mysql 和 redis 数据在这个时间段内都实时同步或持久化成功了。

mysql 和 redis 数据最终一致性,但它不是强一致。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 引进
  • 延时双删策略
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档