Redis的内存淘汰策略是怎么样的?

淘汰策略

Redis 的内存淘汰策略用于在内存满了之后,决定哪些 key 要被删除。Redis 支持多种内存淘汰策略,可以通过面置文件中的 maxmemory-policy 参数来指定。
以下是 Redis 支持的内存淘汰策略

  • noeviction:不会淘汰任何键值对,而是直接返回错误信息,
  • allkeys-lru:从所有 key 中选择最近最少使用的那个 key 并删除。
  • volatile-lru:从设置了过期时间的 key 中选择最近最少使用的那个 key 并删除。
  • allkeys-random:从所有 key 中随机选择-个 key 并删除。
  • volatile-random:从设置了过期时间的 key 中随机选择一个 key 并删除。
  • volatile-tt1:从设置了过期时间的 key 中选择剩余时间最短的 key 并删除。
  • volatile-lfu:淘汰的对象是带有过期时间的键值对中,访问频率最低的那个。
  • allkeys-lfu:淘汰的对象则是所有键值对中,访问频率最低的那个。

缓存失效算法

缓存失效算法主要是进行缓存失效的,当缓存中的存储的对象过多时,需要通过一定的算法选择出需要被淘汰的对象,一个好的算法对缓存的命中率影响是巨大的。常见的缓存失效算法有FIFO、LRU、LFU,以及Caffeine中的Window TinyLFU算法。

1、FIFO

FIFO 算法是一种比较容易实现也最容易理解的算法。它的主要思想就是和队列是一样的,即先进先出(first InFirst Out)
般认为一个数据是最先进入的,那么可以认为在将来它被访问的可能性很小。
因为FIFO刚好符合队列的特性,所以通常FIFO的算法都是使用队列来实现的:

1.新数据插入到队列尾部,数据在队列中顺序移动,
2.淘汰队列头部的数据

2、LRU

LRU(The Least Recently Used,最近最少使用)是一种常见的缓存算法,在很多分布式缓存系统(如RedisMemcached)中都有广泛使用。
LRU算法的思想是:如果一个数据在最近一段时间没有被访问到,那么可以认为在将来它被访问的可能性也很小。
因此,当空间满时,最久没有访问的数据最先被淘汰。
最常见的实现是使用一个链表保存缓存数据,详细算法实现如下:

  1. 新数据插入到链表头部;
  2. 每当缓存命中,则将数据移到链表头部;
  3. 当链表满的时候,将链表尾部的数据丢弃,

3、LFU

LFU(Least Frequently Used ,最近最不常用)也是一种常见的缓存算法。
顾名思义,LFU算法的思想是:如果一个数据在最近一段时间很少被访问到,那么可以认为在将来它被访问的可能性也很小。因此,当空间满时,最小频率访问的数据最先被淘汰。
LFU的每个数据块都有一个引用计数,所有数据块按照引用计数排序,具有相同引用计数的数据块则按照时间排序。
具体实现如下:

  1. 新加入数据插入到队列尾部(因为引用计数为1);
  2. 队列中的数据被访问后,引用计数增加,队列重新排序:
  3. 当需要淘汰数据时,将已经排序的列表最后的数据块删除。

4、W-TinyLFU

LFU 通常能带来最佳的缓存命中率,但 LFU 有三个缺点:

  1. 它需要给每个记录项维护频率信息,每次访问都需要更新,需要一个巨大的空间记录所有出现过的 key 和其对应的频次;
  2. 如果数据访问模式随时间有变,LFU 的频率信息无法随之变化,因此早先频繁访问的记录可能会占据缓存而后期访问较多的记录则无法被命中;
  3. 如果一个刚加入缓存的元素,它的频率并不高,那么它可能会会直接被淘汰。

其中第一点过于致命导致我们通常不会使用 LFU。我们最常用的 LRU 实现简单,内存占用低,但其并不能反馈访问频率。LFU 通常需要较大的空间才能保证较好的缓存命中率。
W-TinyLFU是一种高效的缓存淘汰算法,它是TinyLFU算法的一种改进版本,主要用于处理大规模缓存系统中的淘汰问题。W-TinyLFU的核心思想是基于窗口的近似最少使用算法,即根据数据的访问模式动态地调整缓存中数据的淘汰策略。W-TinyLFU 综合了LRU和LFU的长处:高命中率、低内存占用。
W-TinyLFU由多个部分组合而成,包括窗口缓存、过滤器和主缓存

使用LRU来作为一个窗口缓存,主要是让元素能够有机会在窗口缓存中去积累它的频率,避免因为频率很低而直接被淘汰。
主缓存是使用SLRU,元素刚进入W-TinyLFU会在窗口缓存暂留一会,被挤出窗口缓存时,会在过滤器中和主缓存中最容易被淘汰的元素进行PK,如果频率大于主缓存中这个最容易被淘汰的元素,才能进入主缓存。

如何选择

