Redis的缓存过期淘汰策略

news2024/11/24 22:46:46

Redis的缓存过期淘汰策略

  • 一 面试题引入
  • 二 Redis内存满了怎么办?
    • 2.1 redis默认内存多少?在哪里查看?如何设置修改?
    • 2.2 如果Redis内存使用超出了设置的最大值会怎样?
  • 三 Redis里的数据怎么没的?它如何删除呢?
    • 3.1 Redis过期键的删除策略
      • 3.1.1 立即删除
      • 3.1.2 惰性删除
      • 3.1.3 定期删除
      • 3.1.4 上述策略的缺陷
  • 四 Redis缓存淘汰策略
    • 4.1 redis关于缓存淘汰策略的配置文件
    • 4.2 lru与lfu的区别?
    • 4.3 Redis缓存淘汰策略
    • 4.4 平时使用的淘汰策略
    • 4.5 淘汰策略的配置与修改
  • 五 redis缓存淘汰策略配置性能建议

一 面试题引入

  • 生产上你们redis内存设置多少?
  • 如何配置,修改redis的内存大小?
  • 如果内存满了怎么办?
  • redis清理内存的方式?定期删除和惰性删除了解过吗?
  • redis缓存淘汰策略有哪些?分别是什么?你用哪个?
  • redis的LRU了解过吗?请手写LRU。
  • LRU和LFU算法的区别是什么?

二 Redis内存满了怎么办?

2.1 redis默认内存多少?在哪里查看?如何设置修改?

  • 如何查看Redis最大占用内存在这里插入图片描述
    注意: maxmemory参数是bytes字节类型,注意转换

  • redis默认内存多少可以用?
    config get maxmemory :默认大小为0。
    如果不设置最大内存大小或者设置最大内存大小为0,在64位操作系统下不限制内存大小,在32位操作系统下最多使用3GB内存。注意:在64bit系统下,maxmemeory设置为0表示不限制Redis内存使用

  • 一般生产上你如何配置?
    一般推荐Redis设置内存为最大物理内存的四分之三。

  • 如何修改redis内存设置?

    • 通过修改配置文件在这里插入图片描述

    • 通过命令修改:config set maxmemory 104857600 注意:重启后失效

  • 怎么查看redis内存使用情况?

    • info memory
    • config get maxmemory

2.2 如果Redis内存使用超出了设置的最大值会怎样?

在这里插入图片描述

三 Redis里的数据怎么没的?它如何删除呢?

3.1 Redis过期键的删除策略

3.1.1 立即删除

Redis不可能时时刻刻遍历所有被设置了生存时间的key,来检测数据是否已经到了过期时间,然后对它进行删除。
立即删除能保证内存中数据的最大新鲜度,因为它保证过期键值会在过期后马上被删除,其所占用的内存也会随之释放。但是立即删除对CPU是最不友好的。因为删除操作会占用CPU的时间,产生大量的性能消耗,同时也会影响数据的读取操作。
小总结: 对CPU不友好,用处理器性能换取存储空间(拿时间换空间)。

3.1.2 惰性删除

数据到达过期时间,不做处理。等下次访问该数据时:

  • 如果未过期,返回数据。
  • 如果已过期,删除,返回不存在。

惰性删除策略的缺点是:对内存是最不友好的
如果一个键已经过期,而这个键仍然保留在redis中,那么只要这个过期键不被删除,它所占用的内存就不会释放。在使用惰性删除策略时,如果数据库中有非常多的过期键,而这些过期键又恰好没有被访问到的话,那么它们也许永远不会被删除(除非用户手动执行FLUSHDB),我们甚至可以将这种情况看做是一种内存泄漏–无用的垃圾数据占用了大量的内存,而服务器却不会自己去释放它们,这对于运行状态非常依赖于内存的Redis服务器来说,肯定不是一个好消息。

小总结: 对memory不友好,用存储空间换取处理器性能(拿空间换时间)

开启惰性淘汰: lazyfree-lazy-eviction = yes

3.1.3 定期删除

定期删除策略是前两种策略的折中:
定期删除策略每隔一段时间执行一次删除过期键操作并通过限制删除操作执行时长和频率来减少删除操作对CPU时间的影响。

周期性轮询Redis库中的时效性数据,采用 随机抽取 的策略,利用过期数据占比的方式控制删除频度。
特定1:CPU性能占用设置有峰值,检测频度可自定义设置。
特点2:内存压力不是很大,长期占用内存的冷数据会被持续清理。
总结: 周期性抽查存储空间(随机抽查,重点抽查)

定期删除策略的难点是确定删除操作执行的时长和频率:如果删除操作执行得太频繁或者执行的时间太长,定期删除策略就会退化成立即删除策略,以至于将CPU时间过多地消耗在删除过期键上面。如果删除操作执行得太少,或者执行的时间太短,定期删除策略又会和惰性删除策略一样,出现浪费内存的情况。因此,如果采用定期删除策略的话,服务器必须根据情况,合理地设置删除操作的执行时长和执行频率

