Redis之淘汰策略

本文涉及的产品
云数据库 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
目录
相关文章
|
15天前
|
NoSQL Redis
05- Redis的数据淘汰策略有哪些 ?
Redis 提供了 8 种数据淘汰策略:挥发性 LRU、LFU 和 TTL(针对有过期时间的数据),挥发性随机淘汰,以及全库的 LRU、LFU 随机淘汰,用于在内存不足时选择删除。另外,还有不淘汰策略(no-eviction),允许新写入操作报错而非删除数据。
182 1
|
27天前
|
缓存 监控 NoSQL
【Redis性能瓶颈揭秘】「调优系列」深入分析热Key的排查策略和解决方案
【Redis性能瓶颈揭秘】「调优系列」深入分析热Key的排查策略和解决方案
171606 2
|
1月前
|
缓存 监控 NoSQL
解析Redis缓存雪崩及应对策略
解析Redis缓存雪崩及应对策略
|
9天前
|
缓存 NoSQL Java
使用Redis进行Java缓存策略设计
【4月更文挑战第16天】在高并发Java应用中,Redis作为缓存中间件提升性能。本文探讨如何使用Redis设计缓存策略。Redis是开源内存数据结构存储系统,支持多种数据结构。Java中常用Redis客户端有Jedis和Lettuce。缓存设计遵循一致性、失效、雪崩、穿透和预热原则。常见缓存模式包括Cache-Aside、Read-Through、Write-Through和Write-Behind。示例展示了使用Jedis实现Cache-Aside模式。优化策略包括分布式锁、缓存预热、随机过期时间、限流和降级,以应对缓存挑战。
|
16天前
|
NoSQL 安全 Redis
redis内存限制与淘汰策略
Redis内存管理包括限制和淘汰策略。`maxmemory`配置参数决定内存上限,无设置时64位系统默认不限制,可能导致系统资源耗尽,生产环境建议设定合理值。当内存满时,未设置淘汰策略会导致写入错误。Redis提供8种淘汰策略,如LRU(最近最少使用)和LFU(最不经常使用),以及随机或基于过期时间的删除。需根据数据重要性、访问频率和一致性选择合适策略。
153 0
|
23天前
|
存储 缓存 NoSQL
Redis的内存淘汰策略是什么?
【4月更文挑战第2天】Redis内存淘汰策略在内存满时,通过删除旧数据为新数据腾空间。策略包括:volatile-lru/LFU(基于LRU/LFU算法淘汰有过期时间的键),volatile-random/ttl(随机/按TTL淘汰),allkeys-lru/LFU(所有键的LRU/LFU),allkeys-random(随机淘汰所有键),以及noeviction(不淘汰,返回错误)。选择策略要考虑访问模式、数据重要性和性能需求。
|
2月前
|
存储 NoSQL Redis
Redis淘汰策略、持久化、主从同步与对象模型
Redis淘汰策略、持久化、主从同步与对象模型
90 0
|
3月前
|
缓存 算法 NoSQL
Redis 为何使用近似 LRU 算法淘汰数据,而不是真实 LRU?
Redis 为何使用近似 LRU 算法淘汰数据,而不是真实 LRU?
29 0
|
3月前
|
存储 缓存 NoSQL
Redis 数据结构+线程模型+持久化+内存淘汰+分布式
Redis 数据结构+线程模型+持久化+内存淘汰+分布式
311 0
|
3月前
|
存储 缓存 NoSQL
Redis如何实现LRU(Least Recently Used)淘汰策略?
Redis如何实现LRU(Least Recently Used)淘汰策略?
44 0

热门文章

最新文章