Redis高可用高性能缓存的应用系列03 - 缓存过期淘汰策略LRU、LFU

2023-11-11

概述

Redis高可用高性能缓存的应用系列的第3篇,主要介绍Redis缓存过期淘汰策略和内存淘汰策略回收的LRU和LFU的知识点进行说明。

Redis过期键删除策略

Redis设置key时,都会设置一个过期时间,那么当过期时间到了都是怎么处理的?

Redis同时使用了惰性过期和定期过期两种方式的缓存淘汰策略。

  • 惰性过期:只有当这个key被访问时,才会判断是否过期,过期则要清理掉,他可以节省CPU的资源,但是会浪费内存的资源,会出现大量过的Key没有被访问过,从而不会被清除,导致内容占用越来越大。

  • 定期过期:每隔一段时间,扫描一定数量的设置了过期时间的key,假如过期了则进行删除操作。

定期过期的执行过程

Redis默认每秒进行10次过期扫描:

1.从过期字典中随机选择20个key
2.删除这20个key中已过期的
3.如果超过25%的key过期,则重复第一步

同时,为了保证业务不受影响,Redis还设置了扫描的时间上限,默认不会超过25ms

内存淘汰策略

1.假如内存不足时,Redis会根据设置的淘汰策略,删除一些不常用的数据,保证Redis的正常使用,所有的前提都是加入键的时候如果超过Redis内存设定的限制后,Redis采用的服务。

1.noeviction: 不会在写入,写入会报错。
2.allkeys-lru:首先通过LRU算法驱逐最久没有使用的键
3.volatile-lru:首先从设置了过期时间的键集合中驱逐没有最久使用的键
4.allkeys-random:从所有过期字典中的key随机删除
5.volatile-random:从过期键的集合中随机驱逐
6.volatile-ttl:从配置了过期时间的键中,驱逐马上就要过期的键
7.volatile-lfu:从配置了过期时间的键中驱逐使用频率最少得键
8.allkeys-lfu:从所有键中使用频率最少的键

LRU

根据最近被使用的时间,距离当前最远的数据优化被淘汰,当有新增key 或者是被访问时,元素会被追加在队尾,需要淘汰时从头部开始淘汰,这个是LRU的思想。

redis-4.png

在Redis redisObject 中,维护了一个24位的时钟(有点类似于Cpu的频率),可以简单理解为Cpu对内存使用的时间戳,每个Key对应的也维护了同样24位的时间戳。

比如现在要进行LRU,首先拿到当前系统的时间钟,和Redis redisObject 内存的LRU时间钟对差值计算,差最大的进行淘汰,这里需要注意的是,全局时钟只有24位,按秒计算的话,最多可以存储194天,所以可能出现key时钟大于全局时钟的情况,但是Redis的LRU不会对全局的时钟进行比对,他会从设置了过期时间的key中进行比对。

struct redisObject {
    unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or
                            * LFU data (least significant 8 bits frequency
                            * and most significant 16 bits access time). */
};

LFU

LRU只考虑了使用的时间,但是没有考虑Key使用的次数,Redis4.0 以后,新增了LFU的淘汰策略,根据使用时间和次数最为淘汰的权重。

LFU把之前LRU的24bit拆分成两部分,16bit的时间钟和8it的访问频率,8bit比较小,在源码的evict文件中给出了数据。