3.1.4 上述策略的缺陷

  • 定期删除时,从来没有被抽查到的key
  • 惰性删除时,从来没有被点中使用过。

上述两种情况会导致大量过期的key堆积在内存中,导致Redis内存空间紧张或者很快耗尽。

四 Redis缓存淘汰策略

4.1 redis关于缓存淘汰策略的配置文件

在这里插入图片描述

4.2 lru与lfu的区别?

  • LRU means Least Recently Used
  • LFU means Least Frequently Used

区别:

  • LRU:最近最少使用页面置换算法,淘汰最长时间未被使用的页面,看页面最后一次被使用到发生调度的时间长短,首先淘汰最长时间未被使用的页面。
  • LFU:最近最不常用的页面置换算法,淘汰一定时期内被访问次数最少的页,看一定时间段内页面被使用的频率,淘汰一定时期内被访问次数最少的页。

4.3 Redis缓存淘汰策略

  • noeviction:不会驱逐任何key,表示即使内存达到上限也不进行置换,所有能引起内存增加的命令都会返回error。
  • allkeys-lru:对所有key使用LRU算法进行删除,优先删除掉最近最不经常使用的key,用以保存新数据。
  • volatile-lru:对所有设置了过期时间的key使用LRU算法进行删除
  • allkeys-random:对所有key随机删除
  • volatile-random:对所有设置了过期时间的key随机删除
  • volatile-ttl:删除马上要过期的key
  • allkeys-lfu:对所有key使用LFU算法进行删除
  • volatile-lfu:对所有设置了过期时间的key使用LFU算法进行删除

4.4 平时使用的淘汰策略

  • 在所有的key都是最近最经常使用,那么就需要选择allkeys-lru进行置换最近最不经常使用的key,如果你不确定使用哪种策略,那么推荐使用allkeys-lru
  • 如果所有的key的访问概率都是差不多的,那么可以选择allkeys-random策略去置换数据
  • 如果对数据有足够的了解,能够为key指定hint(通过expire/ttl指定),那么可以选择volatile-ttl进行置换。

4.5 淘汰策略的配置与修改

  • 直接使用config命令(重启失效)
  • redis.conf配置文件修改

五 redis缓存淘汰策略配置性能建议

  • 避免存储bigkey
  • 开启惰性淘汰,lazyfree-lazy-eviction=yes

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能出行 驱动未来|2023 开放原子全球开源峰会 CARSMOS 开源智能出行生态年会即将启幕

由开放原子开源基金会主办,元遨 / CARSMOS 开源智能出行项目组协办,深信科创、Futurewei Technologies、Open Motors、北极雄芯等单位共同承办的 2023 开放原子全球开源峰会 “CARSMOS 开源智能出行生态年会” 将于 6 月 12 日在北京经开区北人亦创国际会…

chatgpt赋能python:Python函数:降低编程复杂度的利器

Python函数:降低编程复杂度的利器 编写高效且易于维护的代码,是每个开发者都追求的目标。Python函数在实现这个目标中起着至关重要的作用。通过函数,我们可以将程序分解为更小的代码块,以简化代码逻辑和降低复杂度。本文将介绍Py…

C++服务器框架开发7——日志系统LogFormatter_2

该专栏记录了在学习一个开发项目的过程中遇到的疑惑和问题。 其教学视频见:[C高级教程]从零开始开发服务器框架(sylar) 上一篇:C服务器框架开发6——日志系统logFormatter/size_t学习 C服务器框架开发7——日志系统LogFormatter_2 目前进度 目前进度 学…

Java程序设计入门教程--随机类Random

随机数的类 在程序设计中,经常都需要产生一些随机数,比如模拟随机抽奖、抽样等。 Random类在java.util包中,是专门用于提供生成一个随机数的类,随机数的生成相关方法都在该内中。比如Random类的nextInt方法需要一int型值作为参数&…

【生信】R语言在RNA-seq中的应用

R语言在RNA-seq中的应用 文章目录 R语言在RNA-seq中的应用生成工作流环境读取和处理数据由targets文件提供实验定义对实验数据进行质量过滤和修剪生成FASTQ质量报告 比对建立HISAT2索引并比对 读长量化读段计数样本间的相关性分析 差异表达分析运行edgeR可视化差异表达结果计算…

11.Ansible Roles介绍

什么是Ansible角色? 就像在现实世界中给不同的人分配角色一样,让他们成为医生工程师, 宇航员, 警察,或者厨师。在Ansible的世界里, 你可以给服务器分配角色,让它们成为数据库服务器、 Web服务器、 Redis消息服务器或备份服务器&#…

LCUSB-13xB/M 系列高性能 USB 接口 CAN 卡在医疗体外诊断仪上的应用

