Redis--Lesson06--Redis进阶2

news/2025/3/12 23:12:55/文章来源:https://www.cnblogs.com/5ran2yl/p/18768880

一.Redis持久化之RDB

Redis的RDB持久化机制是通过快照(snapshot)的形式将存储在内存中的数据以一定的时间间隔保存到硬盘上。以下是RDB持久化的具体流程:
  1. 触发条件:RDB文件可以通过配置文件设置自动触发(例如,根据时间或修改次数),也可以手动通过命令SAVE或BGSAVE来触发。
  2. 开始持久化:当使用SAVE命令时,Redis会阻塞当前所有的客户端请求,直到RDB文件创建完成。这种方式不推荐在生产环境中使用,因为它会影响服务性能。使用BGSAVE命令时,Redis会派生(fork)出一个子进程来处理实际的持久化工作,而父进程继续处理客户端请求。这是更常用的持久化方法。
  3. 写入临时文件:子进程开始将数据库状态写入一个临时的RDB文件中。在此期间,Redis会记录所有新发生的写操作,但不会立即将它们加入到正在生成的RDB文件中。
  4. 写入完成:当子进程完成RDB文件的写入后,Redis会用这个新的RDB文件替换旧的RDB文件。
  5. 处理写操作缓冲:如果在持久化过程中有新的写操作发生,这些操作会被记录在一个缓冲区中,并且在下一次持久化时被考虑到。

 rdb持久化默认保存的dump.rdb文件,也可以在配置文件中配置

 为了测试一下,我们可以修改一下rdb的缓存策略,让其一分钟更改3次就持久化一次

 测试

 我们关机之后,再开机,测试数据是否完成保存:

 我们可以发现由于内存关机即失的原理,所以内存中应当没有数据,但是有趣redis启动时会加载dump.rdb文件,最后就会重新数据,正常情况下关机也会持久化一次

但是也有极端情况,会导致宕机到上一次持久化之前的数据会丢失

rdb使用自己的一些命令规则保存的数据,而aof则是使用的存储命令

优点是大数据恢复速度很快,缺点是可能会有数据缺失的情况

二.Redis持久化之AOF

Redis的AOF(Append Only File)持久化机制通过记录服务器接收到的每个写操作命令到日志文件中,并在Redis重启时重新执行这些命令来恢复数据。

  1. 开启AOF:首先需要在Redis配置文件(redis.conf)中开启AOF功能,设置appendonly yes。
  2. 选择同步策略:Redis允许你配置何时将数据写入磁盘,这是通过设置appendfsync选项来实现的。你可以选择以下三种之一:always: 每次有新命令时都同步。这种方式最安全但性能消耗最大。everysec: 每秒同步一次。这是平衡性能和安全性的推荐设置。no: 不主动同步,让操作系统决定何时进行同步。这提供了最佳性能但降低了安全性。
  3. 命令追加到AOF文件:每当一个写命令到达Redis服务器,这个命令会被追加到AOF缓冲区中,随后根据上述配置的同步策略被写入到磁盘上的AOF文件。
  4. 重写过程(AOF Rewrite):随着Redis运行时间的增长,AOF文件会越来越大。为了避免AOF文件过大,Redis支持AOF重写。重写过程可以手动触发(BGREWRITEAOF命令)或自动触发(基于配置)。重写过程中,Redis会创建一个新的AOF文件,只包含重建当前数据集所需的最小命令集合,从而减少文件大小。
  5. 加载AOF文件:当Redis重启时,它会优先尝试使用AOF文件来恢复数据,因为AOF文件通常比RDB文件更完整。Redis读取AOF文件中的命令并逐一执行,以此来重建内存中的数据集。

默认aof是不开启的,因为它保存到是用户的更新命令,而且是追加模式,如果不断的增加Aof文件会非常大;但是在两种策略都开启的情况下,默认会使用aof恢复,rdb就会做备份校对,因为aof保存的原始命令使得其可以精准的构建出原始的数据结构。

 默认保存的文件是appendonly.aof

 三种持久化模式:每次命令都持久化,每秒都同步,不主动同步

更改允许aof持久化之后测试:

我们可以查看aof文件中的数据:

 我们发现果然就是记录的命令,接着我们去毁坏里面的数据,看看重启会发生什么:

 我们发现毁坏aof文件后启动不了redis了,但是发生这种情况先不要慌,因为redis官方给我们提供了一个组件专门用于修复:redis-check-aof

 命令:

