一、在Redis中,假如我们设置了100w个key,这些key设置了只能存活2个小时,那么在2个小时后,redis是如何来删除这些key的?
答案:定期删除 and 惰性删除。
那什么是定期删除?什么的惰性删除?靠这两种策略就可以删除掉redis中过期的key吗?
定期删除:redis默认每隔100ms随机抽取一些key,检查是否有过期的key,有过期的key则删除。需要注意的是redis不是每隔100ms就将所有的key检查一次,而是随机抽取一些key来检查是否过期的key。如果每100ms,就将redis的所有key(假设有1000w的key)都检查一遍,那么会给CPU带来很大的负载,redis就会卡死了。因此,如果只采用定期删除策略,会导致很多key到时间还没有被删除。
惰性删除:定期删除策略可能会导致很多过期的key到了时间也还没有被删除掉;为了解决这个问题,redis增加了惰性删除策略;对于那些过期的key,靠定期删除策略没有被删除掉,还保留在内存中,这时候如果系统去主动查询这个key,redis判断已经过期了,才会把这个过期的key删除掉。
靠这两种策略就可以删除掉redis中过期的key吗?
仅仅靠通过设置过期时间还是存在着问题的。由于定期删除策略是随机抽取的,因此很有可能漏掉很多过期的key,这时候我们也没有主动去查询这些过期的key,因此也就没有使用惰性删除策略了,这时候如果有大量的过期key堆积,会导致内存被消耗完。要解决这个问题:可以使用redis 内存淘汰机制。
Redis 内存淘汰策略:
1、noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。
2、allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。(这个比较常用)
3、allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。
4、volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
5、volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。
6、volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除