• Redis的内存回收原理,及内存过期淘汰策略详解


    Redis 内存回收机制
    Redis 的内存回收主要围绕以下两个方面:

    1.Redis 过期策略:删除过期时间的 key 值

    2.Redis 淘汰策略:内存使用到达 maxmemory 上限时触发内存淘汰数据

    Redis 的过期策略和内存淘汰策略不是一件事,实际研发中不要弄混淆了,下面会完整的介绍两者。

    Redis过期策略
    过期策略通常有以下三种:

    1.定时过期
    每个设置过期时间的 key 都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的 CPU 资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。

    2.惰性过期
    只有当访问一个 key 时,才会判断该 key 是否已过期,过期则清除。该策略可以最大化地节省 CPU 资源,却对内存非常不友好。极端情况可能出现大量的过期 key 没有再次被访问,从而不会被清除,占用大量内存。

    3.定期过期
    每隔一定的时间,会扫描一定数量的数据库的 expires 字典中一定数量的 key,并清除其中已过期的 key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得 CPU 和内存资源达到最优的平衡效果。

    Redis中同时使用了惰性过期和定期过期两种过期策略。

    Redis 淘汰策略
    1.简介
    Redis 的内存淘汰策略,是指当内存使用达到 maxmemory 极限时,需要使用 LAU 淘汰算法来决定清理掉哪些数据,以保证新数据的存入。

    2、LRU 算法
    Redis 默认情况下就是使用 LRU 策略算法。

    LRU 算法(least RecentlyUsed),最近最少使用算法,也就是说默认删除最近最少使用的键。

    但是一定要注意一点!redis 中并不会准确的删除所有键中最近最少使用的键,而是随机抽取 3 个键,删除这三个键中最近最少使用的键。

    那么 3 这个数字也是可以可以设置采样的大小,如果设置为 10,那么效果会更好,不过也会耗费更多的 CPU 资源。对应位置是配置文件中的 maxmeory-samples。

    3.缓存清理配置
    maxmemory 用来设置 redis 存放数据的最大的内存大小,一旦超出这个内存大小之后,就会立即使用 LRU 算法清理掉部分数据。

    对于 64 bit 的机器,如果 maxmemory 设置为 0,那么就默认不限制内存的使用,直到耗尽机器中所有的内存为止,但是对于 32 bit 的机器,有一个隐式的闲置就是 3GB。

    4.Redis 数据淘汰策略
    maxmemory-policy,可以设置内存达到最大闲置后,采取什么策略来处理。

    对应的淘汰策略规则如下:

    1)noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。

    2)allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key。

    3)allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 key。

    4)volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key。

    5)volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key。

    6)volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除。

    5.缓存清理的流程
    1)客户端执行数据写入操作

    2)redis server 接收到写入操作之后,检查 maxmemory 的限制,如果超过了限制,那么就根据对应的 policy 清理掉部分数据

    3)写入操作完成执行。

    总结
    redis 的内存淘汰策略用于处理内存不足时的需要申请额外空间的数据,内存淘汰策略的选取并不会影响过期的 key 的处理。过期策略用于处理过期的缓存数据。

    作者:楚阳
    链接:https://leetcode-cn.com/circle/article/ztZkJJ/
    来源:力扣(LeetCode)

  • 相关阅读:
    加解密工具类(含keystore导出pfx)
    Java使用数字证书加密通信(加解密/加签验签)
    关于javax.crypto.BadPaddingException: Blocktype错误的几种解决方法
    产生定长的随机数
    数字证书生成--加密密/加签验签
    随机指定范围内N个不重复的数
    sql2012还原sql2008备份文件语句
    uploadify API
    海量数据处理分析
    .net经验积累
  • 原文地址:https://www.cnblogs.com/myJuly/p/13624922.html
Copyright © 2020-2023  润新知