众所周知Redis针对每一个key都能单独设置过期时间,那么Redis是怎么处理这些key的过期时间的呢?当同一时间有大量Key同时到期时,Redis又是怎么处理的呢?会不会影响到我的线上业务呢?如果Redis存储数据超出物理限制了,又是怎么处理的呢?本文将详细为你介绍Redis的过期&淘汰策略。

过期策略

首先针对每一个设置了过期时间的key,Redis都会将其放入一个统一的字典中进行管理。具体管理策略分为以下两种:

定时扫描策略:Redis会定时扫描存储含有过期时间key字典,遍历删除已经过期的key。

惰性删除策略:当客Redis读一个key的,Redis首先会校验key的过期时间,如果已经过期,将会对其进行过期删除操作。

定时扫描策略

Redis会对设置了过期时间的key字典定时进行一次过期扫描,扫描采取的是贪心策略,具体实现如下:

  1. 从过期字典中随机挑选一批key(有说20个的);
  2. 遍历这一批key,并删除已经过期的key;
  3. 如果过期的key超过一定比例(有说1/4的),重复步骤1。

当有大量key同时过期时,将会导致Redis重复执行扫描并删除的任务,这将导致Redis的读写请求出现延迟、阻塞的现象。所以要尽量避免大批量key同时过期的情况,如果存在大批量的过期key,最好在目标过期时间上,设置一个合理的随机时间范围。

惰性过期策略

从定时扫描策略的实现步骤中,我们可以看到,其实内存中还可能存在已经过期的key。这时为了解决这一问题,Redis引入了惰性过期这一策略,通过在取值的时候做过期校验,删除过期key,这样能保证每一个key的有效性,避免了脏数据的产生。

从节点过期策略

为了保证主从数据一致性,Redis从节点不会执行定扫扫描策略去主动删除key。但是主节点在删除过期key的时候,会向主节点的AOF日志文件添加一条del操作指令,随后将该指令同步到从节点,从节点通过执行del指令以此来达到删除从节点过期key的目的。

淘汰策略

当Redis内存的使用达到限制时,Redis会将多余的key写入到磁盘中,然后从磁盘中读取key进行操作,这样无疑就加大了IO开销。为了避免这一问题,Redis也提供了几种数据淘汰策略供我们选择:

  1. noeviction:阻塞写请求,其他请求可用
  2. volatile-lru:淘汰过期key集合中,最少被使用的key
  3. volatile-ttl:淘汰过期key集合中,ttl最小的key
  4. volatile-random:淘汰过期key集合中,随机key
  5. allkeys-lru:淘汰所有key中,最少被使用key
  6. allkeys-random:淘汰所有key中,随机key

删除策略

我们知道Redis在key过期时候会删除过期key,在淘汰key的时候也会删除key。但是具体是怎么删除的呢?

直接删除

通过del指令直接,可以直接删除指定key,并释放key相关的对象。

懒删除

在大部分情况下del指定都是很快的,但是当需要删除一个很大的key对象是,del指令就会产生明显延迟,导致线程卡顿。所以需要使用unlink指令对其进行懒删除。

理解unlink其实可以将整个Redis看做一个链表(当然Redis并不是链表,此处只是为了方便理解unlink)。当执行unlink的时候,会将该key所在的对象从链表中移除。等待Redis的异步线程来进行内存释放。

Redis内部并不是只有一个主线程,还有其他异步线程,通常我们所说的Redis是单线程,指的是其网络请求模块为单线程,即一个线程处理所有网络请求。所以在非特指的情况下,Redis是还是单线程。

Redis系列推荐

Redis02——Redis内存数据如何保存到磁盘

Redis01——Redis究竟支持哪些数据结构

