深入浅出Redis(三):Redis数据的存储、删除以及淘汰

引言

Redis是一款基于键值对的数据结构存储系统,它的特点是基于内存操作、单线程处理命令、IO多路复用模型处理网络请求、键值对存储与简单丰富的数据结构等等

本篇文章不像以往文章围绕Redis某个特点来讲解,而是作为过渡介绍,来说一说Redis是如何存储数据、如何删除数据和如何淘汰数据

存储数据

使用dict字典对Key、Value进行存储,Key总是字符串对象,Value可以是其他对象

键对象可以被设置过期时间,需要注意的是只能对键对象设置过期时间,不能对值对象设置过期时间,如果键对应的值对象为集合类型过期时间到达,集合内的所有元素都过期

image.png

使用expires字典存储 键以及键对应的过期时间戳,Key为键对象地址(复用),Value为到期时间的毫秒时间戳

删除数据

当Redis中的数据发生过期时,不一定立马去删除,而是根据不同的删除策略有不同的删除时机

删除策略有三种分别是:定时删除、惰性删除、定期删除

定时删除使用计时器,到达过期时间就立马去删除数据;如果当前CPU比较忙,还要去删除比较大的数据时就可能发生阻塞,影响用户,但是带来的好处是过期数据立马被删除,不会占用空间,是一种时间换空间的删除策略

惰性删除当数据过期时不会立马删除,而是读写命令操作数据前检查这个键Key是否过期,如果过期就顺便删除;当数据过期并不立即删除,等到后续操作数据时先检查再删除,期间数据占用空间但无作用,如果不再操作数据可能导致数据永久不删除,是一种空间换时间的删除策略

定期删除是每秒使用可指定的固定的CPU资源遍历库并随机挑选库中过期字典上的多个Key检查是否过期,过期则删除;如果过期比例较大则还会再该库中进行随机挑选,否则去下一个库中随机挑选检查删除可指定使用CPU资源不影响用户,也不会存在内存泄漏,是一种折中方案

Redis中默认使用惰性删除和定期删除的策略,使用空间换时间的方式不引起阻塞,惰性删除中不操作过期数据的场景还是较小的,即使不操作过期数据还有定期删除兜底随机删除数据,最终不会引发内存泄漏

淘汰数据

当数据快占满空间时,会使用淘汰策略来将数据淘汰,否则空间占满会影响Redis的可用性

每次加入数据会先判断内存是否足够,当内存不足时,使用淘汰算法临时删除数据;如果删除一个数据空间还不够会多次使用淘汰算法,直到满足此次操作需要的空间,如果选择的淘汰算法是不临时删除数据,就直接抛出OOM错误(默认)

可以在配置文件中配置淘汰策略算法

 # 最大配置内存容量maxmemory 2g# 使用逐出算法时要删除数据个数(过小会多次执行逐出算法,过大会阻塞很久)maxmemory-samples maxmemory-policy noeviction #逐出算法的策略#noeviction 永不过期,返回错误​#volatile-lfu 挑选expires区数据用lfu算法淘汰#volatile-lru 挑选expires区的数据使用LRU淘汰#volatile-random 挑选expires区的数据随机淘汰#volatile-ttl 挑选expires区要过期的数据淘汰​#allkeys-random:挑选全局数据随机删除#allkeys-lfu 挑选全局数据用lfu算法淘汰#allkeys-lru 挑选全局数据用lru算法淘汰

淘汰策略前缀使用volatile表示在expires字典中选择数据删除,前缀使用allkeys表示在全局下选择数据删除

大部分场景下,使用淘汰策略时应该优先保留命中率高的数据,而临时删除命中率较低的数据

LFU算法是淘汰最近最少使用次数的数据,期间需要记录数据被使用的次数

LRU算法是淘汰最近最久未使用的数据,常用队列维护,使用到数据就将数据放到队头,队尾数据就是最近最久未使用的数据(要淘汰的数据)

总结

本篇文章讲解了Redis如何存储数据、删除数据、淘汰数据

