Redis的Key过期问题处理
Redis主节点的Key已过期,但从节点依然读到过期数据
我们知道,大部分的业务场景都是读多写少,为了利用好这个特性,提升Redis集群系统的吞吐能力,通常会采用主从架构、读写分离
如上图所示:其中
- Master节点:负责业务的写操作
- Slave节点:实时同步Master节点的数据,提供读能力
为了提高吞吐量,采用一主多从的架构,将业务的读压力分摊到多个节点上
上述方案,看似非常合理,但其实可能存在一定的隐患!!!
拉取过期数据
Redis性能高主要是得益于纯内存的操作,但内存存储介质的成本过高,所以的数据的存储也有一定的瓶颈。
我们通常会设置过期时间,对于一些使用不是很频繁的数据,会定期删除,提高资源的利用率。
*删除过期数据,Redis提供了两种策略:1、惰性删除 也称为被动删除,当数据过期后,并不会立马删除。而是等到有请求访问时,对数据检查,如果数据过期,则删除数据。优点:不需要单独启动额外的扫描线程,减少了CPU资源的消耗 缺点:大量的过期数据滞留在内存中,需要被主动触发、检查、删除,否则会一直占用内存资源。 2、定期删除:每隔一段时间,默认100ms,Redis会随机挑选一定数量的Key,检查是否过期,并将过期的数据删除。
那你可能又要犯病了,既然Redis有过期的数据删除策略,为什么还会拉到已经过期的数据
这就要从主从同步开始讲起了,我们先来看看这张流程图:
当客户端往主库写入数据后,并设置了过期时间,数据会以异步方式同步给从库。
1、如果此时读主库,数据已经过期,主库的惰性删除会发挥作用,主动触发删除操作,客户端不会拿到已过期数据
2、但是如果读从库,则有可能拿到过期数据。原因有两个
原因一:
跟 Redis 的版本有关系,Redis 3.2 之前版本,读从库并不会判断数据是否过期,所以有可能返回过期数据。
解决方案:
升级Redis的版本,至少要3.2 以上版本,读从库,如果数据已经过期,则会过滤并返回空值。
特别注意:
此时同步过来的数据,虽然已经过期,但本着谁生产谁维护的原则,从库并不会主动删除同步的数据,需要依赖于主节点同步过来的key删除命令。
原因二:
跟过期时间的设置方式有关系,我们一般采用 EXPIRE 和 PEXPIRE,表示从执行命令那个时刻开始,往后延长 ttl 时间。严重依赖于 开始时间 从什么时候算起。
EXPIRE:单位为秒
PEXPIRE:单位为毫秒
如上图所示,简单描述下过程:
- 主库在 t1 时刻写入一个带过期时间的数据,数据的有效期一直到 t3
- 由于网络原因、或者缓存服务器的执行效率,从库的命令并没有立即执行。一直等到了 t2 才开始执行, 数据的有效期则会延后到 t5
- 如果,此时客户端访问从库,发现数据依然处于有效期内,可以正常使用
解决方案:
可以采用Redis的另外两个命令,EXPIREAT 和 PEXPIREAT,相对简单,表示过期时间为一个具体的时间点。避免了对开始时间从什么时候算起的依赖。
EXPIREAT:单位为秒
PEXPIREAT:单位为毫秒
特别注意:
EXPIREAT 和 PEXPIREAT 设置的是时间点,所以要求主从节点的时钟保持一致,需要与NTP 时间服务器保持时钟同步。
主从同步,除了读从库可能拉取到过期数据,还可能遇到数据一致性问题。
那咋们继续往下在研究研究
- 主从数据不一致
解释下,什么是主从数据不一致?指客户端从库中读取到的值与主库中读取的值不一致!
如图所示:
- 客户端写入主库,值为100 然后,
- 主库将值100 同步给 从库
- 接着,客户端又访问主库,将值更新为 200
- 由于主从同步是异步进行的,有一定延迟,假如最新数据还没有同步到从库,那么从库读取的就不是最新值。
从库同步落后的原因主要有两个:
1、主从服务器间的网络传输可能有延迟
2、从库已经收到主库的命令,由于是单线程执行,前面正在处理一些耗时的命令(如:pipeline批处理),无法及时同步执行。
解决方案:
1、主从服务器尽量部署在同一个机房,并保持服务器间的网络良好通畅
2、监控主从库间的同步进度,通过info replication命令 ,查看主库接收写命令的进度信息(master_repl_offset),从库的复制写命令的进度信息(slave_repl_offset)
master_repl_offset - slave_repl_offset
得到从库与主库间的复制进度差
我们可以开发一个监控程序,定时拉取主从服务器的进度信息,计算进度差值。如果超过我们设置的阈值,则通知客户端断开从库的连接,全部访问主库,一定程度上减少数据不一致情况。
待同步进度跟上后,我们再恢复客户端与从节点的读操作。
Redis的Key过期问题处理相关推荐
- 面试官:Redis的key过期之后是立即删除吗
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到网站. 文章目录 过期策略 三种过期策略优缺点对比 从节点的的key过期 内存淘汰策略 maxmemory ...
- redis expire key 过期不删除
1. 问题描述 今天使用 redis 遇到个奇怪的问题,key 设置过期时间后,到期后并没有删除. 语句过程大概如下: 127.0.0.1:6379> SET hello 0 OK 127.0. ...
- redis 超时key过期监听
1.修改redis配置 过期事件通过Redis的订阅与发布功能(pub/sub)来进行分发. 而对超时的监听呢,并不需要自己发布,只有修改配置文件redis.conf中的:notify-keyspac ...
- Redis[5] key的过期时间删除策略、实现lru算法、持久化配置
文章目录 Redis[5] key的过期时间删除策略.持久化配置 **Redis6的key过期时间删除策略** Redis服务器实际使用的是惰性删除和定期删除两种策略:通过配合使用这两种删除策略,服务 ...
- Redis关于key的操作(删除、过期、持久化...)
本人最近刚刚接触Redis,也算是作为学习笔记写下这篇博客,如果有错的地方还请大家多多包涵和指正. 关于Redis的安装,这里就不赘述了,网上有很多资料可以借鉴. 1.Redis设置密码 config ...
- c# redis hashid如何设置过期时间_Redis中Key过期策略amp;淘汰机制
1. Redis中设置Key过期时间 我们有两种方式设置过期时间 1.1 设置多久后过期 设置一个 key 10s 过期,可以这样 127.0.0.1:6379> SET key value E ...
- java redis 数据自过期_Java架构-Redis的内存回收策略和Key过期策略,看这篇就够了...
Redis 作为当下最热门的 Key-Value 存储系统,在大大小小的系统中都扮演着重要的角色,不管是 session 存储还是热点数据的缓存,亦或是其他场景,我们都会使用到 Redis.在生产环境 ...
- redis查看key的过期时间_面试官:你在Redis中设置过带过期时间的Key吗?
点击上方小伟后端笔记关注公众号 每天阅读Java干货文章 熟悉Redis的同学应该知道,Redis的每个Key都可以设置一个过期时间,当达到过期时间的时候,这个key就会被自动删除. 在为key设置过 ...
- Redis Key过期及清除策略
>Key过期命令: 127.0.0.1:6379> EXPIRE name 10 # 设置key的过期时间,单位是秒 (integer) 1 127.0.0.1:6379> ttl ...
最新文章
- 成功解决安装cuda的时候,下载的文件自动消失,并且出现An unknown error has occurred
- 【STM32】ESP8266模块简介
- 暴雪帝国辉煌能否延续
- 为什么程序员的女朋友或老婆颜值普遍都偏高?
- EasyUI--权限管理(二)显示左侧菜单
- wrieshark 指令
- (41)VHDL实现移位寄存器(方法3)
- IIC 差异电平传输 和 IIC 地址
- 一个java写的贪吃蛇程序
- XStream使用总结
- 我的Java开发学习之旅------Java ClassLoader解析一(转)
- 负载均衡的的基本功能和实现原理
- MP4转AVI转AMV教程:教你把B站视频导入你的MP3MP4随身听播放器
- 空域、频域、时域的解释
- MATLAB学习笔记(二)——M文件
- java常用英语单词大全
- JavaScript随手笔记之--html拼接语句传递json数据
- CVE-2021-1647:Microsoft Defender远程代码执行漏洞通告
- 2020年高教社建模国赛真题B题--穿越沙漠
- oj. 1008——最长公共子序列