Redis主节点的Key已过期,但从节点依然读到过期数据

我们知道,大部分的业务场景都是读多写少,为了利用好这个特性,提升Redis集群系统的吞吐能力,通常会采用主从架构、读写分离

如上图所示:其中

  • Master节点:负责业务的写操作
  • Slave节点:实时同步Master节点的数据,提供读能力

为了提高吞吐量,采用一主多从的架构,将业务的读压力分摊到多个节点上

上述方案,看似非常合理,但其实可能存在一定的隐患!!!

  1. 拉取过期数据
    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 时间服务器保持时钟同步。

主从同步,除了读从库可能拉取到过期数据,还可能遇到数据一致性问题。

那咋们继续往下在研究研究

  1. 主从数据不一致

解释下,什么是主从数据不一致?指客户端从库中读取到的值与主库中读取的值不一致!


如图所示:

  • 客户端写入主库,值为100 然后,
  • 主库将值100 同步给 从库
  • 接着,客户端又访问主库,将值更新为 200
  • 由于主从同步是异步进行的,有一定延迟,假如最新数据还没有同步到从库,那么从库读取的就不是最新值。

从库同步落后的原因主要有两个:

1、主从服务器间的网络传输可能有延迟
2、从库已经收到主库的命令,由于是单线程执行,前面正在处理一些耗时的命令(如:pipeline批处理),无法及时同步执行。

解决方案:

1、主从服务器尽量部署在同一个机房,并保持服务器间的网络良好通畅

2、监控主从库间的同步进度,通过info replication命令 ,查看主库接收写命令的进度信息(master_repl_offset),从库的复制写命令的进度信息(slave_repl_offset)

master_repl_offset - slave_repl_offset
得到从库与主库间的复制进度差

我们可以开发一个监控程序,定时拉取主从服务器的进度信息,计算进度差值。如果超过我们设置的阈值,则通知客户端断开从库的连接,全部访问主库,一定程度上减少数据不一致情况。

待同步进度跟上后,我们再恢复客户端与从节点的读操作。

Redis的Key过期问题处理相关推荐

  1. 面试官:Redis的key过期之后是立即删除吗

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到网站. 文章目录 过期策略 三种过期策略优缺点对比 从节点的的key过期 内存淘汰策略 maxmemory ...

  2. redis expire key 过期不删除

    1. 问题描述 今天使用 redis 遇到个奇怪的问题,key 设置过期时间后,到期后并没有删除. 语句过程大概如下: 127.0.0.1:6379> SET hello 0 OK 127.0. ...

  3. redis 超时key过期监听

    1.修改redis配置 过期事件通过Redis的订阅与发布功能(pub/sub)来进行分发. 而对超时的监听呢,并不需要自己发布,只有修改配置文件redis.conf中的:notify-keyspac ...

  4. Redis[5] key的过期时间删除策略、实现lru算法、持久化配置

    文章目录 Redis[5] key的过期时间删除策略.持久化配置 **Redis6的key过期时间删除策略** Redis服务器实际使用的是惰性删除和定期删除两种策略:通过配合使用这两种删除策略,服务 ...

  5. Redis关于key的操作(删除、过期、持久化...)

    本人最近刚刚接触Redis,也算是作为学习笔记写下这篇博客,如果有错的地方还请大家多多包涵和指正. 关于Redis的安装,这里就不赘述了,网上有很多资料可以借鉴. 1.Redis设置密码 config ...

  6. c# redis hashid如何设置过期时间_Redis中Key过期策略amp;淘汰机制

    1. Redis中设置Key过期时间 我们有两种方式设置过期时间 1.1 设置多久后过期 设置一个 key 10s 过期,可以这样 127.0.0.1:6379> SET key value E ...

  7. java redis 数据自过期_Java架构-Redis的内存回收策略和Key过期策略,看这篇就够了...

    Redis 作为当下最热门的 Key-Value 存储系统,在大大小小的系统中都扮演着重要的角色,不管是 session 存储还是热点数据的缓存,亦或是其他场景,我们都会使用到 Redis.在生产环境 ...

  8. redis查看key的过期时间_面试官:你在Redis中设置过带过期时间的Key吗?

    点击上方小伟后端笔记关注公众号 每天阅读Java干货文章 熟悉Redis的同学应该知道,Redis的每个Key都可以设置一个过期时间,当达到过期时间的时候,这个key就会被自动删除. 在为key设置过 ...

  9. Redis Key过期及清除策略

    >Key过期命令: 127.0.0.1:6379> EXPIRE name 10 # 设置key的过期时间,单位是秒 (integer) 1 127.0.0.1:6379> ttl ...

最新文章

  1. 成功解决安装cuda的时候,下载的文件自动消失,并且出现An unknown error has occurred
  2. 【STM32】ESP8266模块简介
  3. 暴雪帝国辉煌能否延续
  4. 为什么程序员的女朋友或老婆颜值普遍都偏高?
  5. EasyUI--权限管理(二)显示左侧菜单
  6. wrieshark 指令
  7. (41)VHDL实现移位寄存器(方法3)
  8. IIC 差异电平传输 和 IIC 地址
  9. 一个java写的贪吃蛇程序
  10. XStream使用总结
  11. 我的Java开发学习之旅------Java ClassLoader解析一(转)
  12. 负载均衡的的基本功能和实现原理
  13. MP4转AVI转AMV教程:教你把B站视频导入你的MP3MP4随身听播放器
  14. 空域、频域、时域的解释
  15. MATLAB学习笔记(二)——M文件
  16. java常用英语单词大全
  17. JavaScript随手笔记之--html拼接语句传递json数据
  18. CVE-2021-1647:Microsoft Defender远程代码执行漏洞通告
  19. 2020年高教社建模国赛真题B题--穿越沙漠
  20. oj. 1008——最长公共子序列

热门文章

  1. 【神经网络实验】Numpy手写多层神经网络
  2. 趣图:单身时 vs 有女朋友后
  3. 客户真正想要的12件东西
  4. 实现网络连通检测的五种方法
  5. python连接Windows身份验证 SQL Server
  6. SQLServer汉字转全拼音函数
  7. origin绘制投影能带-颜色渐变图(color Mapped)
  8. 11-vue移动端项目(小智机器人聊天使用websocket协议使用socket.io客户端第三方包, 让div滚动条自动滚到最底部)
  9. adj_voc.pkl
  10. 手动杀毒专题(黑防VIP)