Redis主从模式下过期数据和数据不一致

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Redis缓存,出现不一致的场景

1. 目录

R-C

2. Redis删除策略

2.1. 惰性删除

数据到达过期时间,并不做处理,而是等下次访问该数据时,先判断该数据是否过期,未过期,返回数据 ;发现已过期,删除该数据,返回不存在。 这种方式虽然节约 CPU 性能,发现必须删除的时候才删除。但是对内存压力很大,会出现长期占用内存的数据。

2.2. 定时删除

通过定时器,当 key 设置有过期时间,且过期时间到达时,由定时器任务立即执行对键的删除操作,虽然节约内存,到时即删除,快速释放不必要的内存,但是给 CPU 带来压力很大,均会占据 CPU ,如果遇到高峰期,会对响应 和 指令吞吐量有影响。

2.3. 内存淘汰机制

Redis 提供 6 种内存淘汰机制:

  • volatitle-lru:least recently used,从设置已过期时间的数据集中,挑选最近使用最少的数据淘汰。
  • volatitle-ttl:从设置已过期时间的数据集中挑选即将要过期数据淘汰。
  • volatitle-random:从设置已过期时间的数据集中随机任意选择数据淘汰。
  • allkeys-lru:当内存不足在键空间中,移除最近最少使用的 key。
  • allkeys-random:当内存不足在键空间中,随机任意选择数据淘汰。
  • no-eviction:禁止驱除数据,内存不足,禁止新数据写入,对新写入的操作会报错。<极端方式,真实场景下,这种策略不值得推荐>

在 4.0 后增加了两种模式:

  • volatitle-lfu(least frequently used):从设置已过期时间的数据集中移除最不经常使用的数据淘汰。
  • allkeys-lfu(least frequently used):当内存不足在键空间中,移除最不经常使用的数据淘汰。

3. 过期数据

20211115154057

有这样一种场景,应用1 向主节点写数据,并且设置失效时间。

3.1. 读取 Master

应用数据已经过期,主库的惰性删除会发生作用,主动对该数据进行删除操作,保证 客户端应用不会拿到过期的数据。

3.2. 读取 Slave

如果 读取的是 Slave 库,则有可能会拿到过期数据,一般造成这样原因有两个。

3.2.1. 版本过低

这样的场景由于 Redis 控制不住过期数据被客户端应用误读,形成数据不安全。但是 Redis 从 3.2 版本后,对此类场景的数据问题做过滤,并且返回空值。所以 如果有应用此场景,需要对 Redis 进行升级操作。

3.2.2. 过期时间设置

与过期时间设置方式有关系,一般我们采用 EXPIREPEXPIRE,都表示从执行命令那个时刻即 开始时间 开始,往后延长 ttl 时间,严重依赖于 开始时间 从什么时候算起。

20211115155642

上图描述的过程大致如下:

  • Master 在 t1 时刻写入一个带过期时间的数据,数据的有效期一直到 t3
  • 由于网络波动或者所在服务器自身执行问题,Slave 实际执行开始时间为 t2,数据有效期一直到 t5。
  • 如果客户端应用在 t3 至 t4 时间段内访问,则可能获取到过期时间。

一般此种场景解决方案就是要求 主从节点服务器NTP时间服务保持时钟同步

4. 主从不一致

20211115161513

上图描述的过程大致如下:

  • T1 时间点,主库将主键 key1 的内容改为 100,此时通过主从异步同步,从库中的 key1 会拿到该数据
  • T2 时间点,主库将主键 key1 的内容改为 200,此时由于主从之间的网络问题,或者服务器正在处理 pipline 批处理操作,无法及时同步执行。

针对上述问题,我们建议针对 Redis 部署有如下要求:

  • 主从服务器尽量部署在同一个机房,并保持服务器间的网络良好通畅
  • 监控主从库间的同步进度,通过 info replication 命令 ,查看主库接收写命令的进度信息(master_repl_offset),从库的复制写命令的进度信息(slave_repl_offset
相关实践学习
基于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
目录
相关文章
|
2月前
|
缓存 监控 NoSQL
Redis经典问题:数据不一致
在使用Redis时,缓存与数据库数据不一致会导致应用异常。主要原因包括缓存更新失败、Rehash异常等。解决方案有:重试机制、缩短缓存时间、优化写入策略、建立监控报警、定期验证一致性、采用缓存分层及数据回滚恢复机制。这些措施可确保数据最终一致性,提升应用稳定性和性能。
|
2月前
|
缓存 NoSQL Redis
Redis经典问题:数据并发竞争
数据并发竞争是大流量系统(如火车票系统、微博平台)中常见的问题,可能导致用户体验下降甚至系统崩溃。本文介绍了两种解决方案:1) 加写回操作加互斥锁,查询失败快速返回默认值;2) 保持多个缓存备份,减少并发竞争概率。通过实践案例展示,成功提高了系统的稳定性和性能。
|
3月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
69 5
|
3月前
|
缓存 NoSQL 关系型数据库
Redis和Mysql如何保证数据⼀致?
在项目中,为了解决Redis与Mysql的数据一致性问题,我们采用了多种策略:对于低一致性要求的数据,不做特别处理;时效性数据通过设置缓存过期时间来减少不一致风险;高一致性但时效性要求不高的数据,利用MQ异步同步确保最终一致性;而对一致性和时效性都有高要求的数据,则采用分布式事务(如Seata TCC模式)来保障。
87 14
|
3月前
|
存储 NoSQL 算法
Redis分片集群中数据是怎么存储和读取的 ?
Redis集群采用哈希槽分区算法,共有16384个哈希槽,每个槽分配到不同的Redis节点上。数据操作时,通过CRC16算法对key计算并取模,确定其所属的槽和对应的节点,从而实现高效的数据存取。
85 13
|
6月前
|
存储 NoSQL Redis
Redis存储原理与数据模型
Redis存储原理与数据模型
|
8月前
|
存储 缓存 NoSQL
了解Redis,第一弹,什么是RedisRedis主要适用于分布式系统,用来用缓存,存储数据,在内存中存储那么为什么说是分布式呢?什么叫分布式什么是单机架构微服务架构微服务的本质
了解Redis,第一弹,什么是RedisRedis主要适用于分布式系统,用来用缓存,存储数据,在内存中存储那么为什么说是分布式呢?什么叫分布式什么是单机架构微服务架构微服务的本质
|
9月前
|
存储 缓存 NoSQL
为什么要在 Redis 中存储两次同一份数据?
为什么要在 Redis 中存储两次同一份数据?
102 0
为什么要在 Redis 中存储两次同一份数据?
|
9月前
|
存储 NoSQL 算法
redis存储什么类型的数据?redis分布式锁怎么实现的?
redis存储什么类型的数据?redis分布式锁怎么实现的?
|
9月前
|
存储 NoSQL Redis
redis存储原理和数据模型
redis存储原理和数据模型
81 1