redis的过期策略有哪些?
设置过期时间(redis会采用定期删除、惰性删除的策略)
定期删除
所谓定期删除,指的是redis默认是每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。
注意:
实际上redis是每隔100ms随机抽取一些key来检查和删除的,定期删除可能会导致很多过期key到了时间并没有被删除掉。这里可不是每隔100ms就遍历所有的设置过期时间的key,那样就是一场性能上的灾难。redis基本上就死了。
- 惰性删除
在你获取某个key的时候,redis会检查一下 ,这个key如果设置了过期时间那么是否过期了?如果过期了此时就会删除,不会给你返回任何东西。并不是key到时间就被删除掉,而是你查询这个key的时候,redis再懒惰的检查一下。
通过上述两种手段结合起来,保证过期的key一定会被干掉。
我的数据明明都过期了,怎么还占用着内存啊?
redis中的过期key靠定期删除没有被删除掉,导致大量占用内存,导致redis的内存装不下数据,此时redis会进行内存淘汰。
- 我redis里写的数据怎么没了?
很简单你写的数据太多,内存满了,或者触发了什么条件,redis lru,自动给你清理掉了一些最近很少使用的数据。
redis的内存淘汰的一些策略?
noeviction:当内存不足以容纳新写入数据时,新写入操作会报错,这个一般没人用吧,实在是太恶心了。
allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(这个是最常用的)。
allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key,这个一般没人用吧,为啥要随机,肯定是把最近最少使用的key给干掉啊。
volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key(这个一般不太合适)。
volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。
volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。
手写一下LRU算法?
1 | public class LRUCache<K, V> extends LinkedHashMap<K, V> { |