使用dict字典存储键值对象,键对象一定为字符串对象,而值对象可以是其他任意类型对象

使用expires字典存储键对象过期时间,Key为键对象地址(复用),Value为到期时间的毫秒时间戳

定时删除使用计时器删除数据,时间换空间的策略,可能导致用户线程阻塞

惰性删除每次操作Key前检查是否过期,过期则删除,空间换时间的策略,可能导致内存泄漏

定期删除使用固定CPU资源遍历随机挑选删除,是一种折中策略,默认情况下惰性删除与定期删除搭配使用

如果添加数据内存不足,会使用淘汰策略来临时删除数据,默认情况下直接报错OOM,在大部分场景下可以选择LRU算法,避免将命中率高的数据临时删除

最后(一键三连求求拉~)

本篇文章笔记以及案例被收入 gitee-StudyJava、 github-StudyJava 感兴趣的同学可以stat下持续关注喔~

有什么问题可以在评论区交流,如果觉得菜菜写的不错,可以点赞、关注、收藏支持一下~

关注菜菜,分享更多干货,公众号:菜菜的后端私房菜

本文由博客一文多发平台 OpenWrite 发布!

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

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

相关文章

基于springboot的大型商场应急预案管理系统论文

大型商场应急预案管理系统 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了大型商场应急预案管理系统的开发全过程。通过分析大型商场应急预案管理系统管理的不足,创建了一个计算机管理大型商场应急…

软件测试开发环境、测试环境、准生产环境、生成环境

在一个项目开发到发布的整个过程中,会使用到很多个环境进行测试和运行项目。最基本的开发环境、测试环境、准生产环境、生成环境 一、开发环境 开发环境顾名思义就是我们程序猿自己把项目放到自己的电脑上,配置好以后,跑起来项目&#xff0…

如何器测试IP池的质量?代理IP是怎么在问卷调查中应用的呢?

在数字时代,数据收集和分析变得日益重要,而问卷调查作为一种常见的数据收集工具,其效率和准确性直接影响着研究的可信度和有效性。为了实现这一目标,代理IP在问卷调查中的应用变得愈发关键。本文旨在探讨如何测试IP池的质量&#…

真机测试——关于荣耀Magic UI系列HBuilder真机调试检测不到解决办法

​​​​​出现这种状况怎么办 1、开启USB调试 2、重点来了——我们要选择USB配置,选择音频来源 3、连接OK

vue3基础教程(2)——创建vue3+vite项目

博主个人微信小程序已经上线:【中二少年工具箱】。欢迎搜索试用 正文开始 专栏简介1. 前言2.node版本检测3.创建vue项目 专栏简介 本系列文章由浅入深,从基础知识到实战开发,非常适合入门同学。 零基础读者也能成功由本系列文章入门&#x…

javascript数组排序的方法

目录 基本用法 按照数字大小排序 按照降序排序 按照字符串长度排序 按照对象属性排序 在JavaScript中,数组排序通常使用Array.prototype.sort()方法。这个方法会按照指定的顺序对数组的元素进行排序,并返回排序后的数组。如果未指定比较函数&#x…

Springboot配置MySQL数据库

Springboot配置MySQL数据库 一、创建springboot项目&#xff0c;并添加如下依赖 <dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope> </dependency>二、在applica…

基于springboot+vue的酒店管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

实现session共享的方法总结完整版

文章目录 实现session共享的方法总结完整版1、使用共享数据库&#xff1a;2、使用粘性会话&#xff08;Sticky Session&#xff09;&#xff1a;3、使用缓存系统&#xff1a;4、使用分布式文件系统&#xff1a;5、使用中央认证服务&#xff1a;6、使用会话复制&#xff1a;7、使…

100%开源大模型OLMo:代码/权重/数据集/训练全过程公开,重定义AI共享

