Redis入门到精通(二):入门Redis看这一篇就够了
文章目录
- 一、Redis的双写一致性
- 1.延迟双删
- 2.添加分布式锁
- 3.异步监听+可靠消息
- 基于MQ消息队列的异步监听
- 基于Canal的异步通知
- 二、Redis的持久化
- 持久化流程
- 1.RDB机制
- 1.1save
- 1.2bgsave
- 1.3自动触发
- 2.AOF机制
- 三种触发机制
- 3.RDB和AOF的对比
- 三、Redis的数据删除策略
- 1.惰性删除
- 2.定期删除
- 四、Redis的淘汰策略
一、Redis的双写一致性
当修改了数据库的内容,同时也要更新缓存的数据,缓存和数据库的数据要保持一致
1.延迟双删
- 读操作:缓存命中,直接返回;缓存未命中,查询数据库并写入缓存,设置超时时间
- 写操作:延迟双删
- 特点:

-
为什么是要删除缓存而不是更新缓存呢?
1.1 更新缓存的优缺点:更新缓存的优点是每次数据变化都能够及时地更新缓存,这样不容易出现查询未命中的情况,但这种情况的消耗很大,如果数据需要经过复杂的计算再写入缓存的话,频繁的更新会影响到服务器的性能。如果是写入数据比较频繁的场景,可能会导致频繁的更新缓存而没有业务读取该数据
1.2 删除缓存的优缺点: 删除缓存的优点是操作简单,缺点是删除了缓存,下一次操作容易出现未命中的情况,此时就需要读取数据库
对比而言,删除缓存是更优选 -
是先删除缓存还是先删除数据库呢?
无论先后顺序,都会有脏数据的风险 -
为什么要删除两次缓存?
因为删除缓存,修改数据库后,会造成脏数据的风险,所以还需要再次删除缓存 -
为什么要延迟删除?
因为数据库是主从模式,是读写分离的,我们需要等待一会数据库将数据从主节点同步到从节点,所以需要延迟删除 -
那么这样的设定是否一致能保证一致性呢?
不能保证,因为时间无法控制,不能保证数据库”从库“更新后删除缓存。如果在”从库“更新前删除,用户再在更新前查”从库“又把脏数据写在缓存中了。
2.添加分布式锁
这里有一种添加分布式锁的方案来保证数据的强一致性
我们存入缓存中的数据,一般都是读多写少的数据,那么我们可以添加读写锁的方式来保证数据的强一致性。在读数据时,添加共享锁readLock,加锁之后m,其他线程可以共享读操作。在写数据时,添加排他锁writeLock,加锁之后,阻塞其他线程写的写操作。这样做可以保证数据强一致性,但是性能较低。
3.异步监听+可靠消息
基于MQ消息队列的异步监听

基于Canal的异步通知

什么是binlog?
Binlog(Binary Log) 是MySQL数据库中的二进制日志文件,用于记录数据库的所有更改操作。它以二进制的形式存储,包含了对数据库执行的所有修改操作的详细信息,如插入、更新、删除等。Binlog是MySQL事务日志的一部分,与Redo Log(重做日志)一起,确保数据库的一致性、持久性,以及提供一些关键的数据库管理功能。
二、Redis的持久化
redis是一个内存数据库,数据保存在内存中,但是我们都知道内存的数据变化是很快的,也容易发生丢失。Redis为我们提供了持久化的机制,分别是RDB(Redis DataBase)和AOF(Append Only File)。
持久化流程
- 客户端向服务端发送写操作(数据在客户端的内存中)
- 数据库服务端接收到客户端的写数据的请求(数据在服务端的内存中)
- 服务端调用write这个系统调用,将数据向磁盘上写(数据在系统内存的缓存区中)
- 操作系统将缓存区中的数据转移到磁盘控制器上(数据在磁盘缓存中)
- 磁盘控制器将数据写到磁盘的物理介质上(数据真正写在磁盘上)
1.RDB机制
RDB其实就是把数据以快照的形式保存在磁盘上
RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。也是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。
RDB机制是通过把某个时刻的所有数据生成一个快照来保存,颞部有一种触发机制,是实现这个过程。对于RDB来说,提供了三种机制:save、bgsave、自动化
1.1save
该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止
1.2bgsave
执行该命令时,Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。具体流程如下:

