Redis 删除策略的三种实现
作者:Doker 多克
Redis中的数据删除策略包括定:时删除、惰性删除、定期删除
一、Redis过期时间设置
Redis提供了四个命令来设置过期时间(生存时间)。
- EXPIRE :表示将键 key 的生存时间设置为 ttl 秒。
- PEXPIRE :表示将键 key 的生存时间设置为 ttl 毫秒。
- EXPIREAT :表示将键 key 的生存时间设置为 timestamp 所指定的秒数时间戳。
- PEXPIREAT :表示将键 key 的生存时间设置为 timestamp 所指定的毫秒数时间戳。
二、定时删除
- 当key设置有过期时间,且过期时间到达时,立即执行key的删除操作
- 优点:节约内存,到时就删除,立即释放不必要的内存占用
- 缺点:CPU压力较大,无论CPU此时负载量多高,均占用CPU,会影响redis服务器响应时间和指令吞吐量
- 总结:用处理器性能换取存储空间(时间换空间),适用于小内存,强CPU场景
三、惰性删除 (空间换时间)
数据到达过期时间,先不做处理。等下次访问该数据时,发现数据已过期,删除,给客户端返回不存在。
- 优点:节约CPU性能,发现不得不删除的时候才删除
- 缺点:内存空间压力很大,出现长期占用内存的数据
- 总结:用存储空间换取处理器性能 (空间换时间),适用于大内存,弱CPU场景
四、 定期删除(中和以上两种方案)
由redis.c/activeExpireCycle 函数实现,函数以一定的频率运行,每次运行时,都从一定数量的数据库中取出一定数量的随机键进行检查,并删除其中的过期键。
注意:并不是一次运行就检查所有的库,所有的键,而是随机检查一定数量的键。
定期删除函数的运行频率,在Redis2.6版本中,规定每秒运行10次,大概100ms运行一次。在Redis2.8版本后,可以通过修改配置文件redis.conf 的 hz 选项来调整这个次数。
- 特点1:CPU性能占用设置有峰值,检测频度可自定义设置
- 特点2:内存压力不是很大,长期占用内存的冷数据会被持续清理
五、三种删除方案对比
内存占用 | CPU占用 | 特征 | |
定时删除 | 节约内存,无占用 | 不分时段占用CPU资源,频度高 | 时间换空间 |
惰性删除 | 内存占用严重 | 延时执行,CPU利用率高 | 空间换时间 |
定期删除 | 内存定期随机清理 | 每秒花费固定的CPU资源维护内存 | 随机抽查,重点抽查 |
六、逐出算法
Redis密钥驱逐策略概述(LRU、LFU等)
当Redis被用作缓存时,在添加新数据时,让它自动收回旧数据通常很方便。这种行为在开发人员社区中是众所周知的,因为它是流行的memcached系统的默认行为。
本页介绍了Redis maxmemory指令的更一般的主题,该指令用于将内存使用限制在固定数量。它还广泛涵盖了Redis使用的LRU驱逐算法,该算法实际上是精确LRU的近似值。
1、MaxMemory配置指令
maxmemory配置指令将Redis配置为对数据集使用指定数量的内存。您可以使用redis.conf文件设置配置指令,或者稍后在运行时使用CONFIG set命令设置配置指令。
例如,要配置100兆字节的内存限制,可以在redis.conf文件中使用以下指令:
maxmemory 100mb
将maxmemory设置为零将导致无内存限制。这是64位系统的默认行为,而32位系统使用3GB的隐式内存限制。
当达到指定的内存量时,驱逐策略的配置方式决定了默认行为。Redis可以为可能导致使用更多内存的命令返回错误,也可以在每次添加新数据时收回一些旧数据以返回到指定的限制。
2、驱逐政策
当达到最大内存限制时,Redis遵循的确切行为是使用maxmemory策略配置指令配置的。
以下策略可用:
- noeviction:当达到内存限制时,不会保存新值。当数据库使用复制时,这适用于主数据库
- allkeys-lru:保留最近使用的密钥;删除最近最少使用的(LRU)密钥
- allkeys-lfu:保留常用密钥;删除最不常用的(LFU)密钥
- volatilelru:删除最近最少使用的密钥,并将expire字段设置为true。
- volatile lfu:删除过期字段设置为true的最不常用密钥。
- allkeys random:随机删除密钥,为添加的新数据腾出空间。
- volatile random:随机删除过期字段设置为true的密钥。
- volatile ttl:删除过期字段设置为true和剩余最短生存时间(ttl)值的键。
到此这篇关于Redis 删除策略的三种实现的文章就介绍到这了,更多相关Redis 删除策略内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!