redis过期策略和持久化

article/2025/9/14 8:34:22
Redis过期策略

注:本文主要参考自《Redis设计与实现》

1、设置过期时间

  • expire key time(以秒为单位)--这是最常用的方式
  • setex(String key, int seconds, String value)--字符串独有的方式

具体的使用方式:查看"java企业项目开发实践"的第九章 企业项目开发--分布式缓存Redis(1)和第十章 企业项目开发--分布式缓存Redis(2)

注意

  • 除了字符串自己独有设置过期时间的方法外,其他方法都需要依靠expire方法来设置时间
  • 如果没有设置时间,那缓存就是永不过期
  • 如果设置了过期时间,之后又想让缓存永不过期,使用persist key

 

2、三种过期策略

  • 定时删除
    • 含义:在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除
    • 优点:保证内存被尽快释放
    • 缺点:
      • 若过期key很多,删除这些key会占用很多的CPU时间,在CPU时间紧张的情况下,CPU不能把所有的时间用来做要紧的事儿,还需要去花时间删除这些key
      • 定时器的创建耗时,若为每一个设置过期时间的key创建一个定时器(将会有大量的定时器产生),性能影响严重
      • 没人用
  • 惰性删除
    • 含义:key过期的时候不删除,每次从数据库获取key的时候去检查是否过期,若过期,则删除,返回null。
    • 优点:删除操作只发生在从数据库取出key的时候发生,而且只删除当前key,所以对CPU时间的占用是比较少的,而且此时的删除是已经到了非做不可的地步(如果此时还不删除的话,我们就会获取到了已经过期的key了)
    • 缺点:若大量的key在超出超时时间后,很久一段时间内,都没有被获取过,那么可能发生内存泄露(无用的垃圾占用了大量的内存)
  • 定期删除
    • 含义:每隔一段时间执行一次删除过期key操作
    • 优点:
      • 通过限制删除操作的时长和频率,来减少删除操作对CPU时间的占用--处理"定时删除"的缺点
      • 定期删除过期key--处理"惰性删除"的缺点
    • 缺点
      • 在内存友好方面,不如"定时删除"
      • 在CPU时间友好方面,不如"惰性删除"
    • 难点
      • 合理设置删除操作的执行时长(每次删除执行多长时间)和执行频率(每隔多长时间做一次删除)(这个要根据服务器运行情况来定了)

注意

  • 上边所说的数据库指的是内存数据库,默认情况下每一台redis服务器有16个数据库(关于数据库的设置,看下边代码),默认使用0号数据库,所有的操作都是对0号数据库的操作,关于redis数据库的存储结构,查看 第八章 Redis数据库结构与读写原理
      View Code
  • 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进行过期检查)

 

3、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)
  • 由于在实际中并没有操作过定期删除的时长和频率,所以这两个值的设置方式作为疑问?

 

4、RDB对过期key的处理

过期key对RDB没有任何影响

  • 从内存数据库持久化数据到RDB文件
    • 持久化key之前,会检查是否过期,过期的key不进入RDB文件
  • 从RDB文件恢复数据到内存数据库
    • 数据载入数据库之前,会对key先进行过期检查,如果过期,不导入数据库(主库情况)

 

5、AOF对过期key的处理

过期key对AOF没有任何影响

  • 从内存数据库持久化数据到AOF文件:
    • 当key过期后,还没有被删除,此时进行执行持久化操作(该key是不会进入aof文件的,因为没有发生修改命令)
    • 当key过期后,在发生删除操作时,程序会向aof文件追加一条del命令(在将来的以aof文件恢复数据的时候该过期的键就会被删掉)
  • AOF重写
    • 重写时,会先判断key是否过期,已过期的key不会重写到aof文件 

http://chatgpt.dhexx.cn/article/POpPdUCu.shtml

相关文章

redis之十一(Redis 过期策略与源码分析)

在 Redis 中我们可以给一些元素设置过期时间,那当它过期之后 Redis 是如何处理这些过期键呢? 过期键执行流程 Redis 之所以能知道那些键值过期,是因为在 Redis 中维护了一个字典,存储了所有设置了过期时间的键值,我们…

Redis过期策略 实现原理

https://blog.csdn.net/xiangnan129/article/details/54928672 https://www.cnblogs.com/zhangchao-letv/p/6114030.html#undefined 1、redis设置过期时间: expire key time(以秒为单位)--这是最常用的方式 setex(String key, int seconds, String value)--字符串…

redis过期策略有哪些?内存淘汰机制有哪些?

文章目录 前言过期策略:定期删除惰性删除redis中的key和数据过期后,为什么内存空间还没有释放呢? 定期删除惰性删除 如果内存空间将要满的时候该怎么办呢?设置过期时间的key中所有的key中 小结 前言 小咸儿的项目中使用redis来做缓…

redis过期策略及持久化机制

文章目录 一、Redis设置过期时间二、Redis的过期策略1、定时过期2、惰性过期3、定期过期 三、Redis的8种内存淘汰策略LRU与LFU 四、Redis 的持久化机制1、RDB快照持久化(redis默认)2、AOF追加文件持久化3、AOF和RDB都开启 一、Redis设置过期时间 Redis有…

Redis过期删除策略和内存淘汰策略

目录 一、过期删除策略 1、如何设置过期时间? 2、如何判定 key 已过期了? 3、过期删除策略有哪些? 1、定时删除策略 2、惰性删除策略 3、定期删除策略 4、Redis 过期删除策略 5、Redis 是怎么实现定期删除 1、这个间隔检查的时间是…

