Redis概述,过期策略,内存淘汰机制

Redis概述,过期策略,内存淘汰机制,第1张

非关系型数据库NoSQL

存储结构是Key-Value

直接存在内存里面,所以读写速度非常快,被用于缓存技术(有些数据更新频率低即不怎么变动,读取频率高,就可以将其存在缓存里面)

你要考虑一个问题,在某个特定业务场景下,你是用redis作为数据库,还是mysql作为数据库呢?

缓存情形下肯定用redis

1.Redis 过期策略

使用 定期删除 + 懒惰删除 删除过期的 Key

(1)定时删除:对key-value设置一个过期时间,过期时间到达立即删除这个键值对

由于删除需要占用cpu,所以会影响速度,所以这就是用时间换空间

(2)懒惰删除:键值对到达过期时间,不删除,不做任何处理

等到下次访问该数据时,如果没有过期就返回数据,过期了就删除,返回不存在

要用的时候才检查这个键值对是否过期

这就会发现内存里会存很多的数据,但不需要cpu去定期清理,所以速度很快,拿空间换时间

显然,这两种方法都太极端了,折中方案就是定期删除

每隔一段时间,对一些key进行检查,删掉这些key里面的过期的

2.Redis内存淘汰机制

一般来说,缓存的容量是小于数据总量的,所以,当缓存数据越来越多,Redis 不可避免的会被写满,这时候就涉及到 Redis 的内存淘汰机制了。我们需要选定某种策略将“不重要”的数据从 Redis 中清除,为新的数据腾出空间。

根据二八原理:80% 的请求访问了 20% 的数据,将Redis缓存设置为数据总量的20%,(一般将缓存容量设置为总数据量的15%-30%)

Redis4.0版本之前有6种策略,4.0增加了2种(主要增加了LFU算法,allkeys-lfu和volatile-lfu)

8种淘汰策略:

(1)noevition,也就是不淘汰,不会对缓存的数据进行淘汰,当内存不够了就会报错

以allkeys开头的策略是针对所有数据的:一旦数据被选中了,即使过期时间没到,也会被删除,

如果过期时间到了,但是没有被策略选中,同样会被删除

(2)allkeys-random:随机删除

(3)allkeys-lru:使用 LRU 算法进行筛选删除

(4)allkeys-lfu:使用 LFU 算法进行筛选删除

针对设置了过期时间的数据,即使缓存没有被写满,数据过期也会被删除

(5)volatile-random:随机删除

(6)volatile-ttl:根据过期时间先后进行删除,越早过期的越先被删除

(7)volatile-lru:使用 LRU 算法进行筛选删除

(8)volatile-lfu:使用 LFU 算法进行筛选删除

LRU算法:Least Recently Used,即最近最少使用,将最近最不常用的数据选出来,保留那些最近频繁使用的数据,LRU 会把所有数据组成一个链表,链表头部称为 MRU,代表最近最常使用的数据;尾部称为 LRU代表最近最不常使用的数据( 即队头是常用数据,队尾是不常用数据)

举个例子,链表长度固定为4:

现在我们访问了3,于是将3这个节点拿到队头

现在又访问了2这个节点,将它拿到队头:

 最后写入5,由于链表长度固定为4,所以需要移除一个节点,把队尾最不常用的4移除掉

由于如果真的用链表管理所有缓存的数据,这会给 Redis 带来额外的巨大开销,而且,当有数据访问时就会有链表移动 *** 作,会大大降低 Redis 的性能。于是,Redis 对 LRU 的实现进行了一些改变(称之为近似的LRU算法

记录每个 key 最近一次被访问的时间戳(用一个lru字段来记录),维护一个固定容量的集合

(1)先随机选择 N 个数据作为一个候选集合

(2)继续挑选数据进入集合,进入集合的条件是:它的 lru 大于候选集合中最小的 lru,到达最大容量之后,将 lru 值小的数据淘汰出去。(lru值越小,说明最近一次被访问的越早)

LFU算法

Least Frequently Used,即最不经常使用策略,它是基于数据访问次数来淘汰数据的(LRU是基于最后一次访问的时间来淘汰数据的)

为每个数据增加了一个计数器,来统计这个数据的访问次数。

把访问次数最低的数据淘汰,如果访问次数相同,再根据访问的时间,将访问时间戳最小的淘汰。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/web/1295109.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存