redis-check-aof --fix appendonly.aof

 修复工具有好有坏,好处可以帮我们快速启动redis,坏处也很明显,可能存在丢失数据的情况

aof的存储文件会很大占用很多内存,并且运行也比rdb慢,故而redis默认的是rdb,但是相较来说aof可以做到只丢失一秒钟的交互数据,或者丢失,各有所长

RDB的优点

  • 性能影响小:RDB通过快照的形式进行数据持久化,整个过程由子进程完成,因此对Redis服务器性能的影响较小。
  • 恢复速度快:因为RDB文件是一个紧凑的二进制文件,所以加载速度较快,适合用于灾难恢复。
  • 易于备份:RDB文件是某一时刻的数据快照,便于进行全量备份。

RDB的缺点

  • 数据丢失风险:由于RDB是定时生成快照,因此在两次快照之间如果发生故障,则这段时间内的数据将会丢失。
  • 高负载下的性能问题:创建RDB文件时,特别是在数据集非常大的情况下,可能会导致Redis短暂地停止服务(尤其是在使用SAVE而非BGSAVE命令时)。

AOF的优点

  • 更高的数据安全性:AOF记录了每个写操作,因此即使发生故障也能最大程度地减少数据丢失。
  • 灵活的同步策略:可以根据实际需求选择不同的fsync策略(always, everysec, no),以平衡数据安全性和性能。
  • 日志可读性:AOF文件本质上是一系列Redis命令,人类可读,便于调试和修复。

AOF的缺点

  • 文件体积大:由于记录了所有的写操作,AOF文件通常比RDB文件大得多。
  • 恢复时间较长:因为需要重新执行所有的写命令来恢复数据集,所以在数据量较大时,恢复时间可能较长。
  • 性能消耗:尽管有多种同步策略可供选择,但在某些配置下(如always),会对性能产生显著影响。

三.Redis订阅发布

Redis的发布/订阅(Pub/Sub)是一种消息通信模式,它允许消息发送者(发布者)通过频道(Channel)发送消息,而不需要知道谁是接收者。同样地,接收者(订阅者)可以订阅一个或多个频道来接收消息,而不需要知道是谁发送了这些消息。这种模式实现了发布者和订阅者之间的解耦,使得系统更加灵活和可扩展

在Redis中,发布/订阅功能主要依赖于以下命令:

  • PUBLISH channel message:将消息发布到指定的频道。
  • SUBSCRIBE channel [channel ...]:订阅给定的一个或多个频道。
  • PSUBSCRIBE pattern [pattern ...]:订阅符合给定模式的一个或多个频道。模式支持通配符,如news.*会匹配所有以news.开头的频道。
  • UNSUBSCRIBE [channel [channel ...]]:停止接收指定频道的消息。如果没有参数,则取消当前所有频道的订阅。
  • PUNSUBSCRIBE [pattern [pattern ...]]:停止接收符合指定模式的所有频道的消息。

 订阅一个消息号SUBSCRIBE:

SUBSCRIBE users

 

发布一个订阅信息:

PUBLISH users hello,world

 

实现原理
Redis维护了一个全局的字典,字典的键是频道名,值是一个链表,链表中存储了所有订阅该频道的客户端对象。
对于模式匹配订阅,Redis还有一个独立的字典,其键是模式,值是一个链表,链表中存储了所有订阅该模式的客户端对象。
消息发布:
当执行PUBLISH channel message命令时,Redis首先查找订阅了指定频道的所有客户端列表。然后,Redis遍历这个列表,并将消息发送给每个订阅者。如果有模式匹配订阅也符合当前频道,则相应的客户端也会接收到消息。
订阅操作:
当执行SUBSCRIBE channel [channel ...]命令时,Redis会在上述提到的全局字典中添加对应的客户端对象到指定频道的订阅者列表中。对于PSUBSCRIBE pattern [pattern ...]命令,Redis则在模式匹配的字典中添加客户端对象到相应模式的订阅者列表中。

 

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

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

相关文章

Spring Security-web安全框架

进入移动互联网时代,大家每天都在刷手机,常用的软件有微信、支付宝、头条等,下边拿微信来举例子说明认证相关的基本概念,在初次使用微信前需要注册成为微信用户,然后输入账号和密码即可登录微信,输入账号和密码登录微信的过程就是认证。Spring Security 1. 基本概念 1.1 …