Redis过期策略与淘汰策略

redis为什么这么快,原因之一就是Redis操作都是基于内存的,既然是基于内存的,而内存的大小是有限的,当内存不足或占用过高时,Redis会采用内存淘汰机制进行数据淘汰。 一、Redis的过期策略 Redis在设置缓存数据时指定了…

Redis过期策略及内存淘汰机制

redis中缓存的数据是有过期时间的,当缓存数据失效时,redis会删除过期时间以节省内存,那redis是如何删除过期数据的?删除过期数据的策略是什么?Redis过期策略是怎么样的? redis为什么这么快,原因…

Redis过期策略详解

为什么要有过期策略&#xff1f; 因为我们的redis是一个内存型数据库&#xff0c;我们的数据都是放在内存里面的!但是内存是有大小的! 比如&#xff0c;redis有个很重要的配置文件&#xff0c;redis.conf&#xff0c;里面有个配置 # maxmemory <bytes> //redis占用的最…

Redis过期策略以及内存淘汰机制

redis所以的操作都是基于内存的&#xff0c;而每台机器的内存大小都有限制&#xff0c;且全没有磁盘空间那么大&#xff0c;所以如何高效的使用内存对于redis来说是非常关键的。 一、Redis过期策略 如果我们一直往redis中存储数据的话&#xff0c;总会有占满内存的那一刻&…

redis过期策略和内存淘汰机制

Redis的过期策略 1 定时过期 每个设置过期时间的key都需要创建一个定时器&#xff0c;到过期时间就会立即清除。该策略可以立即清除过期的数据&#xff0c;对内存很友好&#xff1b;但是会占用大量的CPU资源去处理过期的数据&#xff0c;从而影响缓存的响应时间和吞吐量。 2…

Redis 过期策略+conf 记录

一&#xff1a;redis的过期策略 三种过期键删除策略 1&#xff09;定时删除&#xff1a;创建一个定时器&#xff0c;到时间立即执行删除操作&#xff08;对内存友好&#xff0c;因为能保证过期了立马删除&#xff0c;但是对cpu不友好&#xff09; 2&#xff09;惰性删除&…

Redis之过期策略

一、设置过期时间 Redis对存储值的过期处理实际上是针对该值的键&#xff08;key&#xff09;处理的&#xff0c;即时间的设置也是设置key的有效时间。Expires字典保存了所有键的过期时间&#xff0c;Expires也被称为过期字段。 expire key time(以秒为单位)--这是最常用的方式…

redis的过期策略【转】

转&#xff1a;Redis的过期策略以及内存淘汰机制_Felix-CSDN博客_redis过期策略和内存淘汰机制 我们知道&#xff0c;redis中缓存的数据是有过期时间的&#xff0c;当缓存数据失效时&#xff0c;redis会删除过期数据以节省内存&#xff0c;那redis是怎样删除过期数据的&#xf…

主成分分析;主成分回归分析——Hald水泥问题;主成分分析案例——各地区普通高等教育发展水平综合评价;matlab

目的 对原变量加以“改造”&#xff0c;在不致损失原变量太多信息的条件下尽可能地降低变量地维数&#xff0c;即用较少的“新变量”代替原来地各变量。通过变换&#xff1a;用低维&#xff08;主成分&#xff09;近似高维&#xff08;较全面&#xff09;信息。 思想 若有二维…

hadoopHA

一、HA介绍 HA(High Available), 高可用&#xff0c;是保证业务连续性的有效解决方案&#xff0c;一般有两个或两个以上的节点&#xff0c;分为活动节点&#xff08;Active&#xff09;及备用节点&#xff08;Standby&#xff09;。 hadoop2.x之后Clouera提出了QJM/Qurom Jou…

AIDL 和 HIDL

AIDL概述 aidl是常用的android IPC方式&#xff0c;本文将根据一个demo来解析下AIDL的原理。 为了便于读者理解&#xff0c;本文不会探究Binder的实现细节&#xff0c;可以认为Binder在此文的分析中被看做是一个“黑盒”。 有一定经验的读者可以直接到文末看总结&#xff0c;最…

Linux守护进程HALD

hal&#xff08;hardware abstract lever&#xff09;硬件抽象。 但是Linux的hal运行于用户空间作为一个daemon进程。监听一个socket接口。等待udev发来的通知。 udev为设备加载驱动&#xff0c;设备可用后&#xff0c;往往有udev的规则&#xff0c;让udev通知hald表示设备变动…

.har文件使用

背景 在做web开发的过程中, 查看http请求/响应是非常常见的操作. 有时可能有这样的需求: 将某次操作的请求/响应保存下来, 给别人看或者分析, 那你可能需要har文件. 另外你还需要Fiddler来查看har文件内容 操作截图 在"Network"面板中, 将某次操作的请求保存为har…

head 命令

转载&#xff1a;每天一个linux命令&#xff08;14&#xff09;&#xff1a;head 命令_weixin_33794672的博客-CSDN博客head 与 tail 就像它的名字一样的浅显易懂&#xff0c;它是用来显示开头或结尾某个数量的文字区块&#xff0c;head 用来显示档案的开头至标准输出中&#x…

颜色查找表LUT

查找表&#xff08;LUT&#xff0c;LookUp Table&#xff09;是图像颜色转换的强大工具&#xff0c;在许多图形和视频编辑器中使用。 2D LUT CLUT-from-images 2D LUT生成 def generate_identify_color_matrix(width, height, channel):img np.zeros((width, height, chan…