redis过期策略

2023-10-29

    我们使用redis的时候一般会设置过期时间;

    redis设置过期时间:

    expire 只针对顶级key有效,即哈希结构不支持过期(value为hash结构的时候,不能对hash中的某一部分进行过期设置);

    expire key time(以秒为单位)--这是最常用的方式;

    setex(String key, int seconds, String value)--字符串独有的方式  ;

    拓展:

    1. 除了字符串自己独有设置过期时间的方法外,其他方法都需要依靠expire方法来设置时间

    2. 如果没有设置过期时间,那缓存就是永不过期

    3. 如果设置了过期时间,之后又想让缓存永不过期,使用persist key

 

    当设置了过期时间,redis是如何判断是否过期,以及根据什么策略来进行删除的?redis一般通过三种策略来实现过期删除;

删除策略总结:

(1)定时删除:在设置key的过期时间的同时,为该key创建一个定时器,在时间到了时候,服务器立刻对键进行删除;

  • 过期键能尽可能被删除,并释放内存(内存可以被尽快释放);
  • 在过期键比较多的情况下,删除操作可能会占用一部分CPU时间。当内存不紧张而CPU非常紧张的情况下,会对服务器响应时间和吞吐量造成影响;
  • 定时器的创建耗时,若为每一个设置过期时间的key创建一个定时器(将会有大量的定时器产生),性能影响严重;

       注:当大量请求等待服务器处理时,服务器应该优先处理请求而不是删除过期键。另外,创建定时器需要用到时间事件(由无序链表实现),以至于查找一个事件的时间复杂度为O(N),并不能高效的处理大量时间事件;

(2)惰性删除:每次从键空间获取键时(每次通过key获取值的时候),都检查是否过期,过期则删除并返回null,未过期,则返回该键;

  • 只有取出键时才对其进行过期检查,不会删除其他键,不会花费CPU太多时间。若一个键早已过期,但一直未被取到,它便会一直占用内存。若有大量的未被访问的键,而服务器又不会主动释放,就会造成大量的内存浪费。

(3)定期删除:每隔一段时间删除里面的过期键;

  • 每隔一段时间删除过期键,减少了对cpu占用时间的影响;
  • 也有效的减少了过期键过多而造成的内存浪费;
  • 删除操作执行的时长和频率。既不能太频繁也不能太稀疏,需合理设置;

 

注释:memcached只是用了惰性删除,而redis同时使用了惰性删除与定期删除,这也是二者的一个不同点(可以视为redis优于memcached的一点);

对于惰性删除而言,并不是只有获取key的时候才会检查key是否过期,在某些设置key的方法上也会检查

(eg.setnx key2 value2:该方法类似于memcached的add方法,如果设置的key2已经存在,那么该方法返回false,什么都不做;如果设置的key2不存在,那么该方法设置缓存key2-value2。假设调用此方法的时候,发现redis中已经存在了key2,但是该key2已经过期了,如果此时不执行删除操作的话,setnx方法将会直接返回false,也就是说此时并没有重新设置key2-value2成功,所以对于一定要在setnx执行之前,对key2进行过期检查)。

 

Redis采用的过期策略:

       惰性删除+定期删除

       惰性删除流程:

  • 在进行get或setnx等操作时,先检查key是否过期;
  • 若过期,删除key,然后执行相应操作;
  •  若没过期,直接执行相应操作;

        定期删除流程(简单而言,对指定个数个库的每一个库随机删除小于等于指定个数个过期key):

  • 遍历每个数据库(就是redis.conf中配置的"database"数量,默认为16)
  • 检查当前库中的指定个数个key(默认是每个库检查20个key,注意相当于该循环执行20次,循环体是下边的描述)
  • 如果当前库中没有一个key设置了过期时间,直接执行下一个库的遍历
  • 随机获取一个设置了过期时间的key,检查该key是否过期,如果过期,删除key
  • 判断定期删除操作是否已经达到指定时长,若已经达到,直接退出定期删除。

 

    对于定期删除,在程序中有一个全局变量current_db来记录下一个将要遍历的库,假设有16个库,我们这一次定期删除遍历了10个,那此时的current_db就是11,下一次定期删除就从第11个库开始遍历,假设current_db等于15了,那么之后遍历就再从0号库开始(此时current_db==0)

 

    在实际中,如果我们要自己设计过期策略,在使用惰性删除+定期删除时,控制时长和频率这个尤为关键,需要结合服务器性能,已经过并发量等情况进行调整,以致最佳。

 

