redis的过期策略和内存淘汰机制(redis篇)

分享并学习一下redis的过期策略和内存淘汰机制

在平时的工作或者学习中,即便自己没有实打实的用过redis。但是能有对这方面的思考,再结合一些实际场景和理论,那么我相信自己或者你都会越来越厉害的。

 首先,我们需要认清为啥redis要有过期策略?

如果这个点大家都不太清楚的话,建议先去了解了解redis的作用和redis怎么诞生的。

其实,理解起来很简单,大家只要记住。redis是基于内存的就行了,内存存储有限,所以存储数据时,会有一个过期时间考虑。

可能有同学会遇到,在生产环境的 Redis 经常会丢掉一些数据,写进去了,过一会儿可能就没
了。我的天,同学,你问这个问题就说明 Redis 你就没用对啊。 Redis 是缓存,你给当存储了是
吧?
啥叫缓存?用内存当缓存。内存是无限的吗,内存是很宝贵而且是有限的,磁盘是廉价而且是
大量的。可能一台机器就几十个 G 的内存,但是可以有几个 T 的硬盘空间。 Redis 主要是基于
内存来进行高性能、高并发的读写操作的。
那么redis的过期策略的核心思想是啥呢?
Redis 过期策略是: 定期删除 + 惰性删除
所谓 定期删除 ,指的是 Redis 默认是每隔 100ms 就随机抽取一些设置了过期时间的 key ,检查 其是否过期,如果过期就删除。
假设 Redis 里放了 10w key ,都设置了过期时间,你每隔几百毫秒,就检查 10w key ,那 Redis 基本上就死了, cpu 负载会很高的,消耗在你的检查过期 key 上了。注意,这里可不是每 隔 100ms 就遍历所有的设置过期时间的 key ,那样就是一场性能上的 灾难 。实际上 Redis 是每 隔 100ms 随机抽取 一些 key 来检查和删除的。
惰性删除:即便key过期了,但是redis不做任何操作。当下次访问时,检查如果过期,那么redis就把key数据删除。
但是实际上这还是有问题的,如果定期删除漏掉了很多过期 key,然后你也没及时去查,也就没走惰性删除,此时会怎么样?如果大量过期 key 堆积在内存里,导致 Redis 内存块耗尽了, 咋整?那就走内存淘汰机制

 内存淘汰机制:

1、noeviction: 当内存不足以容纳新写入数据时,新写入操作会报错,这个一般没人用吧。

2、 allkeys-lru :当内存不足以容纳新写入数据时,在 键空间 中,移除最近最少使用的 key (这
个是 最常用 的)。
3、 allkeys-random :当内存不足以容纳新写入数据时,在 键空间 中,随机移除某个 key ,这个
一般没人用吧,为啥要随机,肯定是把最近最少使用的 key 给干掉啊。
4、 volatile-lru :当内存不足以容纳新写入数据时,在 设置了过期时间的键空间 中,移除最近
最少使用的 key (这个一般不太合适)。
5、 volatile-random :当内存不足以容纳新写入数据时,在 设置了过期时间的键空间 中, 随机
移除 某个 key
6、 volatile-ttl :当内存不足以容纳新写入数据时,在 设置了过期时间的键空间 中,有 更早过
期时间 key 优先移除。
我觉得工作中记住常用的即可,面试的话最好都了解一下。

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

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

相关文章

【Java】Set集合的基本使用

📝个人主页:哈__ 期待您的关注 一、HashSet集合 1.HashSet集合的特点 2.HashSet常用方法 ①:add(Object o):向Set集合中添加元素,不允许添加重复数据。 ②:size():返回Set集合中的元素个数…

Android8.1 MTK平台 修改蓝牙默认名称

的默认蓝牙名称为 Android Bluedroid 通过搜索你会找到如下文件 device/generic/common/bluetooth/bdroid_buildcfg.h #ifndef _BDROID_BUILDCFG_H #define _BDROID_BUILDCFG_H#define BTM_DEF_LOCAL_NAME "Android Bluedroid"#endif 如果单一情况你修改此处即可…