具体操作是Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短。基本上 Redis 内部所有的RDB操作都是采用 bgsave 命令。
1.3自动触发
除了通过客户端发送命令外,还有一种方式,就是在Redis配置文件中的save指定到达触发RDB持久化的条件,比如【多少秒内至少达到多少写操作】就开启RDB数据同步。
例如我们可以在配置文件redis.conf指定如下的选项:
# 900s内至少达到一条写命令
save 900 1
# 300s内至少达至10条写命令
save 300 10
# 60s内至少达到10000条写命令
save 60 10000
之后在启动服务器时加载配置文件。
# 启动服务器加载配置文件
redis-server redis.conf
这种通过服务器配置文件触发RDB的方式,与bgsave命令类似,达到触发条件时,会forks一个子进程进行数据同步,不过最好不要通过这方式来触发RDB持久化,因为设置触发的时间太短,则容易频繁写入rdb文件,影响服务器性能,时间设置太长则会造成数据丢失。
RDB默认生成的文件名为dump.rdb,当然,我可以通过配置文件进行更加详细配置,比如在单机下启动多个redis服务器进程时,可以通过端口号配置不同的rdb名称,如下所示:
# 是否压缩rdb文件
rdbcompression yes# rdb文件的名称
dbfilename redis-6379.rdb# rdb文件保存目录
dir ~/redis/
save和bgsave的对比
| 命令 | save | bgsave |
|---|---|---|
| IO类型 | 同步 | 异步 |
| 阻塞? | 是 | 是(阻塞发生在fork) |
| 复杂度 | O(N) | O(N) |
| 优点 | 不会消耗额外内存 | 不阻塞客户端命令 |
| 缺点 | 阻塞客户端命令 | 想要fork消耗内存 |
2.AOF机制
量备份总是耗时的,有时候我们提供一种更加高效的方式AOF,工作机制很简单,redis会将每一个收到的写命令都通过write函数追加到文件中。通俗的理解就是日志记录。
持久化原理

文件重写原理
AOF的方式也同时带来了另一个问题。持久化文件会变的越来越大。为了压缩aof的持久化文件。redis提供了bgrewriteaof命令。将内存中的数据以命令的方式保存到临时文件中,同时会fork出一条新进程来将文件重写。