redis中的过期键设置命令:

  • SETEX命令:在设置一个字符串的同时为键设置过期时间,只针对数据类型为String的K-V。
  • TTL和PTTL命令:接受一个带生存时间或者过期时间的键,返回这个键的剩余时间。
  • EXPIRE<key><ttl> :将key生存时间设置为ttl秒。
  • PEXPIRE<key><ttl>:将key生存时间设置为ttl毫秒。
  • EXPIREAT<key><timestamp> :将键key的过期时间设置为timestamp所指定的秒数时间戳;
  • PEXPIREAT<key><timestamp>: 将键key的过期时间设置为timestamp所指定的豪秒数时间戳;

redis定期删除策略详述:

    过期键的定期删除策略由redis.c/activeExpireCycle函数实现 ;

  • 函数每次运行时,都从一定数量的数据库(redis)中取出一定数量的随机键检查,并删除过期键;
  • 全局变量current_db会记录当前函数的检查进度,在下一次调用时,接着上次的进度处理。如果当前函数遍历10号(redis)数据库返回了,下次就会从11号开始;
  • 随着函数的执行,所有数据库都被检查一遍后,全局变量current_db会置为0,然后重新开始;

复制功能下如何处理:

    主从复制模式下,过期键的删除由主服务器控制;

  • 主服务删除一个过期键后,会显示的向从服务器发送DEL命令,告知删除该键;
  • 从服务器只有接收到主服务器发送来的DEL命令,才会删除过期键。否则不会删除,并且像正常键一样处理;保持数据的一致性;

RDB和AOF时如何处理过期键:

RDB 

  • 以主服务器模式运行,在载入RDB文件时,未过期的键才会被载入,过期键被忽略;
  • 以从服务器模式运行,所有键都将载入;

AOF写入

  • 若某键已过期,程序会向AOF文件追加一条DEL,来显示删除;

AOF重写

  • 已过期的键不会保存到重写的AOF文件中;

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

redis过期策略 的相关文章

