来源:cnblogs.com/lonely-wolf/p/14403264.html
前言
作为一台服务器来说,内存并不是无限的,所以总会存在内存耗尽的情况,那么当 Redis
服务器的内存耗尽后,如果继续执行请求命令,Redis
会如何处理呢?
内存回收
使用Redis
服务时,很多情况下某些键值对只会在特定的时间内有效,为了防止这种类型的数据一直占有内存,我们可以给键值对设置有效期。Redis
中可以通过 4
个独立的命令来给一个键设置过期时间:
-
expire key ttl
:将key
值的过期时间设置为ttl
秒。 -
pexpire key ttl
:将key
值的过期时间设置为ttl
毫秒。 -
expireat key timestamp
:将key
值的过期时间设置为指定的timestamp
秒数。 -
pexpireat key timestamp
:将key
值的过期时间设置为指定的timestamp
毫秒数。
PS:不管使用哪一个命令,最终 Redis
底层都是使用 pexpireat
命令来实现的。另外,set
等命令也可以设置 key
的同时加上过期时间,这样可以保证设值和设过期时间的原子性。
设置了有效期后,可以通过 ttl
和 pttl
两个命令来查询剩余过期时间(如果未设置过期时间则下面两个命令返回 -1
,如果设置了一个非法的过期时间,则都返回 -2
):
-
ttl key
返回key
剩余过期秒数。 -
pttl key
返回key
剩余过期的毫秒数。
过期策略
如果将一个过期的键删除,我们一般都会有三种策略:
-
定时删除:为每个键设置一个定时器,一旦过期时间到了,则将键删除。这种策略对内存很友好,但是对
CPU
不友好,因为每个定时器都会占用一定的CPU
资源。 -
惰性删除:不管键有没有过期都不主动删除,等到每次去获取键时再判断是否过期,如果过期就删除该键,否则返回键对应的值。这种策略对内存不够友好,可能会浪费很多内存。
-
定期扫描:系统每隔一段时间就定期扫描一次,发现过期的键就进行删除。这种策略相对来说是上面两种策略的折中方案,需要注意的是这个定期的频率要结合实际情况掌控好,使用这种方案有一个缺陷就是可能会出现已经过期的键也被返回。
在 Redis
当中,其选择的是策略 2
和策略 3
的综合使用。不过 Redis
的定期扫描只会扫描设置了过期时间的键,因为设置了过期时间的键 Redis
会单独存储,所以不会出现扫描所有键的情况:
lfu-decay-time 1
具体算法如下:
-
获取当前时间戳,转化为分钟后取低
16
位(为了方便后续计算,这个值记为now
)。 -
取出对象内的
lru
属性中的高16
位(为了方便后续计算,这个值记为ldt
)。 -
当
lru
>now
时,默认为过了一个周期(16
位,最大65535
),则取差值65535-ldt+now
:当lru
<=now
时,取差值now-ldt
(为了方便后续计算,这个差值记为idle_time
)。 -
取出配置文件中的
lfu_decay_time
值,然后计算:idle_time / lfu_decay_time
(为了方便后续计算,这个值记为num_periods
)。 -
最后将
counter
减少:counter - num_periods
。
看起来这么复杂,其实计算公式就是一句话:取出当前的时间戳和对象中的 lru
属性进行对比,计算出当前多久没有被访问到,比如计算得到的结果是 100
分钟没有被访问,然后再去除配置参数 lfu_decay_time
,如果这个配置默认为 1
也即是 100/1=100
,代表 100
分钟没访问,所以 counter
就减少 100
。
总结
本文主要介绍了 Redis
过期键的处理策略,以及当服务器内存不够时 Redis
的 8
种淘汰策略,最后介绍了 Redis
中的两种主要的淘汰算法 LRU
和 LFU
。
END
十期推荐
【201期】面试官:String长度有限制吗?是多少?还好我看过
【202期】面试官:GET 和 POST请求的本质区别是什么?(本质没区别)
【205期】面试官:数据量很大的情况下,对于分页查询你有什么优化方案吗?
【206期】面试官:你的项目是如何处理重复请求/并发请求的?
【207期】19张图带你梳理SpringCloud体系中的重要知识点!
【209期】架构设计&分布式&数据结构与算法面试题(2020最新版)
【210期】面试官:说说常用的Redis和zk两种分布式锁的对比
与其在网上拼命找题? 不如马上关注我们~
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/7867.html