SpringBoot文件上传到数据库

SpringBoot文件上传到数据库 首先导入了相应的jar包 <!--thymeleaf--> <dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf-spring5</artifactId> </dependency> <dependency><groupId>org.thymeleaf.…

供应链系统中的 “计划单、订单、通知单,入库 / 出库单” 的区别

在供应链管理中,各种单据是业务流程的核心纽带,但它们之间的区别和联系常常让新手感到困惑。本文从采购和销售两大业务场景出发,详细拆解了“计划单、订单、通知单、入库/出库单”等常见单据的定义、作用及相互关系。在供应链系统中,经常会听到一些名字相近,但是意思可能略…

20232209实验一《Python程序设计》实验报告

20232209 2024-2025-2 《Python程序设计》实验一报告 课程:《Python程序设计》 班级: 2322 姓名: 吴易阳 学号:20232209 实验教师:王志强 实验日期:2025年3月12日 必修/选修: 公选课 1.实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能;(编写书中的程序…

20242909王天宇_网络攻防实践第2次作业

20242909王天宇《网络攻防实践》第2次作业 1.实验内容 学习内容总结 本次实验内容涵盖了网络信息查询、网络安全扫描和个人隐私保护等多个方面,旨在通过实践掌握网络信息获取、漏洞分析及隐私保护的基本技能。主要学习内容如下:DNS与IP信息查询:通过 nslookup 等工具,学习如…

如何给海淘电子产品挑一根「合格」电源线——IEC 320解读

转载声明:https://sspai.com/post/72699 网站:少数派 作者:Levinson喜欢海淘的朋友们,你是否碰到过「买来的数码产品或家用小电器自带的电源插头不是中国大陆标准,不得不自己再配一根国标线却不知道该搜什么关键词」的尴尬时刻呢?实际上这些电源线都是有统一标准的,这个…

IEC 320解读——如何给海淘电子产品挑一根「合格」电源线

喜欢海淘的朋友们,你是否碰到过「买来的数码产品或家用小电器自带的电源插头不是中国大陆标准,不得不自己再配一根国标线却不知道该搜什么关键词」的尴尬时刻呢?实际上这些电源线都是有统一标准的,这个标准被称为 IEC 60320,所有的电源线都可以通过这个标准找到唯一的那一…

Netty基础—3.基础网络协议

大纲 1.网络基础的相关问题总结 2.七层模型和四层模型 3.物理层(网线 + 光缆 + 01电信号) 4.数据链路层(以太网协议 + 网卡mac地址) 5.网络层(IP协议 + 子网划分 + 路由器) 6.传输层(TCP和UDP协议 + Socket + 端口) 7.应用层(HTTP协议 + SMTP协议) 8.浏览器请求一个域名会发生什…

4, 表单

复选框 复选框组 将一组复选框或单选按钮组合成一组并排放置的Bootstrap按钮bootstrap.min.cssjquery.min.jsbootstrap.min.jsdiv.btn-group[data-toggle=buttons]label.btn.btn-default.activeinput[type=checkbox]{Option 1}label.btn.btn-defaultinput[type=checkbox]{Opti…

0:c#教程-概述

查看和调试 .net 源码 ildsm 工具查看程序集,SDK 目录下 ilspy 反汇编工具 1.3 C#面向对象编程基础 如何表达信息 --> 选择合适的数据结构 如何处理信息 --> 算法和程序控制结构 如何实现 --> 软件系统架构,面向对象的分析与设计 怎样构造求解问题的算法? 算法,…

2,CSS

CSS盒子模型IE盒模型 border-box width和height是盒子最终的尺寸(添加box-sizing:border-box ) 标准盒模型 content-box width和height只是内容的尺寸(默认)width height background-color border padding margin (box-sizing)CSS布局实践 display 定义了元素生成的显…

Linux使用:Vim常用命令

多文件编辑 操作 c #c 是“修改(change)”(即删除后进入插入模式),后面可以接一个移动命令 cw #删除一个单词并进入插入模式 c2w 或者 2cw #删除两个单词并进入插入模式ctrl + h/w/u #删除前一个字符,前一个单词,前一行w/W #下一个单词开头 e/E # 下一个单词结尾 …