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

简介: 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
目录
相关文章
|
7月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
8月前
|
存储 NoSQL 数据库
Redis 逻辑数据库与集群模式详解
Redis 是高性能内存键值数据库,广泛用于缓存与实时数据处理。本文深入解析 Redis 逻辑数据库与集群模式:逻辑数据库提供16个独立存储空间,适合小规模隔离;集群模式通过分布式架构支持高并发和大数据量,但仅支持 database 0。文章对比两者特性,讲解配置与实践注意事项,并探讨持久化及性能优化策略,助你根据需求选择最佳方案。
314 5
|
3月前
|
存储 运维 NoSQL
Redis集群模式
Redis集群是一种分布式存储方案,旨在解决数据存储容量不足的问题。它通过将数据分片存储在多个节点上,实现数据的横向扩展。常见的分片算法包括哈希求余、一致性哈希和哈希槽分区。其中,Redis采用哈希槽分区算法,将数据均匀分配到16384个槽位中,每个分片负责一部分槽位。当节点故障时,集群通过故障检测和主从切换机制,确保服务的高可用性。集群还支持自动的数据迁移和负载均衡,保障系统稳定运行。
|
7月前
|
数据采集 存储 NoSQL
基于Scrapy-Redis的分布式景点数据爬取与热力图生成
基于Scrapy-Redis的分布式景点数据爬取与热力图生成
393 67
|
6月前
|
存储 缓存 NoSQL
告别数据僵尸!Redis实现自动清理过期键值对
在数据激增的时代,Redis如同内存管理的智能管家,支持键值对的自动过期功能,实现“数据保鲜”。通过`EXPIRE`设定生命倒计时、`TTL`查询剩余时间,结合惰性删除与定期清理策略,Redis高效维护内存秩序。本文以Python实战演示其过期机制,并提供最佳实践指南,助你掌握数据生命周期管理的艺术,让数据优雅退场。
418 0
|
9月前
|
存储 NoSQL 算法
Redis分片集群中数据是怎么存储和读取的 ?
Redis集群采用的算法是哈希槽分区算法。Redis集群中有16384个哈希槽(槽的范围是 0 -16383,哈希槽),将不同的哈希槽分布在不同的Redis节点上面进行管理,也就是说每个Redis节点只负责一部分的哈希槽。在对数据进行操作的时候,集群会对使用CRC16算法对key进行计算并对16384取模(slot = CRC16(key)%16383),得到的结果就是 Key-Value 所放入的槽,通过这个值,去找到对应的槽所对应的Redis节点,然后直接到这个对应的节点上进行存取操作
|
9月前
|
缓存 NoSQL 关系型数据库
Redis和Mysql如何保证数据⼀致?
1. 先更新Mysql,再更新Redis,如果更新Redis失败,可能仍然不⼀致 2. 先删除Redis缓存数据,再更新Mysql,再次查询的时候在将数据添加到缓存中 这种⽅案能解决1 ⽅案的问题,但是在⾼并发下性能较低,⽽且仍然会出现数据不⼀致的问题,⽐如线程1删除了 Redis缓存数据,正在更新Mysql,此时另外⼀个查询再查询,那么就会把Mysql中⽼数据⼜查到 Redis中 1. 使用MQ异步同步, 保证数据的最终一致性 我们项目中会根据业务情况 , 使用不同的方案来解决Redis和Mysql的一致性问题 : 1. 对于一些一致性要求不高的场景 , 不做处理例如 : 用户行为数据 ,
|
存储 NoSQL 网络安全
Redis安装(单机、主从、哨兵、集群)
Redis安装(单机、主从、哨兵、集群)
337 1
|
NoSQL Redis 数据安全/隐私保护
redis高可用环境搭建(主从+哨兵)
redis高可用环境搭建(主从+哨兵)
200 0
|
缓存 NoSQL 应用服务中间件
分布式缓存之Redis(持久化、主从、哨兵、分片集群)
分布式缓存之Redis(持久化、主从、哨兵、分片集群)