在面试中,当你提到你使用过Redis作缓存,那么面试官大概率会问你Redis的过期策略和内存淘汰策略。如果你答不出来那你就GG了……下面就来简单回顾一下Redis的过期策略和内存淘汰策略。
一、Redis的过期策略
在官方文档中可以看见对过期策略作了以下描述:
Redis keys过期有两种方式:被动和主动方式。当一些客户端尝试访问它时,key会被发现并主动的过期。当然,这样是不够的,因为有些过期的keys,永远不会访问他们。 无论如何,这些keys应该过期,所以定时随机测试设置keys的过期时间。所有这些过期的keys将会从keys空间删除。
具体就是Redis每秒10次做的事情:
- 测试随机的20个keys进行相关过期检测。
- 删除所有已经过期的keys。
- 如果有多于25%的keys过期,重复步奏1。
这是一个平凡的概率算法,基本上的假设是,我们的样本是这个keys空间,并且我们不断重复过期检测,直到过期的keys的百分百低于25%,这意味着,在任何给定的时刻,最多会清除1/4的过期keys。
Redis官方称这两种方式为被动和主动方式,其实更专业的说法是惰性删除和定期删除。
- 惰性删除,当过期内容被访问且发现已经过期时就把内容删除,如果过期内容一直未被访问则不会被删除。这个方式有很大的缺点,就是总是有些过期的内容不会被访问到,那样他们将占用大量的内存。
- 定期删除,在规定的周期时间内对过期内容进行删除,Redis的定期删除策略还加入了概率算法,这样就更加的节省时间。
二、Redis内存淘汰策略
这里需要注意,过期策略和内存淘汰策略是不一样的,前者是只针对过期的内容,后者是当内存超过设置maxmemory限制是触发的淘汰机制。在官方文档中同样有详细介绍。
- noeviction:返回错误当内存达到限制并且客户端尝试执行会让更多内存被使用的命令(大部分的写入指令,但DEL和几个例外)。
- allkeys-lru:尝试回收最久未使用的键(LRU),使得新添加的数据有空间存放。
- volatile-lru:尝试回收最久未使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放。
- allkeys-random:回收随机的键使得新添加的数据有空间存放。
- volatile-random:回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。
- volatile-ttl:回收在过期集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。
- volatile-lfu:回收最少使用的键(LFU),但仅限于在过期集合的键,使得新添加的数据有空间存放。
- allkeys-lfu:回收最少使用的键(LFU),使得新添加的数据有空间存放。