zoukankan      html  css  js  c++  java
  • redis的过期策略都有哪些?内存淘汰机制都有哪些?手写一下LRU代码实现?

    redis的过期策略都有哪些?

    设置过期时间:

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

      redis的过期策略的话

          定期删除加惰性删除

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

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

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

        惰性删除:在你获取某个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;
        }
    }
  • 相关阅读:
    thinkphp框架 url 去除index.php
    读yaml文件警告: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details. data = yaml.load(fr)
    Appium 坐标定位元素
    Appium操作app弹窗
    AirtestIDE 教程(二)
    AirtestIDE 教程(一)
    Appium(五) aapt 不是内部或外部命令
    Appium(四) selenium.common.exceptions.WebDriverException: Message: An unknown server-side error occurred while processing the command. Original error: You must include a platformName capability
    Appium(三) 打开 uiautomatorviewer.bat 闪退问题
    Appium(二) 下载安装 appium-python-client
  • 原文地址:https://www.cnblogs.com/qingmuchuanqi48/p/11129862.html
Copyright © 2011-2022 走看看