Redis的过期策略和内存淘汰机制

前言

Redis是基于内存存储数据的,相比MySQL能减少磁盘IO操作所带来的性能开销,但内存是有限的,例如Redis内存仅8G,你写入了10G,这个时候就需要清理掉2G数据,保留8G数据。那应该保留哪些数据,清除哪些数据,为什么有些数据过期了还占用着内存?这都是由Redis的过期策略来决定的。

一、Redis的过期策略

Redis的过期策略包含两种:定期删除和惰性删除。

1.1 定期删除

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

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

1.2 惰性删除

惰性删除是指在你获取某个key的时候,redis会检查这个key如果设置了过期时间并且已经过期了,此时就会删除,不会返回任何数据。

​但是这样还有问题:如果定期删除漏掉了很多过期的key,然后你没及时去查,所以没走惰性删除。此时依旧有可能大量过期的key堆积在内存里,导致内存耗尽。

​ 这个时候就需要内存淘汰机制了。

二、内存淘汰机制

2.1 淘汰机制

  1. noeviction: 当内存不足以容纳新写入数据时,新写入操作会报错。这个一般很少用。
  2. allkeys-lru: 当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key,这个是最常用的。
  3. allkeys-random: 当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。
  4. volatile-lru: 当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
  5. volatile-random: 当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。
  6. volatile-ttl: 当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。

2.2 LRU算法

上面的内存淘汰机制中,用到的是LRU算法:最近最少使用策略。实现LRU算法,大概的思路如下:

​维护一个有序单链表,越靠近链表尾部的节点是越早之前访问的。当有一个新的数据被访问时,我们从链表头开始顺序遍历链表:

  1. 如果此数据之前已经被缓存在链表中了,我们遍历得到这个数据对应的节点,并将其从原来的位置删除,然后再插入到链表的头部。

  2. 如果此数据没有在缓存链表中,又可以分为两种情况:
    1.如果此时缓存未满,则将此节点直接插入到链表的头部;
    2.如果此时缓存已满,则链表尾节点删除,将新的数据节点插入链表的头部。

相关推荐

  1. redis过期策略内存淘汰机制redis篇)

    2024-02-02 00:12:02       12 阅读
  2. Redis过期策略内存淘汰机制

    2024-02-02 00:12:02       32 阅读
  3. 深入了解Redis过期策略内存淘汰机制

    2024-02-02 00:12:02       25 阅读
  4. Redis过期清理策略内存淘汰机制

    2024-02-02 00:12:02       42 阅读
  5. Redis过期删除策略内存淘汰机制

    2024-02-02 00:12:02       20 阅读
  6. redis过期策略以及内存淘汰机制

    2024-02-02 00:12:02       22 阅读
  7. Redis过期策略以及内存淘汰机制

    2024-02-02 00:12:02       6 阅读
  8. 简述Redis过期策略内存淘汰机制

    2024-02-02 00:12:02       10 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-02 00:12:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-02 00:12:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-02 00:12:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-02 00:12:02       18 阅读

热门阅读

  1. Spring Cloud Gateway 修改请求体、响应体

    2024-02-02 00:12:02       32 阅读
  2. 重回一年级,请问你们还知道余数是什么吗

    2024-02-02 00:12:02       26 阅读
  3. Git分布式版本控制系统

    2024-02-02 00:12:02       29 阅读
  4. 【LNMP】RHEL8.3安装LNMP并配置freetds连接MSSQL

    2024-02-02 00:12:02       31 阅读
  5. 【C语言】va_list(可变参数处理)

    2024-02-02 00:12:02       29 阅读
  6. 工厂方法入门

    2024-02-02 00:12:02       35 阅读