• Redis过期策略及内存淘汰机制


    redis中缓存的数据是有过期时间的,当缓存数据失效时,redis会删除过期时间以节省内存,那redis是如何删除过期数据的?删除过期数据的策略是什么?Redis过期策略是怎么样的?

    redis为什么这么快,原因之一就是原因之一就是Redis操作都是基于内存的,既然是基于内存的,而内存的大小是有限的,当内存不足或占用过高时,怎么办?这就是我们今天要讨论的第二个问题:Redis的内存淘汰机制。

    一、Redis的过期策略

    Redis在设置缓存数据时指定了过期时间,到了过期时间数据就失效了,那Redis是怎么处理这些失效的数据的呢?这就用到了Redis的过期策略——“定期删除+惰性删除” 。

    1、定期删除

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

    1、100ms怎么来的?

    在Redis的配置文件redis.conf中有一个属性"hz",默认为10,表示1s执行10次定期删除,即每隔100ms执行一次,可以修改这个配置值。
    在这里插入图片描述

    2、随机抽取一些检测,一些是多少?

    同样是由redis.conf文件中的maxmemory-samples属性决定的,默认为5。
    在这里插入图片描述

    3、为什么是随机抽取部分检测,而不是全部?

    因为如果Redis里面有大量key都设置了过期时间,全部都去检测一遍的话CPU负载就会很高,会浪费大量的时间在检测上面,甚至直接导致redis挂掉。所有只会抽取一部分而不会全部检查。

    正因为定期删除只是随机抽取部分key来检测,这样的话就会出现大量已经过期的key并没有被删除,这就是为什么有时候大量的key明明已经过了失效时间,但是redis的内存还是被大量占用的原因 ,为了解决这个问题,Redis又引入了“惰性删除策略”。

    2、惰性删除

    惰性删除不是去主动删除,而是在你要获取某个key 的时候,redis会先去检测一下这个key是否已经过期,如果没有过期则返回给你,如果已经过期了,那么redis会删除这个key,不会返回给你。

    "定期删除+惰性删除"就能保证过期的key最终一定会被删掉 ,但是只能保证最终一定会被删除,要是定期删除遗漏的大量过期key,我们在很长的一段时间内也没有再访问这些key,那么这些过期key不就一直会存在于内存中吗?不就会一直占着我们的内存吗?这样不还是会导致redis内存耗尽吗?由于存在这样的问题,所以redis又引入了“内存淘汰机制”来解决。

    二、Redis内存淘汰机制

    内存淘汰机制就能保证在redis内存占用过高的时候,去进行内存淘汰,也就是删除一部分key,保证redis的内存占用率不会过高,那么它会淘汰哪些key呢?Redis目前共提供了8种内存淘汰策略,含Redis 4.0版本之后又新增的两种LFU模式:volatile-lfu和allkeys-lfu。
    在这里插入图片描述

    1、什么时候会执行内存淘汰策略,内存占用率过高的标准是什么?

    redis.conf配置文件中的 maxmemory 属性限定了 Redis 最大内存使用量,当占用内存大于maxmemory的配置值时会执行内存淘汰策略。

    2、内存淘汰策略的配置

    内存淘汰机制由redis.conf配置文件中的maxmemory-policy属性设置,没有配置时默认为no-eviction模式。

    3、淘汰策略的执行过程

    > 客户端执行一条命令,导致Redis需要增加数据(比如set key value);
    > Redis会检查内存使用情况,如果内存使用超过 maxmemory,就会按照配置的置换策略maxmemory-policy删除一些key;
    > 再执行新的数据的set操作;
    
    • 1
    • 2
    • 3

    三、其他场景对过期key的处理

    1、快照生成RDB文件时
    过期的key不会被保存在RDB文件中。

    2、服务重启载入RDB文件时
    Master载入RDB时,文件中的未过期的键会被正常载入,过期键则会被忽略。Slave 载入RDB 时,文件中的所有键都会被载入,当主从同步时,再和Master保持一致。

    3、AOF 文件写入时
    因为AOF保存的是执行过的Redis命令,所以如果redis还没有执行del,AOF文件中也不会保存del操作,当过期key被删除时,DEL 命令也会被同步到 AOF 文件中去。

    4、重写AOF文件时
    执行 BGREWRITEAOF 时 ,过期的key不会被记录到 AOF 文件中。

    5、主从同步时
    Master 删除 过期 Key 之后,会向所有 Slave 服务器发送一个 DEL命令,Slave 收到通知之后,会删除这些 Key。
    Slave 在读取过期键时,不会做判断删除操作,而是继续返回该键对应的值,只有当Master 发送 DEL 通知,Slave才会删除过期键,这是统一、中心化的键删除策略,保证主从服务器的数据一致性。

  • 相关阅读:
    【Spring5】使用JdbcTemplate操作mysql数据库
    springcloud整合seata我踩过的坑
    JSP(java服务器页面)
    Java多种方式向图片添加自定义水印、图片转换及webp图片压缩
    缓存穿透、雪崩与击穿
    js将一组数据从大到小排序方法
    docker部署 spring-boot 项目,验证码获取报错的解决方法
    SpringBoot添加过滤器详解
    JDK中线程池的使用
    @zabbix数据库历史与趋势数据占用优化(mysql存储查询)
  • 原文地址:https://blog.csdn.net/java123456111/article/details/126054713