Redis过期键与内存淘汰策略详解:懒惰删除与定期删除的奥秘
创始人
2024-12-26 19:45:42
0 次浏览
0 评论
Redis过期键删除策略和内存淘汰策略
懒惰删除+定期删除key过期后不会立即删除,而是等到使用时判断key是否过期,删除它对内存不友好,对CPU不友好。Redis每隔一段时间检测随机部分数据(不是全部)是否过期,将其删除redis.conf中的hz参数用于配置每次执行完毕后正常删除。
默认值为10,即100ms。
/timesredis.conf中的maxmemory-samples参数用于确定每次检测的数据条数,默认为5。
对CPU不友好,但redis.conf中的maxmemory参数配置了redis内存最大值,maxmemory-policy配置内存清除策略当redis内存达到最大时,会根据内存清除策略删除部分数据。
redis提供了8种内存删除策略:noeviction:当内存达到最大值时,无法写入新数据,会报错allkeys-lru:当内存达到最大值时,删除最近最少使用的数据(最常用的策略使用)被消除。
allkeys-random:当内存达到最大时,随机删除allkeys-lfu:当内存达到最大时,删除最少使用的数据:当内存达到最大时,从具有过期键的数据中删除最新数据。
Volatitle-随机最少使用的数据:当内存达到最大时,将随机删除锁过期的数据:当内存达到最大时,将从锁过期的数据中删除最少使用的数据。
volatitle-ttl:当内存达到最大时,删除最早过期的数据标准LRU算法需要维护一个链表当某些数据被使用时,将其放置在链表的头部链表按使用时间排序是的,当需要删除数据时,会从链表末尾删除一些数据。
标准的LRU算法需要大量的计算,而redis使用了与LRU算法类似的操作。
Redis为每个键维护一个24位的属性字段,用于记录上次使用时的时间戳。
Redis根据最大内存样本随机抽取一部分数据,淘汰最旧的数据,减少内存占用。
然后,redis引入移除池,移除池中的数据量等于最大内存样本,每次移除时,将随机选择的数据与移除池中的数据组合起来,移除最旧的数据,然后。
最旧的剩余数据保留到In移除池中,等待下一个周期。
为什么需要LFU算法?现在考虑这样一个场景:redis中有两个keyA和B,它们的使用频率如上图,当达到$时,因为A晚于B使用,所以根据LRU算法,B会被删除,但是从使用情况来看频率看,B的使用频率明显比A更高,所以A应该被排除。
为了解决上述问题,Redis引入了LFU算法来消除最少使用的数据。
原理如下:LFU为每个数据维护一个计数器,每次使用都会增加计数器,并删除使用次数最少的key。
但是又出现了一个新的问题:①如果新的key计数器为0,则可能会一直被删除:redis为每个新的key给计数器赋一个初始值②某个key可能已经被频繁使用了一段时间,但是使用一段时间后,使用频率会降低。
Redis解决方案:如果某个key一段时间内没有使用,计数器就会递减
redis的expire方法
EXPIREkeysecions(单位/秒)设置特定键的停留时间。当key过期(驻留时间为0)时,会自动删除。
在Redis中,具有生命周期的键称为“易失性”。
可以通过使用DEL命令完全删除密钥,或者使用SET和GETSET命令覆盖它来删除生命周期,这意味着如果该命令仅修改具有默认生命周期的密钥值而不是使用它,如果您将其替换为新的键值,生命周期不会改变。
例如,对键执行INCR命令、对列表执行LPUSH命令或对哈希表执行HSET命令不会修改键本身的生命周期。
另一方面,如果使用RENAME重命名某个键,则重命名后该键的生存时间与重命名前相同。
RENAME命令的另一种可能性是尝试将具有生命周期的密钥重命名为另一个具有生命周期的密钥。
此时,旧的other_key(及其生存期)将被删除,然后旧的key将被重命名为other_key。
因此,新密钥的持续时间与原始密钥相同。
使用PERSIST命令可以删除密钥的生命周期而不删除密钥,使密钥再次成为“持久”密钥。
下一篇:
MySQL数据库文件存储位置及后缀名详解
相关文章
MySQL DATE类型应用与查询优化技...
2024-12-17 20:10:21解析SqlServer动态SQL执行问题...
2024-12-21 21:19:14SQL CAST与CONVERT函数:选...
2024-12-16 11:46:53MySQL高效时间数据查询攻略:轻松获取...
2024-12-17 04:00:04SQL查询技巧:如何筛选平均分超80分的...
2025-01-01 01:40:42MySQL数据库文件后缀名全解析:.MY...
2024-12-17 07:32:44Java语言实现Redis集群方案:Je...
2024-12-30 22:41:34MySQL锁机制详解:行锁与表锁的奥秘
2024-12-28 12:44:03MySQL表空间大小变化解析及优化策略
2024-12-18 05:22:09C语言编程:简单实现爱心图案,表白心意
2024-12-16 07:19:33最新文章
12
2025-01
12
2025-01
12
2025-01
12
2025-01
12
2025-01
12
2025-01
12
2025-01
12
2025-01
12
2025-01
12
2025-01
热门文章
1
Python代码实现:如何判断三角形的三...
python三角形三条边长,判断能否构成三角形Python三角形的三个长边如下:...
2
高效掌握:CMD命令轻松启动、关闭及登录...
如何用cmd命令快速启动和关闭mysql数据库服务开发中经常使用MySQL数据库...
3
SQL字段默认值设置全攻略:轻松实现自动...
sql如何设置字段默认值设置SQL中某个字段的默认值;需要遵循几个步骤。首先您需...
4
MySQL查询加速秘籍:PolarDB ...
mysql中in大量数据导致查询速度慢怎么优化?在MySQL中处理大量数据时,查...
5
SQL2000数据库备份压缩技巧:优化空...
怎么将SQL2000中的较大的备份数据库压缩变小更改数据库属性-选项-恢复模型很...
6
SQL字符串处理技巧:单引号使用与转义标...
SQL语句中,字符串类型的值均使用什么符号标明?单引号如果字符串内有单引号,请小...
7
Windows环境下Redis安装指南与...
redis安装windowsredis基本简介与安装安装Redis首先需要获取安...
8
深度解析:Redis性能优势与局限性,助...
redis有哪些优缺点?Redis的全称是RemoteDictionary.Se...
9
深入解析:MySQL数据库的特性与应用
mysql是什么MySQL是一个关系数据库管理系统。MySQL是一个开源关系数据...
10
SQL必备:详解常用字符串函数及数据类型...
sql常用的字符串函数都有哪些常用的字符串函数有:1.字符转换功能1.ASCII...