前言 近日&#xff0c;艾伦人工智能研究所联合多个顶尖学术机构发布了史上首个100%开源的大模型“OLMo”&#xff0c;这一举措被认为是AI开源社区的一大里程碑。OLMo不仅公开了模型权重&#xff0c;还包括了完整的训练代码、数据集和训练过程&#xff0c;为后续的开源工作设立…

三星成功研发出业界首款12层堆叠HBM3E

三星电子有限公司成功研发出业界首款12层堆叠HBM3E DRAM——HBM3E 12H&#xff0c;这是迄今为止容量最大的HBM产品。这款新型HBM3E 12H内存模块提供了高达1,280GB/s的史上最高带宽&#xff0c;并拥有36GB的存储容量&#xff0c;相较于之前的8层堆叠HBM3 8H&#xff0c;在带宽和…

ECMAScript6

课程链接 目录 相关介绍什么是ECMA什么是ECMAScript为什么学习ES6 letconst变量解构赋值模板字符串对象简化写法箭头函数函数参数的默认值rest参数扩展运算符Symbol迭代器生成器函数与调用Promise介绍与基本用法Promise封装读取文件Promise.prototype...then方法Promise.catch…

CCDP.01.寄主机SSH连接虚拟机的QA

V0.0 初始版本-2024.2.29 检查VM的网卡配置 如上图&#xff0c;如果enp0s3网卡没有出现形如10.0.0.??/24的ip配置&#xff0c;说明该网卡配置存在错误&#xff0c;或者没有“使能”该网卡。在RockyLinux8.X中可检查“ifcfg-enp0s&#xff1f;” vi /etc/sysconfig/network-…

【JS】WebSocket实现简易聊天室

【JS】WebSocket实现简易聊天室 聊天室思路示例 聊天室思路 聊天室思路 1、连接服务器先建立连接&#xff0c;默认生成匿名用户(admin01) 2、客户端发送消息&#xff0c;其它客户端用户都会同步接收消息(服务端接受消息广播所有连接用户) 3、客户端修改昵称&#xff0c;其它客…

数据结构之七大排序

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary_walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

FreeRTOS操作系统学习——FreeRTOS工程创建

FreeROTS工程创建 详细步骤 如无特殊情况&#xff0c;大部人都要配置为外部高速时钟 另外&#xff0c;本实验使用了FreeRTOS&#xff0c;FreeRTOS的时基使用的是Systick&#xff0c;而 STM32CubeMX中默认的HAL库时基也是Systick&#xff0c;为了避免可能的冲突&#xff0c;最…

java014 - Java继承

1、继承 1.1 继承概述 继承是面向对象的三大特征之一&#xff0c;可以使得子类具有父类的属性和方法&#xff0c;还可以在子类中重新定义&#xff0c;追加属性和方法。 1.2 继承格式 public class 子类类名 extends 父类类名 {} 范例&#xff1a;public class son extends …

鸿蒙应用组件

基础组件 索引组件—AlphabetIndexer&#xff08;相当于安卓的seedbar&#xff09; 使用&#xff1a;AlphabetIndexer(value: {arrayValue: Array<string>, selected: number})空白填充组件—Blank&#xff08;占位使用&#xff0c;当父组件为Row/Column/Flex时生效&am…

商淘云成功通过中国支付清算协会备案 助力商户合规发展有序经营

2023年12月&#xff0c;商淘云&#xff08;广州商淘信息科技有限公司&#xff09;进入中国支付清算协会第五批收单外包服务机构名单&#xff0c;成功通过聚合支付技术服务类型机构备案。这是继2022年商淘云通过第36类&#xff08;支付和投资类别&#xff09;商标的又一大喜事&a…

【Lattice FPGA 开发】IP核的调用

本文介绍Diamond开发软件进行IP核调用与对应官方文档查找方法。 文章目录 1. IP核的调用1.1 IPexpress调用IP核1.2 Clarity Designer调用IP核 2. IP核相关文档查找2.1 方法一2.2 方法二2.3 方法三 3 问题 1. IP核的调用 Diamond软件中&#xff0c;根据所选目标FPGA器件型号的…