Ubuntu无网络标识的解决方法

1.出现的情况的特点 2.解决办法 2.1 进入root并输入密码 sudo su 2.2 更新NetworkManager的配置 得先有gedit或者vim,两个随意一个,这里用的gedit,没有就先弄gedit,有的话直接下一步 apt-get install gedit 或者vim apt-get ins…

Docker部署Logstash同步Mysql数据到ES

1、准备配置文件文件夹 2、部署logstash & elasticsearch docker pull docker.elastic.co/logstash/logstash:7.15.0 ## 替换{你的ES地址}为ES地址 docker run -d --name logstash -p 5044:5044 -p 9600:9600 -v D:\logstash\data\:/usr/share/logstash/data -v D:\logst…

vue2中echarts横向柱状图一个柱子多个颜色渐变(渲染在页面上)

一、渲染到页面的准备 1、设置渲染节点&#xff08;这里使用了ref&#xff09; <div class"index" ref"lineStyle"></div> 2、寻找到节点并初始化 let ref this.$refs.lineStyle; this.myChart1 echarts.init(ref); 3、尝试渲染 this.myC…

Flink学习(四)-数据管道 ETL

一、状态转换 map() 只适用于一对一的转换&#xff0c;即对每个进入算子的流元素&#xff0c;map() 将仅输出一个转换后的元素。 flatmap() 可以输出任意数量的元素&#xff0c;也可以一个都不发。 二、Keyed Streams keyBy() 相当于 sql 中的 group by&#xff0c;通过…

图片合成二维码怎么实现?图片二维码的生成技巧

图片合成二维码如何制作呢&#xff1f;现在很多的二维码都会提供图片预览的功能&#xff0c;我们可以用手机扫描二维码来查看图片的信息&#xff0c;比如很多的产品信息、旅游攻略、产品海报等等类型经常会制作这种类型的二维码。 其实图片制作二维码的方法很简单&#xff0c;…

生产者和消费者模型 | 阻塞队列 | 信号量 | 环形队列

文章目录 1.生产者和消费者模型2.生产者和消费者模型优点3.阻塞队列4.POSIX信号量5.基于环形队列的生产消费模型 本文完整的代码放在了这&#xff1a; Gitee链接 1.生产者和消费者模型 生产者和消费者模型&#xff0c;概括起来其实是一个321原则&#xff1a;3是&#xff1a;三…

Spring Boot(04):让你的Spring Boot应用“火力全开”,从零开始学习starter

1. 前言 Spring Boot是一款非常流行的Java开发框架&#xff0c;其具有快速开发、自动化配置、内嵌服务器、易于扩展等特点&#xff0c;因此备受开发者欢迎。在日常开发中&#xff0c;我们经常需要在不同的环境中进行测试和部署&#xff0c;此时&#xff0c;如何实现开发、测试、…

电子方案 红外遥控蜘蛛玩具

东莞市酷得智能科技在消费类电子市场深耕多年&#xff0c;依托于市场团队对市场的敏锐度、工程团队的技术积累、结合自身的创新以及和上游原厂深度合作&#xff0c;在2.4G通信、BLE、语音、马达驱动控制等领域&#xff0c;采用方案代理的模式&#xff0c;形成了自己的多条具有市…

MQ如何保证消息的幂等性

在RabbitMQ中&#xff0c;保证消费者的幂等性主要依赖于业务设计和实现&#xff0c;而非RabbitMQ本身提供的一种直接功能。 在基于Spring Boot整合RabbitMQ的场景下&#xff0c;要保证消费者的幂等性&#xff0c;通常需要结合业务逻辑设计以及额外的技术手段来实现。以下是一个…

k8s-配置与存储-持久化存储-NFS 挂载、StorageClass 存储类 动态创建NFS-PV案例