1,LCUSB -13xB/M 系列高性能 USB 接口 CAN 卡的功能介绍 LCUSB -13xB/M 系列高性能 USB 接口 CAN 卡,坚固 金属外壳,具有更佳 EMC 性能,插到用户设备 USB 接口 上,快速扩展出 1~2 路 CAN 通道,可作为组件集…

java基础学习

一、注释 1)当行注释 // 2)多行注释 /* ... */ 3)文档注释 (java特有) /** author 张三 version v1.0 这是文档注释,需要将class用public修饰 */ 二、关键字 (1)48个关键…

tinker CAD入门操作

入门 - 导航和菜单 欢迎来到设计世界! 设计是发现所有尚未完成的东西的艺术。它是学习和教学,打破和制造,看到和展示的平等部分。 设计就是分享! Tinkercad是一款功能强大且易于使用的工具,用于创建数字设计&#xff0…

CVE-2023-33246 Apache RocketMQ RCE

0x01 漏洞介绍 Apache RocketMQ是一款开源的分布式消息和流处理平台,提供了高效、可靠、可扩展的低延迟消息和流数据处理能力,广泛用于异步通信、应用解耦、系统集成以及大数据、实时计算等场景。 漏洞的官方描述为当RocketMQ多个组件,包括N…

chatgpt赋能python:Python分三行输入:提高编程效率的绝佳方法

Python分三行输入:提高编程效率的绝佳方法 Python是一种高级编程语言,以简洁、易读的代码著称。Python分三行输入是一种旨在提高编程效率的技术,它可以减少代码阅读时间、降低语法错误率,并且让代码更加易于维护。在本文中&#…

0501源码分析-启动过程-springboot2.7.x系列

文章目录 1前言2 启动第一阶段2.1 deduceFromClasspath 推断应用类型2.2 getSpringFactoriesInstances(Class)2.3 ApplicationContextInitializer2.4 ApplicationListener2.5 自定义接口实现配置示例 3 启动第二阶段3.1 SpringApplicationRunListener3.2 容器创建和准备 4 总结…

11. 数据结构之二叉树

前言 上一节,简单概述了树这种数据结构,以及树结构向下,具有某些一些特征的树,比如二叉树,B树,B树,堆等。其中,二叉树是一个很重要的模块。也是在一些技术面试中,可能会…

【Vue】学习笔记-Vuex

Vuex 理解VuexVuex是什么什么时候使用VuexVuex 工作原理图求和案例使用纯vue编写 搭建Vuex环境使用Vuex编写求和案例getters配置项四个map方法的使用多组件共享数据案例模块化命名空间 理解Vuex Vuex是什么 概念:专门在vue中实现集中式状态(数据) 管理的一个vue插…

基于P-Tuningv2轻量微调和推理chatglm

类ChatGPT的部署与微调(下):从GLM、ChatGLM到MOSS、ChatDoctor、可商用_v_JULY_v的博客-CSDN博客随着『GPT4多模态/Microsoft 365 Copilot/Github Copilot X/ChatGPT插件』的推出,绝大部分公司的技术 产品 服务,以及绝大部分人的工作都将被革…

【CMake 入门与进阶(2)】CMake编译设置——多个源文件编译及生成库文件(附代码)

多个源文件 上篇我们学习了单个源文件的cmake 的编译,不过一个源文件的例子似乎没什么意思,我们再加入一个hello.h 头文件和 hello.c 源文件。在 hello.c 文件中 定义了一个函数 hello,然后在 main.c 源文件中将会调用该函数&#xff…

客服都要下岗了? 当ChatGPT遇见私有数据,秒变AI智能客服!

用ChatGPT搭建基于私有数据的WorkPlus AI客服机器人这个想法,源于WorkPlus售前工作需求。在ChatGPT之前,其实对话式AI一直在被广泛使用在客服场景,只不过不大智能而已。比如你应该看到不少电商客服产品,就有类似的功能&#xff0c…

车站信息管理系统(面向对象程序设计python版)

一、基本概述 1.项目背景 随着大数据时代的发展,大数据抓取了人们最想要的信息,数据查询能帮助用户获取更有用的信息,让每个人都能享受到大数据带给生活的高效和便捷。 2.设计目的 为了大大缩减人们出行选择站点所需时间,为了让人们在陌生地区,在对当地交通不熟的情况…

Redis数据类型之(哈希Hash和集合Set)

Redis数据类型之(哈希Hash和集合Set) 一定注意看红色注意项。 哈希(Hash): Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存…

promethues 之PromQL数据类型介绍(二)

promethues 之PromQL数据类型介绍(二) 1、PromQL 介绍 PromQL是promethues 监控系统内置的一种查询语言,类似于MySQL的SQL语句,该语言仅用于读取数据。PromQL是我们学习Promethues最困难也是最重要的部分。当Promethues从系统和服务收集到指标数据时&…