以下是腾讯针对Redis的淘汰策略设置给出的建议:

  • 当 Redis 作为缓存使用的时候,推荐使用 alkeys-lru 淘汰策略。该策略会将最近最少使用的 Key 淘汰。默认情况下,使用频率最低则后期命中的概率也最低,所以将其淘汰。
  • 当 Redis 作为半缓存半持久化使用时,可以使用 volatile-lru。但因为 Redis 本身不建议保存持久化数据所以只作为备选方案。

阿里云Redis默认是volatile-lru(https://www.alibabacloud.com/help/zh/redis/user-guide/how-does.apsaradb-for-redis-evict-data-by-default )

腾讯云默认是noeviction,即不删除键。在内存占满后会出现 OOM 问题,所以建议创建好实例后修改淘汰策略,减少 OOM 问题的出现。(https://cloud.tencent.com/document/product/239/90960)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/539869.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全新升级SQLCoder-7B-2:领先的自然语言至SQL转换模型,性能显著提升

前言 随着数据科学和机器学习技术的不断进步,自然语言处理(NLP)已成为连接人类语言和计算机编程之间的重要桥梁。在这个交汇点上,SQLCoder-7B-2模型的最新升级引领了一场革命,特别是在自然语言至SQL生成方面&#xff…

Java代码基础算法练习---2024.3.14

其实这就是从我学校的资源,都比较基础的算法题,先尽量每天都做1-2题,练手感。毕竟离我真正去尝试入职好的公司(我指的就是中大厂,但是任重道远啊),仍有一定的时间,至少要等我升本之后…

unity3d Animal Controller的Animal组件中Speeds,States和modes基础部分理解

Speeds 速度集是修改你可以做的原始动画,增加或减少运动,旋转,或动画速度。它们与 州 所以,当动物在运动状态下,在飞行或游泳时,你可以有不同的速度 如果你的性格动画是 (已到位), 你一定要调整速度 位置 和 旋转 每一种的价值观 速度装置 …否则,它们不会移动或旋转。 每个速…

Day42-企业级网络存储NFS01

Day42-企业级网络存储NFS01 1. 什么是NFS?2. 为什么要用网络共享存储?3. 共享存储的种类4. NFS工作原理5. 环境准备6. NFS软件列表7. 安装8. 配置nfs9. 项目实践作业:10. ()权限 对应参数11. 在生产中配置NFS的重要技巧:12. 项目实…

windows 11访问Debian10上的共享目录

步骤 要在Windows 11上访问Debian 10.0.0的共享目录,可以通过以下步骤来实现: 1. 设置Samba服务:在Debian系统上,需要安装并配置Samba服务,以便能够实现文件夹共享。Samba是一个允许Linux/Unix服务器与Windows操作系…

供电系统分类详解

一、供电系统分类 电力供电系统一般有5种供电模式,常用的有:IT系统,TT系统,TN系统,其中TN系统又可以分为TN-C,TN-S,TN-C-S。 1、TN-C系统(三相四线制) 优点: 该系统中…

python 调用redis创建查询key

部署redis apiVersion: apps/v1 # 描述api版本,默认都用这个 kind: Deployment # 资源类型,可以配置为pod,deployment,service,statefulset等等 metadata: # deployment相关的元数据,用于描述deployment的…

软考高级:政府信息化与电子政务(G2G 、G2E、G2B、B2G、G2C、C2C)概念和例题

作者:明明如月学长, CSDN 博客专家,大厂高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

【SysBench】Linux 安装 sysbench-1.20

安装目的是为了对 MySQL 8.0.x 、PostgreSQL 进行基准测试。 0、sysbench 简介 sysbench 是一个可编写脚本的多线程基准测试工具,基于 LuaJIT 。 它最常用于数据库基准测试,但也可以 用于创建任意不涉及数据库服务器的复杂工作负载。 sysbench 附带以…

C++ 改造红黑树,封装map和set

C 改造红黑树,封装map和set 一.前言:已经实现好了的红黑树二.简化STL库里面对于map和set的封装1.STL库中红黑树的简化代码2.STL库中set的简化代码3.STL库中map的简化代码4.封装map和set的第一步5.红黑树第一个模板参数的价值6.红黑树节点的定义 三.仿函数1.解除仿函数的误解2.仿…

python 基础知识点(蓝桥杯python科目个人复习计划63)

今日复习内容:做题 例题1:蓝桥骑士 问题描述: 小蓝是蓝桥王国的骑士,他喜欢不断突破自我。 这天蓝桥国王给他安排了N个对手,他们的战力值分别为a1,a2,...,an,且按顺序阻挡在小蓝的前方。对于这些对手小…

目前研一,是选 FPGA 还是 Linux 嵌入式?

目前研一,是选 FPGA 还是 Linux 嵌入式? 在开始前我有一些资料,是我根据网友给的问题精心整理了一份「Linux 的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!&a…