文章目录 Volumes (依赖本机来实现&#xff09;1.1EmptyDir1.2 HostPath NFS 挂载(依赖远程服务来实现)安装 nfs挂载 NFS 共享目录配置文件 NFS 挂在到容器里去 高级存储 PV与PVC 概念详解PV与PVC 生命周期构建绑定使用回收策略 创建PV与PVC以及关联Pod创建 PersistentVolume&a…

【python和java】

如何理解java和python的不同&#xff0c;在java中&#xff0c;先有类&#xff0c;类生出对象&#xff0c;对象承载数据。而python是直接数据&#xff0c;没有类的概念 理解 Java 和 Python 在面向对象编程&#xff08;OOP&#xff09;方面的不同&#xff0c;关键在于理解它们各…

【Python】面向对象(专版提升2)

面向对象 1. 概述1.1面向过程1.2 面向对象 2. 类和对象2.1 语法2.1.1 定义类2.1.2 实例化对象 2.2 实例成员2.2.1 实例变量2.2.2 实例方法2.2.3 跨类调用 3. 三大特征3.1 封装3.1.1 数据角度3.1.2 行为角度3.1.3 案例:信息管理系统3.1.3.1 需求3.1.3.2 分析3.1.3.3 设计 3.2 继…

服务器 安装1Panel服务器运维管理面板

服务器 安装1Panel服务器运维管理面板 SSH链接服务器安装1Panel 出现此提示时输入目标路径&#xff0c;须以“/”开头&#xff0c;默认&#xff1a;/opt&#xff0c;本例&#xff1a;/www。 出现此提示时输入目标端口&#xff0c;须未被使用的端口&#xff0c;默认&#xff1…

【MYSQL管理工具】数据库备份和恢复

&#x1f525;作者主页&#xff1a;小林同学的学习笔录 &#x1f525;mysql专栏&#xff1a;小林同学的专栏 目录 1.MYSQL管理 1.1 系统数据库 1.2 常用工具 1.2.1 mysql 1.2.2 mysqladmin 1.2.3 mysqlbinlog 1.2.4 mysqlshow 1.2.5 mysqldump 1.2.6 mysqlimport/sour…

本地web项目启起来后,无法在浏览器(chrome)看到源码,从而无法打断点;Framework Ignore list

问题描述 本地web项目启起来后&#xff0c;无法在浏览器(chrome)看到源码&#xff0c;从而无法打断点 其他浏览器没看&#xff0c;开发环境一致专注于chrome&#xff08;其余浏览器有测试同事提缺陷了&#xff0c;才会去看&#xff09;&#xff0c;其余浏览器有没有这个问题&…

【SSH】群晖开启ssh访问

群晖开启ssh访问 假设 你需要设置群晖 账号 test-user 开启ssh访问 设置 你的 test-user 为管理员权限 否则你无法通过cmd 面板 连接访问 群晖你需要哪个账号 就使用哪个账号终端 cmd连接 否则需要考虑后续创建 rsa 公密钥文件的 所属权 问题账号密码连接登录终端 ssh -p 端…

FPGA设计之Test bench介绍

Verilog 测试平台是一个例化的待测&#xff08; MUT &#xff09;模块&#xff0c;重要的是给它施加激励并观测其输出。 逻辑模块与其对应的测试平台共同组成仿真模型&#xff0c;应用这个模型可以测试该模块能否符合自己的设计要求。 编写 TESTBENCH 的目的是为了对使用硬件…

LLMs之Morphic:Morphic(一款具有生成式用户界面的人工智能答案引擎)的简介、安装、使用方法之详细攻略

LLMs之Morphic&#xff1a;Morphic(一款具有生成式用户界面的人工智能答案引擎)的简介、安装、使用方法之详细攻略 目录 Morphic的简介 1、技术栈 Morphic的安装和使用方法 1、克隆仓库 2、安装依赖 3、填写密钥 4、本地运行应用 部署 Morphic的简介 2024年4月初发布&#xff…