持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情
一、数据过期策略
定时过期: 每一个设置过时key都需要创建一个定时器,到过期时间调用定时器对key进行清理,该策略可以立即清理过期数据,对内存友好,保证过期键会尽可能快地被删除,并释放过期键所占用的内存;但是占用大量cpu,影响服务器的响应时间和吞吐量。
惰性过期: 放任过期键不管,每次从键空间读写操作时,都检查键是否过期,如果过期,删除该键,如果没有过期,返回该键。对CPU时间友好,读写操作键时才对键进行过期检查,删除过期键的操作只会在非做不可的情况下进行;但是对内存不友好,只要键不删除,就不会释放内存,浪费太多内存,有内存泄漏风险。
定期过期: 每隔一段时间执行一次定时删除,并通过限制删除操作执行的总时长和总频率来限制删除操作对CPU占用时间的影响。通过定期删除过期键,有效减少了因为过期键而带来的内存浪费。是对定时删除策略和惰性删除策略的一种补充整合。但是对确定删除操作执行的总时长和总频率要求高,设置不恰当也会影响内存或cpu性能。
Redis中同时使用了惰性过期和定期过期两种过期策略;在合理使用CPU时间和避免浪费内存之间取得平衡。
二、内存淘汰策略
Redis 的淘汰算法有多种,如下:
随机算法:随机淘汰一批keys TTL算法:设置了过期时间的获取最早过期的一批keys,然后淘汰这一批keys LRU(Least Recently Used,最近最少使用)算法:淘汰最近一段时间使用最少的keys LFU(Least Frequently Used,最不经常使用)算法:
volatile-lru:当内存不足以容纳新写入数据时,从设置了过期时间的key中使用LRU(最近最少使用)算法进行淘汰; allkeys-lru:当内存不足以容纳新写入数据时,从所有key中使用LRU(最近最少使用)算法进行淘汰。 volatile-lfu:4.0版本新增,当内存不足以容纳新写入数据时,在过期的key中,使用LFU算法进行删除key。 allkeys-lfu:4.0版本新增,当内存不足以容纳新写入数据时,从所有key中使用LFU算法进行淘汰; volatile-random:当内存不足以容纳新写入数据时,从设置了过期时间的key中,随机淘汰数据;。 allkeys-random:当内存不足以容纳新写入数据时,从所有key中随机淘汰数据。 volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的key中,根据过期时间进行淘汰,越早过期的优先被淘汰; noeviction:默认策略,当内存不足以容纳新写入数据时,新写入操作会报错。
maxmemory 用于指定Redis能使用的最大内存。可以在 redis.conf 文件中设置:
maxmemory 100mb
如果客户端执行一个命令, 导致Redis中的数据增加,占用更多内存;
Redis检查内存使用量, 如果超出 maxmemory 限制, 根据策略清除部分key;策略的选择根据配置的策略,即
maxmemory-policy
决定具体的执行行为。
下一次我们讲讲redis的缓存过期事件。