Redis之淘汰策略

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis之淘汰策略

redis内存不足时的淘汰策略

一般情况下,当内存超出物理内存限制时,内存数据将与磁盘产生频繁交换(swap),swap会导致redis性能急剧下降,对于访问量较大的情况下,swap的存取效率会让服务基本处于不可用的状态。

在生产环境中,一般不允许redis出现swap行为,redis提供了 maxmemory 设置其最多可占用的内存空间。

当redis使用的内存超出maxmemory时,此时已经没有多余可用的内存空间,新的数据将无法写入,redis提供了几种数据淘汰策略,用于清理数据,腾出空间以继续提供服务。

淘汰策略

  1. noeviction

    不会继续服务写请求(del请求可以),读请求可以继续进行,即可读不可写,该策略不会丢失数据,但是同样生产的写请求不可用也会让业务无法进行下去,这种策略是默认策略。

  2. volatile-lru

    淘汰具有过期时间的key,最少使用的key优先淘汰,没有过期时间的key不会被淘汰,该策略可以保证持久化的数据不被丢失。

  3. volatile-ttl

    与 2 类似,区别是比较过期时间ttl的值,值越小越优先淘汰。

  4. volatile-random

    与 2、3 类似,区别是随机淘汰具备过期时间的key,不分使用频率和过期时间长短。

  5. allkeys-lru

    与 2 类似,不过该淘汰策略范围是redis中的所有key,不区分是否有过期时间,但是区分使用频率。

  6. allkeys-random

    与 5 类似,范围是所有的key,但是不区分使用频率。

volatile开头的只会淘汰带有过期时间的key,allkeys则是所有的key,如果redis只是作为缓存使用,可以使用allkeys,如果有些数据是务必持久化的,则使用volatile。

LRU算法

LRU 即 Least Recently Used (最近最少使用) 算法,常用于操作系统的页面置换,以及一些常见框架的缓存数据淘汰,原理是空间不够时,选择一些最近没有使用过的数据进行淘汰。

实现LRU算法,需要一个key/value字典,以及一个链表,链表中的元素按照一定的顺序进行排列,当字典中的某个元素被访问时,其在链表中的位置将移动到表头,当空间满时,淘汰掉链表尾部的元素,所以链表的排序方式就是最近被访问的时间顺序。

LinkedHashMap

Java中的LinkedHashMap可以帮我们实现一个LRU功能, 如下方demo,LinkedHashMap构造函数第三个值意思是根据插入顺序排序还是根据访问顺序排序,

removeEldestEntry方法默认返回false,当返回true时,将移除最久没有使用的节点,因此当容量到达缓存限制时,进行移除节点操作。

public static void main(String[] args) {
    // 最多缓存数量
    int cacheSize = 3;
    // 负载因子
    float loadFactor = 0.75f;
    // 最大容量 = (缓存大小 / 负载因子)+ 1,保证不会触发自动扩容
    int capacity = (int) (cacheSize / loadFactor) + 1;
    LinkedHashMap<String, String> cache = new LinkedHashMap<String, String>(capacity, loadFactor, true) {
        @Override
        protected boolean removeEldestEntry(Map.Entry eldest) {
            return size() > cacheSize;
        }
    };
    cache.put("1", "1");
    cache.put("2", "2");
    cache.put("3", "3");
    System.out.println(cache);
    cache.put("4", "4");
    System.out.println(cache);
}

image.png

LinkedHashMap实现思路大致是:

  1. 用链表存储数据
  2. 一个节点被访问后,将其置于链表尾
  3. 链表头结点就是最近最久未使用的节点,直接移除即可

近似LRU算法

Redis使用近似LRU算法,因为LRU算法还需要一个链表按照访问时间顺序保存节点,这将占用大量的额外内存,

近似LRU算法是Redis在现有的数据结构基础上使用随机采样法来淘汰元素,可以达到与LRU算法非常近似的效果,Redis给每个key增加了一个额外的小字段,长度为24个bit,用于保存最后一次访问的时间戳。

随机采样

近似LRU算法触发是在Redis执行写操作时,发现内存超出 maxmemory 的值了,就会执行一次该算法,通过随机采样出 maxmemory_samples (默认值为5) 个key,然后淘汰掉最旧的一个key,如果淘汰后内存还是超出maxmemory,那就继续随机采样淘汰,直到低于maxmemory。

