Redis之淘汰策略

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容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数据库实现在线游戏中的游戏玩家积分排行榜功能。
目录
相关文章
|
10月前
|
NoSQL Redis
Redis的数据淘汰策略有哪些 ?
Redis 提供了 8 种数据淘汰策略,分为淘汰易失数据和淘汰全库数据两大类。易失数据淘汰策略包括:volatile-lru、volatile-lfu、volatile-ttl 和 volatile-random;全库数据淘汰策略包括:allkeys-lru、allkeys-lfu 和 allkeys-random。此外,还有 no-eviction 策略,禁止驱逐数据,当内存不足时新写入操作会报错。
1003 16
|
6月前
|
NoSQL Redis
Redis的数据淘汰策略有哪些 ?
Redis 提供 8 种数据淘汰策略: 淘汰易失数据(具有过期时间的数据) 1. volatile-lru(least recently used):从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰 2. volatile-lfu(least frequently used):从已设置过期时间的数据集(server.db[i].expires)中挑选最不经常使用的数据淘汰 3. volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰 4. volatile-random:从已设置过期
|
6月前
|
NoSQL Redis
Redis的数据持久化策略有哪些 ?
Redis 提供了两种方式,实现数据的持久化到硬盘。 1. RDB 持久化(全量),是指在指定的时间间隔内将内存中的数据集快照写入磁盘。 2. AOF持久化(增量),以日志的形式记录服务器所处理的每一个写、删除操作 RDB和AOF一起使用, 在Redis4.0版本支持混合持久化方式 ( 设置 aof-use-rdb-preamble yes )
|
6月前
|
存储 NoSQL Redis
Redis的数据过期策略有哪些 ?
1. 惰性删除 :只会在取出 key 的时候才对数据进行过期检查。这样对 CPU 最友好,但是可能会造成太多过期 key 没有被删除。数据到达过期时间,不做处理。等下次访问该数据时,我们需要判断 a. 如果未过期,返回数据 b. 发现已过期,删除,返回nil 2. 定期删除 : 每隔一段时间抽取一批 key 执行删除过期 key 操作。并且,Redis 底层会通过限制删除操作执行的时长和频率来减少删除操作对 CPU 时间的影响。默认情况下 Redis 定期检查的频率是每秒扫描 10 次,用于定期清除过期键。当然此值还可以通过配置文件进行设置,在 redis.conf 中修改配置“hz”
|
9月前
|
NoSQL 算法 Redis
redis内存淘汰策略
Redis支持8种内存淘汰策略,包括noeviction、volatile-ttl、allkeys-random、volatile-random、allkeys-lru、volatile-lru、allkeys-lfu和volatile-lfu。这些策略分别针对所有键或仅设置TTL的键,采用随机、LRU(最近最久未使用)或LFU(最少频率使用)等算法进行淘汰。
231 5
|
9月前
|
NoSQL 安全 Redis
redis持久化策略
Redis 提供了两种主要的持久化策略:RDB(Redis DataBase)和AOF(Append Only File)。RDB通过定期快照将内存数据保存为二进制文件,适用于快速备份与恢复,但可能因定期保存导致数据丢失。AOF则通过记录所有写操作来确保数据安全性,适合频繁写入场景,但文件较大且恢复速度较慢。两者结合使用可增强数据持久性和恢复能力,同时Redis还支持复制功能提升数据可用性和容错性。
175 5
|
10月前
|
存储 NoSQL Redis
Redis的数据过期策略有哪些 ?
Redis 采用两种过期键删除策略:惰性删除和定期删除。惰性删除在读取键时检查是否过期并删除,对 CPU 友好但可能积压大量过期键。定期删除则定时抽样检查并删除过期键,对内存更友好。默认每秒扫描 10 次,每次检查 20 个键,若超过 25% 过期则继续检查,单次最大执行时间 25ms。两者结合使用以平衡性能和资源占用。
149 11
|
10月前
|
存储 缓存 监控
利用 Redis 缓存特性避免缓存穿透的策略与方法
【10月更文挑战第23天】通过以上对利用 Redis 缓存特性避免缓存穿透的详细阐述,我们对这一策略有了更深入的理解。在实际应用中,我们需要根据具体情况灵活运用这些方法,并结合其他技术手段,共同保障系统的稳定和高效运行。同时,要不断关注 Redis 缓存特性的发展和变化,及时调整策略,以应对不断出现的新挑战。
167 10
|
10月前
|
缓存 监控 NoSQL
Redis 缓存穿透及其应对策略
【10月更文挑战第23天】通过以上对 Redis 缓存穿透的详细阐述,我们对这一问题有了更深入的理解。在实际应用中,我们需要根据具体情况综合运用多种方法来解决缓存穿透问题,以保障系统的稳定运行和高效性能。同时,要不断关注技术的发展和变化,及时调整策略,以应对不断出现的新挑战。
152 4
|
11月前
|
缓存 分布式计算 NoSQL
大数据-47 Redis 缓存过期 淘汰删除策略 LRU LFU 基础概念
大数据-47 Redis 缓存过期 淘汰删除策略 LRU LFU 基础概念
212 2