[转帖]Redis中Key的过期策略和淘汰机制

redis,key,过期,策略,淘汰,机制 · 浏览次数 : 0

小编点评

**Redis的Key 过期策略** | 策略 | 优点 | 缺点 | |---|---|---| | 定时删除 | 迅速删除过期的Key,节约内存。 | CPU时间不友好,性能影响。 | | 惰性删除 | 对CPU友好,可以最大限度的节约内存,但内存效率低下。 | 内存占用。 | | 定期删除 | 折中方案,可以根据性能需求调整策略。 | CPU时间和内存空间之间的权衡。 | **内存淘汰策略** * **volatile-lru:**从已设置过期时间的数据集中挑选最近最少使用的数据淘汰。 * **volatile-ttl:**从已设置过期时间的数据集中挑选将要过期的数据淘汰。 * **volatile-random:**从已设置过期时间的数据集中任意选择数据淘汰。 * **volatile-lfu:**从已设置过期时间的数据集中挑选使用频率最低的数据淘汰。 * **allkeys-lru:**从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰。 * **allkeys-lfu:**从数据集(server.db[i].dict)中挑选使用频率最低的数据淘汰。 * **allkeys-random:**从数据集(server.db[i].dict)中任意选择数据淘汰。 * **no-enviction:**禁止驱逐数据,当内存不足时,新写入操作会被报错。

正文

Key的过期策略

Redis的Key有3种过期删除策略,具体如下:

1. 定时删除

  • 原理:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作
  • 优点:能够很及时的删除过期的Key,能够最大限度的节约内存
  • 缺点:对CPU时间不友好,如果过期的Key比较多时,可能会占用相当一部分CPU时间,对服务器的响应时间和吞吐量造成影响

2. 惰性删除

  • 原理:在取出键时才对键进行过期检查,如果发现过期了就会被删除
  • 优点:对CPU友好,能够最大限度的节约CPU时间
  • 缺点:对内存不友好,过期的Key会占用内存,造成浪费

3. 定期删除

  • 原理:定期删除策略是定时删除策略和惰性删除策略的一个折中。定期删除策略每隔一段时间执行一次删除过期键的操作,并通过限制删除操作执行的时长频率来减少删除操作对CPU时间的影响
  • 优点:对CPU时间和内存空间的一种权衡,可以根据实际使用情况来调整删除操作执行的时长频率
  • 缺点:确定删除操作执行的时长频率很难。如果删除操作执行的太频繁,或者执行的时间太长,退化成定时删除策略;如果删除操作执行的太少,或者执行时间太短,退化成惰性删除策略

Redis服务器实际使用的是惰性删除和定期删除两种策略:通过配合使用这两种删除策略,服务器可以很好地在合理使用CPU时间和避免浪费内存空间之间取得平衡。Redis默认每隔100ms随机抽取一些设置了过期时间的key,检查是否过期,如果过期就删除。

内存淘汰机制

如果Redis服务器打开了maxmemory选项,并且服务器占用的内存数超过了maxmemory选项所设置的上限值时,会进行内存淘汰,常见的淘汰策略如下:

  • volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰

  • volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰

  • volatile-random:从已设置过期时间的数据集中任意选择数据淘汰

  • volatile-lfu:从已设置过期时间的数据集挑选使用频率最低的数据淘汰

  • allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰

  • allkeys-lfu:从数据集(server.db[i].dict)中挑选使用频率最低的数据淘汰

  • allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

  • no-enviction(驱逐):禁止驱逐数据,这也是默认策略。意思是当内存不足以容纳新入数据时,新写入操作就会报错,请求可以继续进行,线上任务也不能持续进行,采用no-enviction策略可以保证数据不被丢失。

文章知识点与官方知识档案匹配,可进一步学习相关知识
MySQL入门技能树数据库组成29703 人正在系统学习中

与[转帖]Redis中Key的过期策略和淘汰机制相似的内容:

[转帖]Redis中Key的过期策略和淘汰机制

Key的过期策略 Redis的Key有3种过期删除策略,具体如下: 1. 定时删除 原理:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作优点:能够很及时的删除过期的Key,能够最大限度的节约内存缺点:对CPU时间不友好,如果过期的Key比

[转帖]Redis系列(十七)、Redis中的内存淘汰策略和过期删除策略

我们知道Redis是分布式内存数据库,基于内存运行,可是有没有想过比较好的服务器内存也不过几百G,能存多少数据呢,当内存占用满了之后该怎么办呢?Redis的内存是否可以设置限制? 过期的key是怎么从内存中删除的?不要怕,本篇我们一起来看一下Redis的内存淘汰策略是如何释放内存的,以及过期的key

[转帖]5分钟学会这种更高效的Redis数据删除方式

https://ost.51cto.com/posts/12513 简述 我们知道,Del命令能删除数据,除此之外,数据在Redis中,还会以哪种方式被删除呢?在Redis内存满一定会返回OOM错误?Key到达过期时间就立即删除?删除大Key会影响性能吗?下面,咱们一起探讨。 同步和异步删除 1.D

[转帖]Redis Scan 原理解析与踩坑

https://www.cnblogs.com/jelly12345/p/16424080.html 1. 概述由于 Redis 是单线程在处理用户的命令,而 Keys 命令会一次性遍历所有 Key,于是在 命令执行过程中,无法执行其他命令。这就导致如果 Redis 中的 key 比较多,那么 Ke

[转帖]Redis 内存优化在 vivo 的探索与实践

https://www.jianshu.com/p/0849b526f0f4 一、 背景 使用过 Redis 的同学应该都知道,它基于键值对(key-value)的内存数据库,所有数据存放在内存中,内存在 Redis 中扮演一个核心角色,所有的操作都是围绕它进行。 我们在实际维护过程中经常会被问到如

[转帖]Redis命令DEL与UNLINK的区别,如何正确删除大Key!

https://www.itxm.cn/post/47824.html 背景 在这篇文章中做过使用del命令删除大key的实验,结果是del命令随着key的增大,主线程阻塞的时间就越长。 这与之前看redis5.0.8版本的代码中关于多线程删除操作的感官不符,于是决定先查看redis关于删除操作的代

[转帖]一文详解 Redis 中 BigKey、HotKey 的发现与处理

https://baijiahao.baidu.com/s?id=1709288518127882966&wfr=spider&for=pc 一 前言 在Redis的使用过程中,我们经常会遇到BigKey(下文将其称为“大key”)及HotKey(下文将其称为“热key”)。大Key与热Key如果未

[转帖]Redis大key多key拆分方案

https://www.cnblogs.com/-wenli/p/13612364.html 一、单个简单的key存储的value很大 二、hash, set,zset,list 中存储过多的元素 三、一个集群存储了上亿的key 四、大Bitmap或布隆过滤器(Bloom )拆分 背景 业务场景中经

[转帖]Redis key 乱码问题(springboot)

保存到redis中的key 前半段会出现乱码问题 原来配置: @Configuration@EnableCachingpublic class RedisCacheConfig { @Bean public CacheManager cacheManager(RedisTemplate

[转帖]redis集群批量删除模糊key shell脚本

1. 命令删除: 1. 1批量删除Key Redis 中有删除单个 Key 的指令 DEL,但好像没有批量删除 Key 的指令,不过我们可以借助 Linux 的 xargs 指令来完成这个动作 redis-cli keys "*" | xargs redis-cli del //如果redis-cl