Redis:缓存问题之数据不一致(更新数据库时 主动更新)

本文探讨了Redis缓存与数据库数据不一致的问题,分析了互联网业务对数据一致性的需求。提出了延时双删策略,即先更新数据库,随后删除缓存,并在一定时间后再次删除,以确保最终一致性。同时,讨论了使用TTL、缓存淘汰策略和异步更新等方法,并比较了各种策略的一致性和维护成本。此外,还提到了通过数据库binlog异步淘汰缓存的升级方案。

Redis:缓存问题之数据不一致(更新数据库时 主动更新)


关键词

  • 数据源不一样(缓存和db操作非原子性)
  • 1.延时双删 —> 2.TTL —> 3.缓存删除失败记录到日志中,利用脚本提取失败记录再次删除

一、不一致问题

缓存和DB的数据不一致的根源 : 数据源不一样

在这里插入图片描述

二、不一致分析

2.1 分析

  • 强一致性很难,追求最终一致性(时间)

  • 互联网业务数据处理的特点
    高吞吐量
    低延迟
    数据敏感性低于金融业

  • 时序控制是否可行?
    先更新数据库再更新缓存或者先更新缓存再更新数据库
    本质上不是一个原子操作,所以时序控制不可行
    高并发情况下会产生不一致

三、不一致解决(延时双删)

1、(第一次删除:)先更新数据库同时删除缓存项(key),等读的时候再填充缓存
2、(第二次删除:避免并发读)2秒后再删除一次缓存项(key)(理论上,2s之后db的操作肯定已经commit了
3、(第二次删除失败,配置TTL)设置缓存过期时间 Expired Time 比如 10秒 或1小时
4、将缓存删除失败记录到日志中,利用脚本提取失败记录再次删除(缓存失效期过长 7*24)

升级方案

(异步,滞后)通过数据库的binlog来异步淘汰key,利用工具(canal)将binlog日志采集发送到MQ中,然后通过ACK机制确认处理删除缓存

四、缓存与数据库一致性

4.1 缓存更新策略

  • 利用Redis的缓存淘汰策略被动更新 LRU 、LFU
  • 利用TTL被动更新
  • 在更新数据库时主动更新 (先更数据库再删缓存----延时双删)
  • 异步更新 定时任务 数据不保证时时一致 不穿DB(直接client访问redis,不走db;db定时更新redis)

4.2 不同策略之间的优缺点

策略一致性维护成本
利用Redis的缓存淘汰策略被动更新最差最低
利用TTL被动更新较差较低
在更新数据库时主动更新较强最高
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

穿城大饼

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值