定期删除和惰性删除
所谓定期删除,指的是redis默认每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除.注意,这里可不是每隔100ms就遍历所有的设置过期时间的key,那样就是一场性能上的灾难,实际上redis是每隔100ms随机抽取一些key来检查和删除的.
但是问题是,定期删除可能会导致很多过期key到了时间并没有被删除掉,那咋整呢?所以就是惰性删除了,这就是说,在获取某个key的时候,redis会检查一下,这个key如果设置了过期时间那么是否过期了,如果过期了此时就会删除.
通过上述两种手段结合起来,保证过期的key一定会被干掉
但是实际上这是有问题的,如果定期删除漏掉了很多过期key,然后你又没有及时去查,也没走惰性删除,此时会怎么样?如果大量的过期key堆积在内存里,导致redis内存块耗尽了,咋整
答案是:走内存淘汰机制
- noeviction:当内存中不足以容纳新写入数据时,新写入会报错,
- allkeys-lru:当内存中不足以容纳写入数据时,在键空间中,移除最近最少使用的key
- allkeys-random:当内存中不足以容纳写入数据时,在键中间中,随机移除某个key
手写LRU的代码?Least recently used
定义一个类继承LinkedHashMap,构造方法设置true,指让linkedHashMap按照访问顺序来进行排序,最近访问的放在头,最老访问的放在尾
设置hashmap的初始大小
当hashmap中的数据量大于指定缓存个数的时候,自动删除最老的数据