uint8_t LFULogIncr(uint8_t counter) {
    if (counter == 255) return 255;
    double r = (double)rand()/RAND_MAX;
    double baseval = counter - LFU_INIT_VAL;
    if (baseval < 0) baseval = 0;
    double p = 1.0/(baseval*server.lfu_log_factor+1);
    if (r < p) counter++;
    return counter;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis高可用高性能缓存的应用系列03 - 缓存过期淘汰策略LRU、LFU 的相关文章

  • redis集群不断打印日志WSA_IO_PENDING

    当我启动redis集群的所有redis服务器时 所有这些服务器不断打印类似WSA IO PENDING clusterWriteDone的日志 9956 03 Feb 18 17 25 044 WSA IO PENDING writing
  • 为什么Redis中不建议使用KEYS?

    在Redis中 建议不要使用按键命令 https redis io commands KEYS 为什么会这样呢 是因为它的时间复杂度是 O N 吗 或者是别的什么原因 我做了下面的实验来证明KEYS命令有多么危险 当带有 KEYS 的一个命
  • 如何统计 Redis 流中未读或已确认的消息?

    使用 Redis 5 0 3 假设我们创建一个名为streamy和一个消费群体consumers XGROUP CREATE streamy consumers MKSTREAM 然后向其中添加一些消息 XADD streamy messa
  • 如何设置 Celery 以通过 ssl 与 Azure Redis 实例对话

    使用 的伟大答案 如何在microsoft azure上的django项目中配置celery redis https stackoverflow com questions 39616701 how to configure celery
  • 如果另一个键中的计数器低于零,则从集合中原子删除一个项目?

    雷迪斯2 0 3 在我的 Redis DB 中 我有一组项目 每个项目都有一个与其关联的计数器 MULTI SADD items set foo INCRBY items foo 10000 EXEC 新项目会以随机间隔添加到集合中 当用户
  • redis-cli 重定向到 127.0.0.1

    我在PC1上启动Redis集群 然后在PC2上连接它 当需要重定向到另一个集群节点时 它会显示Redirected to slot 7785 located at 127 0 0 1 但应该显示Redirected to slot 7785
  • Spring Data Redis - Lettuce连接池设置

    尝试在 spring data redis 环境中设置 Lettuce 连接池 下面是代码 Bean LettuceConnectionFactory redisConnectionFactory GenericObjectPoolConf
  • Redis 排序集和解决关系

    我正在使用 Redis 排序集来存储我正在处理的项目的排名 我们没有预料到 我们想要如何处理关系 Redis 按字典顺序对具有相同分数的条目进行排序 但我们想要做的是对具有相同分数的所有条目给予相同的排名 例如在以下情况 redis 127
  • 如何批量删除Redis中数十万个带有特殊字符的key

    我们有一个包含数十万个 Redis 键的列表 其中包含各种特殊字符 我们希望批量删除它们 对于这个问题上的类似问题 有一些很好的答案 如何使用 Redis 自动删除与模式匹配的键 https stackoverflow com questi
  • 在 Kubernetes/Openshift 中将客户端-服务器流量保持在同一区域的最佳方法?

    我们运行兼容 Kubernetes OKD 3 11 的本地 私有云集群 其中后端应用程序与用作缓存和 K V 存储的低延迟 Redis 数据库进行通信 新的架构设计将在两个地理上分布的数据中心 区域 之间平均划分工作节点 我们可以假设节点
  • Redis Docker compose无法处理RDB格式版本10

    我无法在 docker compose 文件中启动 redis 容器 我知道docker compose文件没问题 因为我的同事可以成功启动项目 我读到有一个删除 dump rdb 文件的解决方案 但我找不到它 我使用Windows机器 任
  • 如何设置和获取Redis中存储的对象?

    我试图在 redis 中存储一个对象 当我获取该对象时 它似乎不起作用 I tried u User new u name blankman redis set test u x redis get test x name error 我想
  • 有没有办法用Lettuce自动发现Redis集群中新的集群节点IP

    我有一个Redis集群 3主3从 运行在一个库伯内斯簇 该集群通过Kubernetes 服务 Kube 服务 我将我的应用程序服务器连接到 Redis 集群 使用Kube 服务作为 URI 通过 Redis 的 Lettuce java 客
  • redis - 使用哈希

    我正在使用 redis 为我的 Web 应用程序实现社交流和通知系统 我是 redis 的新手 我对哈希值及其效率有一些疑问 我读过这篇很棒的文章Instagram 帖子 http instagram engineering tumblr
  • redis dump.rdb / 保存小文件

    Context 我正在使用redis 数据库小于 100 MB 但是 我想进行每日备份 我也在 Ubuntu Server 12 04 上运行 当输入 redis cli save 我不知道 dump rdb 保存到哪里 因为 redis
  • 如何在Redis中只保存一个数据库?

    我是 Redis 新手 有一个与备份相关的问题 目前 我有一个实例在 Windows 服务器上运行 在这个实例中 我当前有一项 工作 将数据存储在一个数据库中 我不想备份这些数据 我必须创造一份新工作 我的第一个想法是将数据存储在另一个数据
  • Redis+Docker+Django - 错误 111 连接被拒绝

    我正在尝试使用 Redis 作为使用 Docker Compose 的 Django 项目的 Celery 代理 我无法弄清楚我到底做错了什么 但尽管控制台日志消息告诉我 Redis 正在运行并接受连接 事实上 当我这样做时 docker
  • Laravel 异常队列最大尝试次数超出

    我创建了一个应用程序来向多个用户发送电子邮件 但在处理大量收件人时遇到问题 该错误出现在failed jobs table Illuminate Queue MaxAttemptsExceededException App Jobs ESe
  • 在 Spring 4 中干掉通用的 RedisTemplate

    我读到你可以拥有 Autowired从 Spring 4 开始泛型 这太棒了 我有一个摘要RedisService我想参加的课程 Autowired一个通用的 RestTemplate 如下所示 public abstract class
  • docker-compose:容器之间的 Redis 连接被拒绝

    我正在尝试设置一个 docker compose 文件 该文件旨在替换运行多个进程 RQ 工作线程 RQ 仪表板和 Flask 应用程序 的单个 Docker 容器解决方案导师 http supervisord org 主机系统是 Debi

随机推荐

  • 墨刀使用笔记

    一 拖动的集中方式 1 按住空格键拖动 2 按住鼠标中间键拖动 3 永久拖动 按住空格键 Alt a 注 必须启动微信 按住空格键拖动即可取消永久拖动
  • wind10生成 SSH 公钥---实现github本地部署、上传

    wind10生成 SSH 公钥 实现github本地部署 上传 1 Git 生成 SSH 公钥 如前所述 许多 Git 服务器都使用 SSH 公钥进行认证 为了向 Git 服务器提供 SSH 公钥 如果某系统用户尚未拥有密钥 必须事先为其生
  • Java的常考问题

    Java的垃圾回收机制 http www importnew com 26821 html https www cnblogs com andy zcx p 5522836 html Java语言支持的8种基本类型是 整数型 byte sh
  • vue路由history模式刷新404问题解决方案

    server listen 8888 默认端口是80 如果端口没被占用可以不用修改 server name localhost root E vue my project dist vue项目的打包后的dist location try f
  • 2021-08-12c++考试题目

    一 选择题 每题3分 1 关于虚函数 正确的描述是 A 构造函数不能是虚函数 B 析构函数不能是虚函数 C 虚函数可以是友元函数 D 虚函数可以是静态成员函数 2 在32位操作系统g 编译器环境下 下面程序的运行结果为 1 2 3 4 5
  • Servlet线程安全吗?

    Servlet不是线程安全的 要解释为什么Servlet为什么不是线程安全的 需要了解Servlet容器 即Tomcat 使如何响应HTTP请求的 当Tomcat接收到Client的HTTP请求时 Tomcat从线程池中取出一个线程 之后找
  • 伏秒平衡

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 相关介绍 伏秒值就是伏秒积 即电感两端的电压V和这段时间T的乘积 顾伏秒值也通常称作为伏秒积 伏秒平衡 一般用在开关电路 伏秒积平衡没有要求一定是恒压源激励 电感两端电压是
  • bs4爬取网页图片

    最近学习爬虫 利用bs4批量爬取图片 由于每个父链接点进去的子链接命名格式不一样 所以暂时没有找到把所有父链接下子链接图片全部下载的方法 只是下载了每个父链接点进去的第一个子链接图片 import requests from bs4 imp
  • DataGrip简单特性介绍和navicat作简单对比

    本文主要是面向学生或者初学者的 DataGrip 版本 2020 2 Navicat版本 Navicat for mysql V11 2 以下只是本人简单的使用感受 没有指标上 性能上 的测试 可能有很多点是自己摸索不到从而产生误会 请各位
  • mysql delete 与drop_MySQL中 delete和drop的区别

    DELETE命令的简单介绍 DELETE是一种数据操作语言 DDL 命令 可以使用DELETE命令来从表中删除部分或全部记录 可以和WHERE子句一起使用 用于删除满足添加的某些记录 如果未指定WHERE条件 则将删除所有记录 相关视频教程
  • HashSet集合添加元素的过程

    HashSet底层为数组 链表存储数据 根据元素的哈希值确定元素在数组中存储的位置 当哈希值一样时 调用equals 方法 当为true时 则表明数据一样 否则不一样 我们向HashSet中添加元素a 首先调用元素a所在类的hashCode
  • 基于mykernel的简单时间片轮转多道程序内核代码分析

    一 实验环境 1 mykernel mykernel是由科大孟宁老师建立的一个用于开发您自己的操作系统内核的平台 它基于Linux Kernel 3 9 4 source code 我们可以在这里找到mykernel的源代码 https g
  • 计算机网络课程设计-网络聊天程序的设计与实现

    一 实验题目 网络聊天程序的设计与实现 二 实验目的 了解Socket通信的原理 在此基础上编写一个聊天程序 三 总体设计 一 实验原理 WinSock是一个网络编程接口 可以访问很多种网络协议 它是TCP IP协议的一种封装 通过调用Wi
  • 垃圾回收器(GC)

    目录 垃圾回收 概述 垃圾回收机制 垃圾回收标记阶段 Finaliztion机制 垃圾回收阶段算法 System gc 与STW 垃圾回收器 CMS G1回收算法 查看 JVM 垃圾回收器设置垃圾回收器 垃圾回收 概述 垃圾回收功能是jav
  • 家庭媒体服务器系统,如何创建自己的“家庭媒体流服务器”使用Plex与FreeNAS - 第3部分...

    每个人都有自己的电影 歌曲 视频歌曲 图片等的收藏 他们很多都想知道我们如何流到我们所有的家庭设备 这里是我们可以使用Plex Media Server通过LAN网络在我们的家中使用智能电视 iPad 手机 平板电脑 笔记本电脑等设备流式传
  • 预处理命令 文件包括

    预处理命令 源程序中以 开头的行称为预处理指令 预处理指令并不是C语言的语法成分 而是传给编译程序的指令 包括 宏定义 define undef 文件包含 include 条件编译 if ifdef else elif endif 其他 l
  • Webmin--一个用于Linux基于Web的系统管理工具

    Webmin是一个用于Linux系统管理的开源的基于web的系统管理配置工具 有了这个工具的帮助 我们可以管理内部的系统配置 诸如设置用户账户 磁盘配额 像Apache DNS PHP MySQL 文件共享的服务等 Webmin应用程序是基
  • 问题 J: 36.for循环求阶乘

    题目描述 利用for循环来计算n 的值 输入格式 输入一个整数n n lt 20 输出格式 输出n 的结果是多少 输入样例 3 输出样例 6 这是一道肥肠煎蛋的递归题 边界是n 0 注意定义函数时要用long long哦 完整代码如下 in
  • c++ 第五章 模板

    模板 程序 算法 数据结构 数据结构 能够存储任意类型 算法 能够操作存储任意类型数据结构 泛型编程 泛型编程 面向过程编程 用模板实现函数过程 面向对象编程 用模板实现类 一 基本范例 a 模板定义是以template关键字开头 b 类型
  • Redis高可用高性能缓存的应用系列03 - 缓存过期淘汰策略LRU、LFU

    概述 Redis高可用高性能缓存的应用系列的第3篇 主要介绍Redis缓存过期淘汰策略和内存淘汰策略回收的LRU和LFU的知识点进行说明 Redis过期键删除策略 Redis设置key时 都会设置一个过期时间 那么当过期时间到了都是怎么处理