Redis过期键删除策略和内存淘汰策略
展开全部
惰性删除+定期删除
键过期后并不会立即删除,而是等到使用它时,先判断该键是否已经过期,如果过期则删除
对内存不友好,对CPU友好
redis每隔一段时间随机检测一部分数据(并不是全部)是否过期,如果已过期则删除
redis.conf中的hz参数用来配置每秒执行几次定期删除,默认值是10,即100ms/次
redis.conf中的maxmemory-samples参数用来指定每次检测几条数据,默认5
对CPU不友好,对内存友好
redis.conf中的maxmemory参数配置了redis的最大内存,maxmemory-policy配置了内存淘汰策略,当redis内存达到最大后,会根据内存淘汰策略淘汰部分数据。
redis提供了8种内存淘汰策略:
no-eviction:当内存达到最大后,新数据不能写入,会报错
allkeys-lru:当内存达到最大后,淘汰最近最少使用的数据(最常用的策略)
allkeys-random:当内存达到最大后,随机淘汰
allkeys-lfu:当内存达到最大后,淘汰最少使用的数据
volatitle-lru:当内存达到最大后,从设置了过期键的数据中,淘汰最近最少使用的数据
volatitle-random:当内存达到最大后,从设置了过期键的数据中,随机淘汰
volatitle-lfu:当内存达到最大后,从设置了过期键的数据中,淘汰最少使用的数据
volatitle-ttl:当内存达到最大后,淘汰最早过期的数据
标准的LRU算法需要维护一个链表,当某个数据被使用时就把它放到链表头部,这样就保证了链表是按照使用时间排序的,当需要淘汰数据时,就从链表尾部删除部分数据。
标准LRU算法要进行大量的计算,redis采取了近似LRU算法的操作。
redis给每个键维护了一个24bit的属性字段,用来记录最后一次使用的时间戳。redis根据maxmemory-samples随机抽取一部分数据,将最旧的数据淘汰,指到内存降下来。后来redis又引入了淘汰池,淘汰池内的数据量等于maxmemory-samples,每次淘汰时将随机抽取的数据和淘汰池中的数据合并,淘汰最旧的数据,然后将剩余最旧的数据维护到淘汰池中,等待下次循环。
为什么需要LFU算法?
现在假设这种场景:redis中有两个键A和B,其使用频率如上面所示,当到达$时,因为A的使用时间比B晚,按照LRU算法会淘汰B,但是从使用频率上看,B明显比A使用的更频发,应该淘汰A。
为了解决上面的问题,Redis引入了LFU算法,淘汰最少使用的数据。原理如下:
LFU给每个数据维护了一个计数器,每次使用都会使计数器增加,淘汰使用次数最少的键。但是这样又有新的问题:
①新的key如果计数器为0,可能就会一直被淘汰
redis解决方案:redis给每个新的键的计数器一个初始值
②某个键可能前一段时间被频繁使用,但是一段时间后使用频率就会下降。
redis解决方案:如果某个键一段时间不使用,计数器会减小
键过期后并不会立即删除,而是等到使用它时,先判断该键是否已经过期,如果过期则删除
对内存不友好,对CPU友好
redis每隔一段时间随机检测一部分数据(并不是全部)是否过期,如果已过期则删除
redis.conf中的hz参数用来配置每秒执行几次定期删除,默认值是10,即100ms/次
redis.conf中的maxmemory-samples参数用来指定每次检测几条数据,默认5
对CPU不友好,对内存友好
redis.conf中的maxmemory参数配置了redis的最大内存,maxmemory-policy配置了内存淘汰策略,当redis内存达到最大后,会根据内存淘汰策略淘汰部分数据。
redis提供了8种内存淘汰策略:
no-eviction:当内存达到最大后,新数据不能写入,会报错
allkeys-lru:当内存达到最大后,淘汰最近最少使用的数据(最常用的策略)
allkeys-random:当内存达到最大后,随机淘汰
allkeys-lfu:当内存达到最大后,淘汰最少使用的数据
volatitle-lru:当内存达到最大后,从设置了过期键的数据中,淘汰最近最少使用的数据
volatitle-random:当内存达到最大后,从设置了过期键的数据中,随机淘汰
volatitle-lfu:当内存达到最大后,从设置了过期键的数据中,淘汰最少使用的数据
volatitle-ttl:当内存达到最大后,淘汰最早过期的数据
标准的LRU算法需要维护一个链表,当某个数据被使用时就把它放到链表头部,这样就保证了链表是按照使用时间排序的,当需要淘汰数据时,就从链表尾部删除部分数据。
标准LRU算法要进行大量的计算,redis采取了近似LRU算法的操作。
redis给每个键维护了一个24bit的属性字段,用来记录最后一次使用的时间戳。redis根据maxmemory-samples随机抽取一部分数据,将最旧的数据淘汰,指到内存降下来。后来redis又引入了淘汰池,淘汰池内的数据量等于maxmemory-samples,每次淘汰时将随机抽取的数据和淘汰池中的数据合并,淘汰最旧的数据,然后将剩余最旧的数据维护到淘汰池中,等待下次循环。
为什么需要LFU算法?
现在假设这种场景:redis中有两个键A和B,其使用频率如上面所示,当到达$时,因为A的使用时间比B晚,按照LRU算法会淘汰B,但是从使用频率上看,B明显比A使用的更频发,应该淘汰A。
为了解决上面的问题,Redis引入了LFU算法,淘汰最少使用的数据。原理如下:
LFU给每个数据维护了一个计数器,每次使用都会使计数器增加,淘汰使用次数最少的键。但是这样又有新的问题:
①新的key如果计数器为0,可能就会一直被淘汰
redis解决方案:redis给每个新的键的计数器一个初始值
②某个键可能前一段时间被频繁使用,但是一段时间后使用频率就会下降。
redis解决方案:如果某个键一段时间不使用,计数器会减小
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
大雅新科技有限公司
2024-11-19 广告
2024-11-19 广告
这方面更多更全面的信息其实可以找下大雅新。深圳市大雅新科技有限公司从事KVM延长器,DVI延长器,USB延长器,键盘鼠标延长器,双绞线视频传输器,VGA视频双绞线传输器,VGA延长器,VGA视频延长器,DVI KVM 切换器等,优质供应商,...
点击进入详情页
本回答由大雅新科技有限公司提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询