Redis03——Redis是如何删除你的数据的的更多相关文章

  1. python操作三大主流数据库(14)python操作redis之新闻项目实战②新闻数据的展示及修改、删除操作

    python操作三大主流数据库(14)python操作redis之新闻项目实战②新闻数据的展示及修改.删除操作 项目目录: ├── flask_redis_news.py ├── forms.py ├ ...

  2. Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南)

    作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9941208.html 主讲人:大石头 时间:2018-11-10 晚上20:00 地点:钉钉群(组织代码 ...

  3. 向redis中添加删除list列表

    转: 向redis中添加删除list列表 2018年04月18日 15:44:54 luo_yu_1106 阅读数:4082   一.添加 向redis中添加队列有两种方式 1.lpush l是lef ...

  4. Redis批量查询删除KEYS

    对腾讯云的Redis集群不支持很多指令(config get * .flushdb.flushall.等相关指令) redis指令限制:https://www.qcloud.com/document/ ...

  5. [翻译] C# 8.0 新特性 Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南) 【由浅至深】redis 实现发布订阅的几种方式 .NET Core开发者的福音之玩转Redis的又一傻瓜式神器推荐

    [翻译] C# 8.0 新特性 2018-11-13 17:04 by Rwing, 1179 阅读, 24 评论, 收藏, 编辑 原文: Building C# 8.0[译注:原文主标题如此,但内容 ...

  6. Redis生存时间、删除策略和排序

    生存时间 设置命令 expire key long:设置数据在long秒后过期. pexpire key long:设置数据在long毫秒后过期. ttl key:查询数据剩余的生存时间.如果数据已过 ...

  7. redis cluster 添加/删除节点操作

    RedisCluster 添加/删除节点 添加节点新配置两个测试节点8008和9009 [root@--- ~]# /usr/local/redis-/bin/redis-server /u02/re ...

  8. Redis的过期删除策略(和内存淘汰机制)-转

    版权声明:本文为CSDN博主「奥修诺斯」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/qq_39944869/ ...

  9. 基于内存,redis,mysql的高速游戏数据服务器设计架构

    转载请注明出处,欢迎大家批评指正 1.数据服务器详细设计 数据服务器在设计上采用三个层次的数据同步,实现玩家数据的高速获取和修改. 数据层次上分为:内存数据,redis数据,mysql数据 设计目的: ...

随机推荐

  1. 推荐几个树莓派 raspbian 系统 可用的 arm docker源

    树莓派刚到手各种尝鲜,试过不少系统,最后还是回归了raspbian os 系统 root@raspberrypi:/home/pi# cat /proc/version Linux version 4 ...

  2. python数据类型:Number数字

    Python Number数据类型用于存储数值 数据类型是不允许改变的,如果改变Number数据类型的值,将从新分配内存空间 整型(int):整型或整数,是正或者负整数,不带小数点 长整型(long) ...

  3. LeetCode Day 9

    LeetCode0017 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23&q ...

  4. jmeter常用定时器以及事物控制器

    定时器(并发):Synchronizing Timer 事物控制器: 勾选Generate parent sample当单看主要数据和页面数据性能测试结果还是有比较大的差异的,因而在进行页面性能测试的 ...

  5. PP图|QQ图|正态性检验|K-S检验|S-W检验|

    应用统计学: 物理条件一致时,有理由认为方差是一致的.配对检验可排除物理影响,使方差变小,但是自由度降低了,即样本数变小.二项分布均值假设检验的模型要依据前面的假设条件: PP图统计图要看中间的贴近情 ...

  6. the way of hardware design study

    1.器件 主要分类 1.MCU2.DSP3.FPGA4.Embedded5.System on Chip MCU MCU俗称单片机,通常无操作系统,用于简单的控制,如电梯,空调等. DSP DSP叫做 ...

  7. 第一次安装vs2010无法运行程序,系统找不到exe文件,LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

    最近在看数据结构的一些书籍,怎奈代码是c写的,所以安装一个编译器vs2010来测试代码,但是建完文件后编译ok,f5却出现错误:无法启动程序,系统找不到指定文件.上网找了一些解决办法,但是仍然无法解决 ...

  8. idea如何打包项目(java)

    1.右击项目打开open module settings 2.依次打开 3.选择你的程序主入口 JAR files from libraies ①和设置库中的jar文件选择第一个打包时会把依赖库(li ...

  9. JAVA学习大纲

    1.第一节 JAVA概念与JDK的安装 (1)JDK的安装和环境变量的设置: (2)相关基本概念:JDK.SDK.JRE.JVM.J2SE.J2EE.J2ME.java API.JAVA语言特点: ( ...

  10. Python-添加psutil模块到python2.7版本

    一.问题描述 1.导入模块psutil时提示报错:ImportError: No module named psutil 2.下载psutil模块后,安装python setup.py install ...