Redis默认不开启AOF持久化方式,我们可以在配置文件中开启并进行更加详细的配置,如下面的redis.conf文件:
# 开启aof机制
appendonly yes# aof文件名
appendfilename "appendonly.aof"# 写入策略,always表示每个写操作都保存到aof文件中,也可以是everysec或no
appendfsync always# 默认不重写aof文件
no-appendfsync-on-rewrite no# 保存目录
dir ~/redis/
三种触发机制
(1)每修改同步always:同步持久化 每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好
(2)每秒同步everysec:异步操作,每秒记录 如果一秒内宕机,有数据丢失
(3)不同no:从不同步
| 配置项 | 刷盘时机 | 优点 | 缺点 |
|---|---|---|---|
| always | 同步刷盘 | 可靠性高,几乎不丢失数据 | 性能影响大 |
| everysec | 每秒刷盘 | 性能适中 | 最多丢失1s数据 |
| no | 操作系统控制 | 性能最好 | 可靠性较差,可能丢失大量数据 |
3.RDB和AOF的对比
在实际开发中,往往会结合二者使用
| 目录 | RDB | AOF |
|---|---|---|
| 持久化方式 | 定时对整个内存做快照 | 记录每一次执行的命令 |
| 数据完整性 | 不完整,两次备份之间会丢失 | 性相对完整,取决于刷盘策略 |
| 文件大小 | 会有压缩,文件体积小 | 记录命令,文件体积很大 |
| 宕机恢复速度 | 很快 | 慢 |
| 数据恢复优先级 | 低,因为数据完整性不如AOF | 高 |
| 系统资源占用 | 高,大量cpu消耗和内存消耗 | 低,主要是磁盘IO资源但AOF重写时会占用大量CPU和内存资源 |
| 使用场景 | 可以容忍数分钟的数据丢失,追求更快的启动速度 | 对数据安全性要求较高 |
三、Redis的数据删除策略
1.惰性删除
惰性删除:设置该key的过期后,我们不去管它,当下次需要该key时,我们检查其是否过期,如果过期,我们就删除该key,反之则返回key
- 优点: 对CPU友好
- 缺点:对内存不友好,可能会有大量的过期key存在于内存中
2.定期删除
定期删除:每隔一段时间,我们就对一些key进行检查,过期就删除
定期删除有两种模式: SLOW 和 FAST
SLOW:SLOW模式是定时任务,执行频率默认为10HZ(每秒执行10次),每次不超过25ms,可以通过修改配置文件redis.conf的hz选项来调整次数
FAST:FAST模式执行频率不固定,但两次间隔不低于2ms,每次耗时不超过1ms
优点:可以通过限制执行删除操作的时常和频率来减少CPU的消耗,同时定期删除也能释放内存
缺点:难以确定执行操作的时常和频率
四、Redis的淘汰策略
我们设置完redis内存之后,我们就像里面放数据,但是内存总有满的时候,满的时候redis又是怎么处理的呢?
每进行一次redis操作的时候,redis都会检测可用内存,判断是否要进行内存淘汰,当超过可用内存的时候,redids 就会使用对应淘汰策略。
redis内存淘汰策略,具体如下:
-
no-envicition:该策略对于写请求不再提供服务,会直接返回错误,当然排除del等特殊操作,redis默认是no-envicition策略。
-
allkeys-random: 从redis中随机选取key进行淘汰
-
allkeys-lru: 使用LRU(Least Recently Used,最近最少使用)算法,从redis中选取使用最少的key进行淘汰
-
volatile-random: 从redis中设置过过期时间的key,进行随机淘汰
-
volatile-ttl: 从redis中选取即将过期的key,进行淘汰
-
volatile-lru: 使用LRU(Least Recently Used,最近最少使用)算法,从redis中设置过过期时间的key中,选取最少使用的进行淘汰
-
volatile-lfu: 使用LFU(Least Frequently Used,最不经常使用),从设置了过期时间的键中选择某段时间之内使用频次最小的键值对清除掉
-
allkeys-lfu: 使用LFU(Least Frequently Used,最不经常使用),从所有的键中选择某段时间之内使用频次最少的键值对清除
那么有这么多的淘汰策略,我们应该选取哪一种呢?
- 优先使用allkeys-lru策略。充分利用LRU算法的优势。 将最常访问的数据(热数据)留在缓存中
- 如果业务中数据访问频率差别不大,没有明显的冷热数据之分,建议使用allkeys-random,随机进行淘汰
- 如果业务有置顶的需求,可以使用volatile-lru策略,同时设置置顶数据不设置过期时间,这些数据就一直不会被删除,会淘汰其他设置了过期时间的数据
- 如果业务中有短时高频访问的数据,则推荐使用allkeys-lfu或者volatile-lfu策略
相关文章:
Redis入门到精通(二):入门Redis看这一篇就够了
文章目录 一、Redis的双写一致性1.延迟双删2.添加分布式锁3.异步监听可靠消息基于MQ消息队列的异步监听基于Canal的异步通知 二、Redis的持久化持久化流程1.RDB机制1.1save1.2bgsave1.3自动触发 2.AOF机制三种触发机制3.RDB和AOF的对比 三、Redis的数据删除策略1.惰性删除2.定期…...
荒岛逃生游戏
题目描述 一个荒岛上有若干人,岛上只有一条路通往岛屿两端的港口,大家需要逃往两端的港口才可逃生。 假定每个人移动的速度一样,且只可选择向左或向右逃生。 若两个人相遇,则进行决斗,战斗力强的能够活下来ÿ…...
玫瑰花HTML源码
HTML源码 <pre id"tiresult" style"font-size: 9px; background-color: #000000; font-weight: bold; padding: 4px 5px; --fs: 9px;"><b style"color:#000000">0010000100000111101110110111100010000100000100001010111111100110…...
【wpf】07 后端验证及令牌码获取步骤
由于在用wpf开发应用程序时,从后端获取数据需要用到 Authorization 授权的Bearer令牌,而这个令牌的获取需要登录后台进行获取,这里登录时还涉及到的验证码的操作,所以在获取过程中,需要对后台系统进行登录并拿到这个Be…...
学习中,师傅b站泷羽sec——xss挖掘过程
某职业技术学院网站xss挖掘: 资产归纳 例如:先把功能点都看一遍,大部分都是文章 根据信息搜集第一课学习到一般主站的防御力是比较强的,出现漏洞的点不是对新手不友好。 在资产验证过程中还是把主站看了一遍 没有发现有攻击的机会…...
什么是双因素身份验证?双因素身份验证的凭据类型有哪些?
w微服务在数字化的时代,保护个人和企业的敏感信息至关重要。双因素身份验证(Two-Factor Authentication,简称 2FA)作为一种增强安全性的方法,越来越受到广泛关注。那么,什么是双因素身份验证呢?…...
【MR开发】在Pico设备上接入MRTK3(一)——在Unity工程中导入MRTK3依赖
写在前面的话 在Pico上接入MRTK3,目前已有大佬开源。 https://github.com/Phantomxm2021/PicoMRTK3 也有值得推荐的文章。 MRTK3在PICO4上的使用小结 但由于在MacOS上使用MRTK3,无法通过Mixed Reality Feature Tool工具管理MRTK3安装包。 故记录一下…...
利用移动式三维扫描技术创建考古文物的彩色纹理网格【上海沪敖3D】
文章来源于蔡司工业质量解决方案,作者蔡司工业质量 在考古环境中,三维扫描技术应用广泛,如存档、保存、复制和分享(包括实体和虚拟形式)。 文中,通过真实的扫描案例,您将了解到三维光学解决方案…...
Spring AI Java程序员的AI之Spring AI(四)
Spring AI之Java经典面试题智能小助手 前言一、准备面试题二、搭建工程三、文件读取与解析四、Markdown文件解析五、问题搜索六、自定义EmbeddingClient七、定义请求Controller 前言 通过Ollama在本地部署了Llama3大模型,这篇来基于Llama3和Spring AI,以…...
精选20个爆火的Python实战项目(含源码),直接拿走不谢!
今天给大家介绍20个非常实用的Python项目,帮助大家更好的学习Python。 完整版Python项目源码,【点击这里】领取! ① 猜字游戏 import random def guess_word_game(): words ["apple", "banana", "cherry&quo…...
Rocky Linux 9安装Asterisk 20和freepbx 17脚本——筑梦之路
脚本搜集来自Rocky Linux 9安装Asterisk 20和freepbx 17脚本 #!/bin/bash#Preparacion de ambiente de RockyLinuxecho "Deshabilitar SELINUX /etc/selinux/config "sed -i s/^SELINUX.*$/SELINUXdisabled/ /etc/selinux/configecho "Establecer nombre de maq…...
PSPICE FOR TI笔记记录1
快捷放置器件 R旋转 连线 w,单击器件引脚方块部分 电压探测笔 创建仿真文件 Analysis Type 分析模式:比如时域分析,频域分析 Run To Time 仿真时长 Skip intial transient bias point calculation (跳过初始瞬态偏置点计算(SKIPBP))一定要勾选 编辑…...
Java集合剖析4】LinkedList
目录 一、LinkedList的特有方法 二、LinkedList的底层数据结构 三、插入方法的具体实现 一、LinkedList的特有方法 LinkedList的底层是双向链表,它提供了操作首尾结点的方法 二、LinkedList的底层数据结构 LinkedList的底层是一个双向链表,有一个结点内部…...
基于MATLAB/octave的容积卡尔曼滤波(CKF)【带逐行注释】
介绍 CKF的三维滤波程序例程 产品概述 我们的 MATLAB 数据处理工具是专为科研人员、工程师和数据分析师设计的高效解决方案。该工具提供了一系列强大的功能,能够快速处理和分析大规模数据集,适用于各种科学和工程应用,包括信号处理、图像分…...
Python编程探索:从基础语法到循环结构实践(下)
文章目录 前言🍷四、 字符串拼接:连接多个字符串🍸4.1 使用 操作符进行字符串拼接🍸4.2 使用 join() 方法进行字符串拼接🍸4.3 使用 format() 方法进行格式化拼接🍸4.4 使用 f-string(格式化字…...
简介openwrt系统下/etc/config/network文件生成过程
openwrt的network文件,或者说在/etc/config下的文件,都是动态生成的。 脚本的函数定义在package/base-files/files/lib/functions中,有以下几个文件: libraSVN:~/Wang_SP4/openwrt-d03dc49/package/base-files/files/lib/functi…...
javaWeb项目-Springboot+vue-XX图书馆管理系统功能介绍
本项目源码(点击下方链接下载):java-springbootvue阿博图书馆管理系统源码(项目源码-说明文档)资源-CSDN文库 项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架:ssm、Springboot 前端&…...
华为ENSP用户权限深度解析:构建安全高效的网络管理
在华为ENSP(Enterprise Network Simulation Platform)用户界面中,用户权限级别是一个重要的概念,它用于限制不同用户访问设备的权限,从而增加设备管理的安全性。以下是对华为ENSP用户界面用户权限级别的详细解释&#…...
NFC之NDEF
NDEF的通用格式 MB标志是一个1位字段,当其被设置时,表示NDEF消息的开始。 ME标志是一个1位字段,当其被设置时,表示NDEF消息的结束。 CF标志是一个1位字段,指示这是分块有效载荷的第一个记录块或中间记录块。 SR标志是…...
学习第三十六行
QValidator::State里面state为0,完全不匹配,1,部分匹配,2,完全匹配,对于label或者textedit里面的字符均为QString类型,特别是遇到数字,需要QString::number转化,对于正则表达式&…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
