redis过期策略和淘汰机制你知道多少?

关注微信公众号“虾米聊吧”,每天更新一篇技术文章,文章内容涵盖架构师成长必经之路应掌握的技术,一起学习,一起交流。

 

开篇提问:你是否遇到过生产环境redis丢数据的问题?比如你刚刚写入了一堆数据到redis,然后过了一会就没了,那么这是什么原因造成的呢?接下来我们简单探讨一下这个问题。

 

首先要明确一点,redis是用来做缓存的并不是用来做常规存储的,千万不要什么数据都一股脑往里面丢,毕竟内存是很宝贵而有限的资源,不比磁盘,磁盘是非常廉价的。一台服务器可能内存就几十个G,但是却有几个T的磁盘空间。redis主要是基于内存操作的,用来提高高并发下的读写操作性能。

 

因为内存是有限的所以,如果你写入的数据超出了redis可用内存的大小,那么redis会基于LRU算法清理掉部分数据,举个例子,如果设置了你的redis是可以使用16G内存,你要是往里面写了20G数据。那么自然会清理掉4G数据,然后保留16G数据,清理掉的数据通常是不常使用的,然后保留常用数据。

因此,redis中的数据是会过期的,要么是你自己设置了过期时间,要么是redis自己给清理掉了。

说到这里,那么问题来了,redis具体是怎么清理掉我们设置了过期时间的数据的呢因为有时候你在监控内存的时候可能会发现,明明好多数据都设置了过期时间,但是redis的内存依然占用很高,这个时候你可能就会挠挠头一脸懵逼了,那么接下来我们将简单探讨一下具体redis是怎么删除那些过期key的。

因为如果不清楚redis的清理删除机制,可能会导致在高并发的场景中,redis没有有效的提升系统的性能,还有可能导致其他的问题。

redis删除清理key的一般有如下两种情况:1)对设置过期时间redis的进行删除(2)通过内存淘汰机制删除部分key;下面我们对这两种情况的原理分别进行探讨。

 

01  设置过期时间redis的清理机制

 

redis中对某一个key设置过期时间相信我们再熟悉不过了,因为我们只要在set key的时候,就可以给一个expire time,就是过期时间,指定这个key多久后过期,到达过期时间后缓存就会失效。

那么具体redis是怎么删除我们这些已经过期的key的呢?

答案是:定期删除+惰性删除

 

所谓定期删除,指的是redis默认是每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。注意,这里并不是每隔100ms就遍历所有的设置过期时间的key,因为如果是遍历检测所有设置过期时间的key的话那你的redis基本就挂了。简单做个比喻说明:假设redis里存放了100万个key,都设置了过期时间,你每隔几百毫秒,就检查这100万个key,那么很不幸你的redis基本上就死了,因为cpu的负载全消耗在你检查过期key上了。实际上redis是每隔100ms随机抽取一些key来检查和删除的。

 

但是随机抽取一些key的话又会造成另一个问题: 可能会出现很多过期key到了时间并没有被删除掉,因为随机抽取的时候并没有抽取到,那redis又是怎么解决这个问题的呢?答案就是惰性删除。惰性删除的意思就是,在你获取某个key的时候,redis会检查一下 ,这个key是否设置了过期时间,如果设置了过期时间那么是否过期了?如果过期了此时就会删除该key,并不会给你返回任何东西。因此要注意并不是key到时间就会被删除掉,而是你查询这个key的时候,redis再懒惰的检查一下

redis就是通过上述两种手段结合起来,以确保过期的key一定会被删除掉。

简单来说就是你设置的过期key,如果通过定期删除没有被删除掉,就仍然会停留在内存里,占用着你的内存,这个时候只有你的系统去主动查一下那个key,才会被redis给删除掉

但是实际上经过以上的处理机制后,如果定期删除漏掉了很多过期key的话,然后你也没及时去查,也就没走惰性删除,就会造成大量过期key堆积在内存里,最终仍然可能会导致redis内存耗尽,因此这个问题又该怎么解决呢?

答案是:走内存淘汰策略

 

02 内存淘汰策略

 

当redis的内存占用过多或者快达到redis可用内存上限一定比例的时候,此时会触发redis内存淘汰策略,具体有如下一些策略:

1)noeviction:当内存不足以容纳新写入数据时,新写入操作会报错,这个一般没人用

2)allkeys-lru当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(这个是最常用的)

3)allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key,这个一般也没人用

4)volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key(这个一般不太合适)

5)volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key

6)volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除

 

注:一般都是采用第二种策略allkeys-lru,因为删除最近最少使用key基本符合我们的业务要求

 

关注微信公众号“虾米聊吧”,获取更多知识资料干货~,一起交流,一起学习~,

一起打卡学习,一起交流进步吧!

微信扫描二维码,关注我的公众号

你可能感兴趣的:(redis,架构)