redis的过时策略都有哪些?内存淘汰机制都有哪些?手写一下LRU代码实现?

redis的过时策略都有哪些?redis

设置过时时间:缓存

    set key 的时候,使用expire time,就是过时时间.指定这个key好比说只能存活一个小时?10分钟?指定缓存到期就会失效.dom

  redis的过时策略的话ide

      按期删除加惰性删除性能

    按期删除:redis默认是每隔100ms就会随机抽取一些设置了过时时间的key,检查其是否过时,若是过时就删除,spa

        假设redis里放了10万个key,都设置了过时时间,你每隔几百毫秒,就检查10万个key,那redis基本上就死了,cpu负载会很高的,消耗在你的检查过时key上了。注意,这里可不是code

        每隔100ms就遍历全部的设置过时时间的key,那样就是一场性能上的灾难。实际上redis是每隔100ms随机抽取一些key来检查和删除的。blog

    惰性删除:在你获取某个key的时候,redis会检查一下 ,这个key若是设置了过时时间那么是否过时了?若是过时了此时就会删除,不会给你返回任何东西。排序

    并非key到时间就被删除掉,而是你查询这个key的时候,redis再懒惰的检查一下内存

      经过上述两种手段结合起来,保证过时的key必定会被干掉。

    可是实际上这仍是有问题的,若是按期删除漏掉了不少过时key,而后你也没及时去查,也就没走惰性删除,此时会怎么样?若是大量过时key堆积在内存里,致使redis内存块耗尽了,

        咋整?

内存淘汰机制都有哪些?

    noeviction:当内存不足以容纳新数据时,新写入操做会报错.这个通常没人用.

    allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(无论是否过时)

    allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key,这个通常没人用吧,为啥要随机,确定是把最近最少使用的key给干掉啊

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

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

手写一下LRU代码实现?

public class LURCache<K,V> extends LinkedHashMap<K,V> {
    private final int CACHE_SIZEL;
    //这里就是传递进行最多能缓存多少数据
    public LURCache(int cacheSize){
        //这里就是设置一个hashmap的初始大小,
        // 同时最后一个true指的是让linkedhashmap按照访问顺序来进行排序,最近访问的放在头,最老访问的放在尾
        super((int)Math.ceil(cacheSize/0.75)+1,0.75f,true);
        CACHE_SIZEL=cacheSize;
    }

    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        //这个意思就是说当map中的数据量大于指定的缓存个数的时候,就自动删除最老的数据.
        return size()>CACHE_SIZEL;
    }
}
相关文章
相关标签/搜索