采样的数据根据 maxmemory-policy 的设置决定,如果是allkeys,在所有的字典key中进行采样,如果是volatile,则在具有过期时间key的字典中采样,采样的数量根据 maxmemory_samples 配置得来,采样数量越大,近似LRU算法的效果越接近严格LRU算法,

同时在Redis3.0中,还增加了一个淘汰池数组,大小是 maxmemory_samples,在每一次淘汰循环中,新的采样出来的key会和淘汰池中的key进行融合,淘汰掉最旧的一个key,然后将剩余最旧的key列表放入淘汰池,等待下次循环。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
7天前
|
NoSQL Redis
Redis的数据淘汰策略有哪些 ?
Redis 提供了 8 种数据淘汰策略,分为淘汰易失数据和淘汰全库数据两大类。易失数据淘汰策略包括:volatile-lru、volatile-lfu、volatile-ttl 和 volatile-random;全库数据淘汰策略包括:allkeys-lru、allkeys-lfu 和 allkeys-random。此外,还有 no-eviction 策略,禁止驱逐数据,当内存不足时新写入操作会报错。
39 16
|
7天前
|
存储 NoSQL Redis
Redis的数据过期策略有哪些 ?
Redis 采用两种过期键删除策略:惰性删除和定期删除。惰性删除在读取键时检查是否过期并删除,对 CPU 友好但可能积压大量过期键。定期删除则定时抽样检查并删除过期键,对内存更友好。默认每秒扫描 10 次,每次检查 20 个键,若超过 25% 过期则继续检查,单次最大执行时间 25ms。两者结合使用以平衡性能和资源占用。
29 11
|
19天前
|
存储 缓存 监控
利用 Redis 缓存特性避免缓存穿透的策略与方法
【10月更文挑战第23天】通过以上对利用 Redis 缓存特性避免缓存穿透的详细阐述,我们对这一策略有了更深入的理解。在实际应用中,我们需要根据具体情况灵活运用这些方法,并结合其他技术手段,共同保障系统的稳定和高效运行。同时,要不断关注 Redis 缓存特性的发展和变化,及时调整策略,以应对不断出现的新挑战。
53 10
|
19天前
|
缓存 监控 NoSQL
Redis 缓存穿透及其应对策略
【10月更文挑战第23天】通过以上对 Redis 缓存穿透的详细阐述,我们对这一问题有了更深入的理解。在实际应用中,我们需要根据具体情况综合运用多种方法来解决缓存穿透问题,以保障系统的稳定运行和高效性能。同时,要不断关注技术的发展和变化,及时调整策略,以应对不断出现的新挑战。
42 4
|
1月前
|
缓存 分布式计算 NoSQL
大数据-47 Redis 缓存过期 淘汰删除策略 LRU LFU 基础概念
大数据-47 Redis 缓存过期 淘汰删除策略 LRU LFU 基础概念
62 2
|
1月前
|
存储 缓存 NoSQL
【redis】数据量庞大时的应对策略
【redis】数据量庞大时的应对策略
36 2
|
1月前
|
NoSQL Redis
redis 的 key 过期策略是怎么实现的(经典面试题)超级通俗易懂的解释!
本文解释了Redis实现key过期策略的方式,包括定期删除和惰性删除两种机制,并提到了Redis的内存淘汰策略作为补充,以确保过期的key能够被及时删除。
54 1
|
2月前
|
缓存 监控 NoSQL
阿里面试让聊一聊Redis 的内存淘汰(驱逐)策略
大家好,我是 V 哥。粉丝小 A 面试阿里时被问到 Redis 的内存淘汰策略问题,特此整理了一份详细笔记供参考。Redis 的内存淘汰策略决定了在内存达到上限时如何移除数据。希望这份笔记对你有所帮助!欢迎关注“威哥爱编程”,一起学习与成长。
|
2月前
|
存储 缓存 NoSQL
Redis 过期删除策略与内存淘汰策略的区别及常用命令解析
Redis 过期删除策略与内存淘汰策略的区别及常用命令解析
71 0
|
2月前
|
NoSQL Java API
Redis数据淘汰策略的详细介绍
通过上述步骤,我们不仅解决了一个实际问题,也进一步了解了Java 8时间API的强大功能和灵活性。希望这个解答能够帮助你在日常开发中更加自如地处理时间和时区相关的问题。
36 0