精华内容
下载资源
问答
  • redis过期策略

    万次阅读 2019-01-29 12:46:14
    redis过期策略有两种,一种是主动式过期,另一种是被动式过期,redis采用两者相结合的方式来处理,因为单纯采用主动式过期,会影响redis的性能,单纯采用被动式过期,可能会导致大量内存得不到释放。 主动式过期: ...

    最近在读redis深度历险,记录一下在读书的过程中一些重要的知识点,供以后查阅。

    redis过期策略有两种,一种是主动式过期,另一种是被动式过期,redis采用两者相结合的方式来处理,因为单纯采用主动式过期,会影响redis的性能,单纯采用被动式过期,可能会导致大量内存得不到释放。

    主动式过期:

        redis会将所有设置了过期时间的key放到一个独立的字典中,以后会定时扫描这个字典,将过期的key删除。redis默认每秒进行10次过期扫描,扫描不会扫描所有的key,而是采用一种贪心的策略来进行:

    1. 从过期字典中随机选择20个key。

    2. 将20个key中过期的key删除。

    3. 如果过期的key的比例超过1/4,redis认为过期的key相对较多,会再次从步骤1依次执行。

    同时为了保证扫描不会出现过度循环影响性能,redis会限制每次扫描的时间上限为25ms。

     

    被动式过期:

        redis定时扫描任务可能不会将过期的key完全删除,此时redis会用一种懒惰策略来被动式的更新过期的key,即当这个key被实际访问时,redis会检查这个key的过期状态,如果过期,那么将这个key删除。

    展开全文
  • Redis 过期策略

    2019-07-09 19:55:07
    redis 过期策略 redis 过期策略是:定期删除+惰性删除。 所谓定期删除,指的是 redis 默认是每隔 100ms 就随机抽取一些设置了过期时间的 key,检查其是否过期,如果过期就删除。 假设 redis 里放了 10w 个 key,...

    redis 过期策略

    redis 过期策略是:定期删除+惰性删除

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

    假设 redis 里放了 10w 个 key,都设置了过期时间,你每隔几百毫秒,就检查 10w 个 key,那 redis 基本上就死了,cpu 负载会很高的,消耗在你的检查过期 key 上了。注意,这里可不是每隔 100ms 就遍历所有的设置过期时间的 key,那样就是一场性能上的灾难。实际上 redis 是每隔 100ms 随机抽取一些 key 来检查和删除的。

    但是问题是,定期删除可能会导致很多过期 key 到了时间并没有被删除掉,那咋整呢?所以就是惰性删除了。这就是说,在你获取某个 key 的时候,redis 会检查一下 ,这个 key 如果设置了过期时间那么是否过期了?如果过期了此时就会删除,不会给你返回任何东西。

    获取 key 的时候,如果此时 key 已经过期,就删除,不会返回任何东西。

    但是实际上这还是有问题的,如果定期删除漏掉了很多过期 key,然后你也没及时去查,也就没走惰性删除,此时会怎么样?如果大量过期 key 堆积在内存里,导致 redis 内存块耗尽了,咋整?

    答案是:走内存淘汰机制

    内存淘汰机制

    redis 内存淘汰机制有以下几个:

    • noeviction: 当内存不足以容纳新写入数据时,新写入操作会报错,这个一般没人用吧,实在是太恶心了。
    • allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的)。
    • allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 key,这个一般没人用吧,为啥要随机,肯定是把最近最少使用的 key 给干掉啊。
    • volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key(这个一般不太合适)。
    • volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key。
    • volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除。

    手写一个 LRU 算法?

     如何利用已有的 JDK 数据结构实现一个 Java 版的 LRU。

    //自定义LRU规则设置
    class LRUCache<K, V> extends LinkedHashMap<K, V> {
        private final int CACHE_SIZE;
    
        /**
         * 传递进来最多能缓存多少数据
         *
         * @param cacheSize 缓存大小
         */
        public LRUCache(int cacheSize) {
            //true表示让linkedHashMap 按照访问顺序来进行排序,最近访问的放在头部,最老访问的放在尾部。
            super((int) Math.ceil(cacheSize / 0.75) + 1, 0.75f, true);
            CACHE_SIZE = cacheSize;
        }
    
        @Override
        protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
            // 当 map中的数据量大于指定的缓存个数的时候,就自动删除最老的数据。
            return size() > CACHE_SIZE;
        }
    }

     

    展开全文
  • redis 过期策略

    2020-04-01 09:14:11
    Redis 所有的数据结构都可以设置过期时间,时间一到,就会自动删除。你可以想象 Redis 内部有一个死神,时刻盯着所有设置了过期时间的 key,寿命一到就会立即收割。 你还可以进一步站在死神的角度思考,会不会因为...

    Redis 所有的数据结构都可以设置过期时间,时间一到,就会自动删除。你可以想象 Redis 内部有一个死神,时刻盯着所有设置了过期时间的 key,寿命一到就会立即收割。

    你还可以进一步站在死神的角度思考,会不会因为同一时间太多的 key 过期,以至于忙不过来。同时因为 Redis 是单线程的,收割的时间也会占用线程的处理时间,如果收割的太过于繁忙,会不会导致线上读写指令出现卡顿。

    这些问题 Antirez 早就想到了,所有在过期这件事上,Redis 非常小心。

    过期的 key 集合

    redis 会将每个设置了过期时间的 key 放入到一个独立的字典中,以后会定时遍历这个字典来删除到期的 key。除了定时遍历之外,它还会使用惰性策略来删除过期的 key,所谓惰性策略就是在客户端访问这个 key 的时候,redis 对 key 的过期时间进行检查,如果过期了就立即删除。定时删除是集中处理,惰性删除是零散处理。

    定时扫描策略

    Redis 默认会每秒进行十次过期扫描,过期扫描不会遍历过期字典中所有的 key,而是采用了一种简单的贪心策略。

    • 从过期字典中随机 20 个 key;
      删除这 20 个 key 中已经过期的 key;
      如果过期的 key 比率超过 1/4,那就重复步骤 1;
      同时,为了保证过期扫描不会出现循环过度,导致线程卡死现象,算法还增加了扫描时间的上限,默认不会超过 25ms。

    设想一个大型的 Redis 实例中所有的 key 在同一时间过期了,会出现怎样的结果?

    毫无疑问,Redis 会持续扫描过期字典 (循环多次),直

    展开全文
  • Redis过期策略

    2021-03-12 09:39:06
    Redis所有的数据结构都可以设置过期时间,时间一到就会自动删除。 思考:Redis是单线程的...Redis默认每秒进行十次过期扫描,过期扫描不会遍历过期字典中的所有key,而是采用了一种简单的贪心策略。 从过期字典中随机

    Redis所有的数据结构都可以设置过期时间,时间一到就会自动删除。
    思考:Redis是单线程的,删除key的时间也会占用线程的处理时间,如果删除过于频繁,会导致CPU负载过高吗,会导致线上读写指令出现卡顿吗?
    下面来谈谈Redis的两种删除策略。

    两种删除策略

    定时删除(集中处理)

    Redis会将每个设置了过期时间的key放入到一个独立的字典中,定时遍历这个字典来删除到期的key。
    Redis默认每秒进行十次过期扫描,过期扫描不会遍历过期字典中的所有key,而是采用了一种简单的贪心策略。

    1. 从过期字典中随机20个key;
    2. 删除这20个key中已经过期的key;
    3. 如果过期Key的比率超过四分之一,重复步骤1。

    同时为了保证不会出现循环过度导致线程卡死,算法增加了扫描时间上线(默认25ms)。

    惰性删除(零散处理)

    Redis在客户端访问这个key的时候,会对key的过期时间进行检查,如果过期了就立即删除。

    Redis中大量key同一时间过期问题

    Redis实例中存在大量同一时间过期的key过期时,Redis会持续扫描过期(循环多次),直到过期字段中过期的key变得稀疏,才会停止(循环次数明显下降)。这就会导致线上读写请求出现明显的卡顿现象。导致这种卡顿的另外一种原因是内存管理器需要频繁的回收内存页,产生CPU消耗。
    扫描上线25ms看起来不会导致卡顿,假设101个客户端同事将请求发送过来,前100个请求的执行时间都是25ms,那么第101个指令需要等待2500ms才能执行,这就是客户端卡顿时间,由于服务器不间断的小卡顿积少成多。
    所以开发时需要注意过期时间,如果有大批量key过期,要给过期时间设置一个随机范围,而不能全部在同一时间过期。
    实践中如电商降价活动是一期一期举办的,下期举办时,前面几期的数据可以过期了,所以一般都会设置一个过期时间,减少不必要的内存占用,这个时候就需要将这些同时设置过期时间的商品使用固定时间+随机时间,让这些key不会同时过期。

    从库的过期策略

    从库不会进行定期扫描,对过期的处理是被动的。主库在key到期时,会在AOF文件里面增加一条del命令,同步到所有的从库,从库通过执行这条del指令来删除过期的key。
    因为指令同步是异步进行的,所以主库过期的key的del指令没有及时同步到从库的话,会出现主从数据不一致的情况。例如集群环境下分布式锁的算法漏洞就是因为这个同步延时产生的。

    展开全文
  • 7.Redis过期策略底层是如何实现的?

    万次阅读 2021-08-08 17:43:01
    如果我们对key设置了失效时间1分钟,1分钟后,Redis 是如何对这个 key 进行删除的呢?Redis过期策略采用的是惰性删除+定期删除策略。
  • Redis过期策略与缓存问题
  • Redis面试题 Redis过期策略及实现原理 Redis过期策略及实现原理 描述 我们在使用 Redis 时,一般会设置一个过期时间,当然也有不设置过期时间的,也就是永久不过期。当我们设置了过期时间,Redis 是如何判断是否过期...
  • redis 过期策略 Redis是key-value类缓存数据库,我们在设置Redis中缓存的key时可以设置过期时间。 那么Redis是如何处理过期的key 呢? 这就要谈到Redis过期策略了。 过期策略通常有以下三种: 定时过期:每个设置...
  • Redis过期策略与内存淘汰机制总结 redis常用于有时间限制的数据存储,可以在set key的时候给一个expire time(过期时间),通过设置过期时间可以指定这个key可以存活的时间,那么设定的过期时间到了后,redis是怎么对...
  • REDIS 过期策略(简)

    2018-07-24 10:24:22
    redis 过期策略 redis 过期策略惰性删除+定期删除 1、惰性删除数据 触发 redis 数据操作 >> 判断过期 >> 过期删除 >> 不过期 执行操作 2、定期删除数据 定期扫描 redis 数据库 >> 随机获取 ...
  • Redis缓存作为提高系统性能最好的方式相信大家对其一定不陌生,各位作为秃头老码农不仅需要掌握Redis的基础用法还得了解Redis的相关原理,比如Redis过期策略和内存淘汰机制。大家都...
  • 面试题redis过期策略都有哪些?内存淘汰机制都有哪些?手写一下 LRU 代码实现?面试官心理分析面试题剖析redis 过期策略redis 过期策略是:定期删除+惰性...
  • redis 过期策略 redis 过期策略是:定期删除+惰性删除。 所谓定期删除,指的是 redis 默认是每隔 100ms 就随机抽取一些设置了过期时间的 key,检查其是否过期,如果过期就删除。 假设 redis 里放了 10w 个 key,都...
  • Redis是基于内存操作的非关系型数据库,Redis中提供了多种内存回收策略,当内存容量不足时,为了保证程序的运行,这时... ①Redis过期策略:删除已经过期的数据; ②Redis淘汰策略:内存使用到达maxmemory上限时触...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 46,523
精华内容 18,609
关键字:

redis过期策略

redis 订阅