Redis缓存与数据库一致性解决方案(上)

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis缓存与数据库一致性解决方案

只要使用Redis做缓存,就必然存在缓存和DB数据一致性问题。若数据不一致,则业务应用从缓存读取的数据就不是最新数据,可能导致严重错误。比如将商品的库存缓存在Redis,若库存数量不对,则下单时就可能出错,这是不能接受的。

1 什么是缓存和DB的数据一致性

一致性包含如下情况:

  • 缓存有数据
    缓存的数据值需和DB相同
  • 缓存无数据
    DB必须是最新值

不符合这两种情况的,都属于缓存和DB数据不一致

2 缓存的读写模式

根据是否接收写请求,可将缓存分成读写缓存和只读缓存。

2.1 读写缓存

若要对数据进行增删改,需要在Cache进行

同时根据采取的写回策略,决定是否同步写回DB:

2.1.1 同步直写

写缓存时,也同步写数据库,缓存和数据库中的数据一致。

2.1.2 异步写回

写缓存时不同步写DB,等到数据从缓存中淘汰时,再写回DB。使用这种策略时,若数据还没有写回DB,缓存就发生故障,则此时,DB就没有最新数据了。

所以,对于读写缓存,要想保证缓存和DB数据一致,就要采用同步直写。若采用这种策略,就需同时更新缓存和DB。所以,要在业务代码中使用事务,保证缓存和DB更新的原子性,即两者:


要么一起更新

要么都不更新,返回错误信息,进行重试

否则,我们无法实现同步直写。


有些场景下,我们对数据一致性要求不高,比如缓存的是电商商品的非关键属性或短视频的创建或修改时间等,则可以使用异步写回。

2.2 只读缓存

  • 新增数据
    直接写DB
  • 删改数据
    删改DB,删除只读缓存中的数据

这样应用后续再访问这些增删改的数据时,由于Cache无数据 =》缓存缺失。

此时,再从DB把数据读入Cache,这样后续再访问数据时,直接读Cache。

下面我们针对只读缓存,看看具体会遇到哪些问题,又该如何解决。

3 新增数据

数据直接写到DB,不操作Cache。此时,Cache本身无新增数据,而DB是最新值,所以,此时缓存和DB数据一致。

4 删改数据

此时应用既要更新DB,也要删除Cache。这俩操作若无法保证原子性,就可能出现数据不一致。

4.1 先删Cache,再更新DB

image.png

4.2 先更新DB,再删除Cache

image.png

综上,在更新DB和删除Cache时,无论这俩操作谁先执行,只要有一个操作失败了,就会导致客户端读到旧值。

那怎么办?好像怎么都会导致数据不一致?

5 数据不一致的解决方案

5.1 无并发

重试

将:

要删除的Cache值

或要更新的DB值

暂存到MQ。


当应用删除Cache或更新DB:


成功

把这些值从MQ去除,避免重复操作,这时即可保证DB、Cache数据一致性。

失败

重试。从MQ重新读取这些值,然后再次进行删除或更新。若重试超过一定次数,还没成功,就向业务层发送报错信息。

在更新数据库和删除缓存值的过程中,其中一个操作失败了:

先更新DB,再删除缓存

  • 若删除缓存失败,再次重试后删除成功
  • image.png
  • 其它情况不再赘述。

即使这两个操作第一次执行时都没有失败,当有大量并发请求时,应用还是有可能读到不一致的数据。

按不同的删除和更新顺序,分成两种情况来看

5.2 高并发

5.2.1 先删除Cache,再更新DB

假设现有时刻t1< t2 < t3,线程 T1、T2:

image.png

此时,该怎么办呢?

解决方案

T1更新完DB后,让它sleep一段时间,再删除缓存。

为什么要sleep一段时间呢?

为了让T2能够先从DB读数据,再把缺失数据写入缓存,然后,T1再进行删除。

所以,T1 sleep的时间,就需要大于T2读取数据再写入缓存的时间。