随机推荐

  • 基于Numpy构建RNN模块并进行实例应用(附代码)

    文章目录 一 写在前面 二 RNN原理介绍说明 1 RNN架构说明 2 RNN的数学模型及代码 正向传播 输入层 隐藏层 正向传播 隐藏层 输出层 反向传播 输出层 隐藏层 反向传播 隐藏层 输入层 三 RNN在实例中的应用 1 实例问题说
  • 【QT】图形化页面设计

    可视化的图形化界面共有三种设计方式 一种是通过可视化来设计界面的方式 一种是代码化的设计方式 最后是混合上面两种的混合界面设计方式 目前我们只考虑通过Designer和代码来设计图形化页面的两种方式 目录 可视化图形界面设计 图形页面设计
  • 算法小白的自我总结

    2018年10月26号 觉得该把这段时间做一下总结了 大概包括心理变化方面 找工作方面吧 csdn为什么没有表情可以用 并且终于在上线新版之后变得没有那么多bug了 快捷键也能用了 界面看起来还可以 为什么把标志性的红色不见了 红色变成了蓝
  • 使用jquery对输入框内容设置自动校验,只允许数字的输入

    目的 对input输入框的内容进行校验 js的方法 keyup 对键盘的进行监控的事件 正则表达式 d g 原理 就是在输入框添加一个 触发事件 对输入框的内容进行判断 过程遇到问题 js和jquery获取值的方法 value是js获取值的
  • 2021-04-28 Mac上插入公式的三种方法

    文章目录 在线方案 自带的Pages更好用 KLatexformular 在线方案 很多网站可以在线编辑 然后下载图片 给一个我用的链接 https latex codecogs com legacy eqneditor editor ph
  • 整型数据在内存中的存储方式大解密

    提示 先赞后看 养成习惯 文章目录 前言 一 原码 反码 补码 二 体验 存 数据的过程 小小的总结一下 三 体验 取 数据的过程 什么是大小端 如何验证一个机器是大端还是小端的存储模式呢 为什么会有大小端之分呢 取 数据 整型数据范围 前
  • 时序预测

    时序预测 Matlab实现SO CNN GRU蛇群算法优化卷积门控循环单元时间序列预测 目录 时序预测 Matlab实现SO CNN GRU蛇群算法优化卷积门控循环单元时间序列预测 预测效果 基本介绍 程序设计 参考资料 预测效果 基本介绍
  • 获取application.yml文件中配置参数的两个方法

    application yml文件内容 第一种 适用于获取少量配置参数 Value man name private String name 第二种 适用于获取大批量配置参数 第一步 整合pom xml文件
  • 操作系统的调度基础

    操作系统的cpu调度 把内核线程当成内核中的一个进程去理解 任务系统的三个核心特征是 权限分级 数据隔离和任务切换 以X86 64架构为例 权限分级通过CPU的多模式机制和分段机制实现 数据隔离通过分页机制实现 任务切换通过中断机制和任务机
  • Java类与接口、类与类之间的六种关系及UML表示

    转自点击打开链接 一 继承关系 继承指的是一个类 称为子类 子接口 继承另外的一个类 父类 父接口 的功能 并可以增加它自己的新功能的能力 在java中继承关系通过关键字extends明确标识 在设计时一般没有争议性 在UML类图设计中 继
  • 10款炫酷的HTML5动画特效,附源码

    HTML5确实非常强大 很多时候我们可以利用HTML5中的新技术实现非常炫酷效果时 这些效果也非常消耗电脑的CPU 但是这些HTML5效果确实能给用户带来不一样的用户体验 今天我要跟大家分享一些HTML5实现的惊艳特效 希望你可以喜欢 1
  • Docker运行容器端口映射

    大致描述 我发现docker启动容器时 以redis为例 在已经启动了一个 p 6379 6379的redis1容器后 当我们开启第二个redis2容器时 右边的端口映射既可以写别的我们想要映射的端口 p 6380 6380 redis2
  • 如何初始化使用中断

    概念 中断向量 中断服务程序的入口地址 首地址 中断向量表 系统中RAM或ROM的一个区域 用于存储各种中断向量的首地址 其大小取决于CPU支持的中断类型和数量 中断优先级 多个中断源同时向CPU申请中断 为了能够有序地处理多个中断申请所以
  • 感悟2022年:玫琳凯公布今年上半年以来的奖项、里程碑和成就

    玫琳凯公司获得30个奖项 其中包括10个雇主奖 凭借卓越的商业表现 社会影响 倡导参与和可持续发展努力而获得认可 玫琳凯公司 Mary Kay Inc 正在感悟2022年的成就 今年上半年 这家标志性的全球创业公司进一步推进皮肤科学创新 继
  • RxODE 包的使用 (CPT tutorial paper part 1)

    本文基于tutorial paper Wang W Hallow KM James DA A Tutorial on RxODE Simulating Differential Equation Pharmacometric Models
  • MIPI-DSI 三种 Video Mode 理解

    D PHY的物理层支持HS High Speed 和LP Low Power 两种工作模式 HS模式 低压查分信号 功耗大 高速率 80M 1Gbps 信号幅值 100mv 300mv LP模式 单端信号 功耗小 速率低 lt 10Mbps
  • QTableWidget详细使用示例(里面有QMenu实现多级菜单的方法)

    目录 一 创建行表头 二 往表格里插入单元项 带图片和不带图片 三 禁止表格可编辑 四 按行或列或单个选择单元项 五 设置列宽 包括列表头的和行表头的 1 这个普通的行和列都可以设置固定宽高 2 还可以将行和列的大小设为与内容相匹配 3 不
  • 《信号与系统》解读 第1章 信号与系统概述-2:时域信号的分类--确定性信号、离散信号、周期信号、线性信号、基本信号与复合信号

    目录 1 确定性信号与随机信号 2 连续信号与离散信号 3 周期信号与非周期信号 4 线性信号与非线性信号 5 基本信号与复合信号 5 1 单位阶跃信号 基本的数字信号 5 2 单位斜变信号 基本的数字积分 5 3 自然指数信号 信号的自然
  • Python 数据分析实战案例:基于电商销售数据的 RFM 模型构建

    目录 1 背景 2 分析目标 3 数据准备 4 数据清洗 4 1 查看是否含有缺失值 4 2 查看是否有异常值 4 3 数据整理 5 具体目标分析 5 1 分析每年销售额的增长率 5 2 各个地区分店的销售额 5 3 销售淡旺季分析 5 4
  • redis过期策略

    我们使用redis的时候一般会设置过期时间 redis设置过期时间 expire 只针对顶级key有效 即哈希结构不支持过期 value为hash结构的时候 不能对hash中的某一部分进行过期设置 expire key time 以秒为单位