zoukankan      html  css  js  c++  java
  • Redis的过期策略和内存淘汰机制

    过期策略

      我们set key的时候,都可以给一个expire time,就是过期时间,指定这个key比如说只能存活1个小时,我们自己可以指定缓存到期就失效。

      如果假设你设置一个一批key只能存活1个小时,那么接下来1小时后,redis是怎么对这批key进行删除的?

      答案是:定期删除+惰性删除

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

      注意,这里可不是每隔100ms就遍历所有的设置过期时间的key,那样就是一场性能上的灾难。

      实际上redis是每隔100ms随机抽取一些key来检查和删除的。

      但是,定期删除可能会导致很多过期key到了时间并没有被删除掉,所以就得靠惰性删除了。

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

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

      通过上述两种手段结合起来,保证过期的key一定会被干掉。

      但是实际上这还是有问题的,如果定期删除漏掉了很多过期key,然后你也没及时去查,也就没走惰性删除,此时会怎么样?

      如果大量过期key堆积在内存里,导致redis内存块耗尽了,怎么办?

      答案是:走内存淘汰机制。

    内存淘汰机制

    内存淘汰策略:

    volatile-lru : 从已设置过期时间的数据集中挑选最近最少使用的数据淘汰。redis并不是保证取得所有数据集中最近最少使用的键值对,而只是随机挑选的几个键值对中的, 当内存达到限制的时候无法写入非过期时间的数据集。

    volatile-ttl: 从已设置过期时间的数据集中挑选将要过期的数据淘汰。redis 并不是保证取得所有数据集中最近将要过期的键值对,而只是随机挑选的几个键值对中的, 当内存达到限制的时候无法写入非过期时间的数据集。

    volatile-random: 从已设置过期时间的数据集中任意选择数据淘汰。当内存达到限制的时候无法写入非过期时间的数据集。

    allkeys-lru: 从数据集中挑选最近最少使用的数据淘汰。当内存达到限制的时候,对所有数据集挑选最近最少使用的数据淘汰,可写入新的数据集。

    allkeys-random: 从数据集中任意选择数据淘汰,当内存达到限制的时候,对所有数据集挑选随机淘汰,可写入新的数据集。

    no-enviction: 当内存达到限制的时候,不淘汰任何数据,不可写入任何数据集,所有引起申请内存的命令会报错。

      开启内存淘汰

    # maxmemory # maxmemory为0的时候表示我们对Redis的内存使用没有限制。
    # maxmemory-policy noeviction # 根据应用场景,选择淘汰策略

      动态改配置命令

      此外,redis支持动态改配置,无需重启。

    config set maxmemory 100000  #设置最大内存
    config set maxmemory-policy noeviction  #设置淘汰策略

       内存淘汰的过程

          首先,客户端发起了需要申请更多内存的命令(如set)。然后,Redis检查内存使用情况,如果已使用的内存大于maxmemory,则开始根据用户配置不同的淘汰策略来淘汰内存(key),从而换取一定的内存。最后,如果上面都没问题,则这个命令执行成功。

  • 相关阅读:
    JAVA实现接口监控报警系统
    批量插入数据、自定义分页器
    django与Ajax
    ORM优化查询、choices参数
    django之查询操作及开启事务
    django之ORM字段及参数
    数据库设计
    django之模型层
    django之模板层
    django之视图层
  • 原文地址:https://www.cnblogs.com/xuey/p/13027403.html
Copyright © 2011-2022 走看看