这个时间怎么确定?


在业务程序运行时,统计下线程读数据和写缓存的操作时间,以此为基础来进行估算。


这样,当其它线程读数据时,会发现缓存缺失,所以会从DB读最新值。因为这个方案会在第一次删除缓存值后,延迟一段时间再次进行删除,所以称为“延迟双删”。

redis.delKey(X)
db.update(X)
Thread.sleep(N)
redis.delKey(X)
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
26天前
|
缓存 NoSQL 关系型数据库
在Python Web开发过程中:数据库与缓存,MySQL和NoSQL数据库的主要差异是什么?
MySQL是关系型DB,依赖预定义的表格结构,适合结构化数据和复杂查询,但扩展性有限。NoSQL提供灵活的非结构化数据存储(如JSON),无统一查询语言,但能横向扩展,适用于大规模、高并发场景。选择取决于应用需求和扩展策略。
114 1
|
14小时前
|
存储 缓存 运维
软件体系结构 - 缓存技术(5)Redis Cluster
【4月更文挑战第20天】软件体系结构 - 缓存技术(5)Redis Cluster
28 10
|
4天前
|
NoSQL MongoDB Redis
Python与NoSQL数据库(MongoDB、Redis等)面试问答
【4月更文挑战第16天】本文探讨了Python与NoSQL数据库(如MongoDB、Redis)在面试中的常见问题,包括连接与操作数据库、错误处理、高级特性和缓存策略。重点介绍了使用`pymongo`和`redis`库进行CRUD操作、异常捕获以及数据一致性管理。通过理解这些问题、易错点及避免策略,并结合代码示例,开发者能在面试中展现其技术实力和实践经验。
35 8
Python与NoSQL数据库(MongoDB、Redis等)面试问答
|
8天前
|
缓存 NoSQL Java
使用Redis进行Java缓存策略设计
【4月更文挑战第16天】在高并发Java应用中,Redis作为缓存中间件提升性能。本文探讨如何使用Redis设计缓存策略。Redis是开源内存数据结构存储系统,支持多种数据结构。Java中常用Redis客户端有Jedis和Lettuce。缓存设计遵循一致性、失效、雪崩、穿透和预热原则。常见缓存模式包括Cache-Aside、Read-Through、Write-Through和Write-Behind。示例展示了使用Jedis实现Cache-Aside模式。优化策略包括分布式锁、缓存预热、随机过期时间、限流和降级,以应对缓存挑战。
|
15天前
|
存储 缓存 NoSQL
使用redis进行缓存加速
使用redis进行缓存加速
26 0
|
16天前
|
存储 缓存 NoSQL
Java手撸一个缓存类似Redis
`LocalExpiringCache`是Java实现的一个本地缓存类,使用ConcurrentHashMap存储键值对,并通过ScheduledExecutorService定时清理过期的缓存项。类中包含`put`、`get`、`remove`等方法操作缓存,并有`clearCache`方法来清除过期的缓存条目。初始化时,会注册一个定时任务,每500毫秒检查并清理一次过期缓存。单例模式确保了类的唯一实例。
13 0
|
20天前
|
存储 缓存 NoSQL
Redis 服务器指南:高性能内存数据库的完整使用指南
Redis 服务器指南:高性能内存数据库的完整使用指南
|
25天前
|
缓存 应用服务中间件 数据库
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(多级缓存设计分析)
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(多级缓存设计分析)
29 1
|
1月前
|
缓存 NoSQL Java
spring cache整合redis实现springboot项目中的缓存功能
spring cache整合redis实现springboot项目中的缓存功能
45 1
|
4天前
|
关系型数据库 MySQL 分布式数据库
《MySQL 简易速速上手小册》第6章:MySQL 复制和分布式数据库(2024 最新版)
《MySQL 简易速速上手小册》第6章:MySQL 复制和分布式数据库(2024 最新版)
33 2

热门文章

最新文章