redis数据安全与性能保障

数据安全与性能保障

  • 1、持久化
    • 1.1 快照持久化
    • 1.2 AOF持久化
    • 1.3 重写/压缩AOF文件
  • 2、复制
    • 2.1 Redis复制的启动过程
    • 2.2 主从链
  • 3、处理系统故障
    • 3.1 验证快照文件和AOF文件
  • 4、事务
    • 4.1 java中的redis事务使用

如有侵权,请联系~
如有错误,也欢迎批评指正~
本篇文章大部分是来自学习《Redis实战》的笔记

1、持久化

redis提供了两种方式进行持久化到磁盘。一种是快照【RDB】:他可以将某一时刻的所有数据都保存到磁盘中;另一种是只追加文件【AOF】:把写命令保存到磁盘中。这两种持久化方式可以单独使用某一种,也可以同时使用。

1.1 快照持久化

redis可以通过创建快照获取内存中某一时刻的数据副本,可以对快照进行备份存储到磁盘或者将备份复制到其他的服务器上从而创建一样的数据。但是在新的快照文件创建保存完之前,只有redis、操作系统或者硬件有一个崩溃,那么最近的快照之后的数据将会丢失。

创建快照的方式:

  • 客户端向redis服务端发起bgsave命令。redis服务端会fork一个子进程负责将快照写入磁盘,父进程则继续处理命令
  • 客户端向redis服务端发起save命令。redis服务端在快照没有创建完之前不会执行其他的请求。这种方式不常用,只有内存不足的情况下或者阻塞等待持久化也没事的情况
  • 用户设置了save配置选项。例如 save 60 1000,60秒内有1000次写入的条件满足之后,redis就会自动触发bgsave命令
  • redis收到shutdown命令关闭服务器的请求时,会执行save命令,阻塞所有客户端,save命令执行完毕之后就会关闭服务器
  • 当一个redis服务器连接另一个redis服务器,通过向对方发送sync命令进行复制的时候,如果主服务器没有正在或者刚执行完的bgsave操作,主服务器就会执行bgsave命令

基于上述说的rdb会存在最近一次数据丢失的问题,因此,rdb这种方式不适用于那种不能接受数据丢失的应用,只适合丢失一部分数据也不会造成问题。

redis的rdb文件每次写入都会把之前的rdb从磁盘中删除么?

会的。RDB持久化过程中关于文件写入的大致流程:

  1. 创建临时文件:当触发RDB快照保存操作时,Redis不会直接覆盖现有的RDB文件,而是首先创建一个临时文件来存储新的数据库快照。这个临时文件通常命名为类似于dump.rdb.tmp。
  2. 数据写入临时文件:Redis会将当前内存中的所有数据序列化并写入到上述提到的临时文件中。这一步确保了即使在写入过程中出现错误或中断,原有的RDB文件也不会被破坏或丢失。
  3. 替换旧文件:一旦所有的数据都被成功写入临时文件并且文件关闭后,Redis才会尝试用这个新生成的临时文件去替换原来的RDB文件。这种替换通常是通过操作系统级别的重命名操作完成的,这样可以保证原子性,即要么完全更新为新版本,要么保持不变。
  4. 清理工作:如果替换过程顺利完成,则原有的RDB文件会被移除;而如果由于某些原因导致替换失败(例如权限问题),那么临时文件会被保留下来,但原始的RDB文件仍然可用,从而确保了数据的安全性和一致性。

1.2 AOF持久化

AOF持久化就是将写命令追加到AOF文件的末尾,Redis到时候只需要重放一次AOF的命令即可恢复所有数据。针对于持久化的频率,可以通过appendfsync选项配置进行设置。如下是appendfsync的值:

选项同步频率
alwaysredis的每个写入命令都会同步的写入到磁盘,这样会严重降低redis的速度,
增加磁盘的写入频率从而降低磁盘的寿命
everysec每秒同步一次,显示的将多个写命令同步到磁盘。综合性能和数据安全,推荐使用
no同步的时机完全交给操作系统来控制

1.3 重写/压缩AOF文件

Redis的AOF持久化有很多优点:可以将持久化的窗口降低到1秒,并且持久化的时间短。但是缺点也很明显:虽然redis不断运行,写入命令越来越多,导致aof文件不断增加,占用空间大;当机器重启或者增加从节点进行还原数据集也会很慢。

为了解决这个问题,redis提供了bgwriteaof命令。这个命令会通过移除 AOF 文件中的冗余命令来重写(rewrite )AOF文件,使 AOF文件的体积变得尽可能地小。Redis会创建一个子进程,然后由子进程负责对AOF文件进行重写。可以通过auto-aof-rewrite-percentage和auto-aof-rewrite-min-size两个选项进行控制压缩重写AOF文件的频率。

可以参考文献:redis相关问题

除了持久化到磁盘以外,对持久化的文件进行备份也是有必要的,例如备份到不同的服务器上。

2、复制

复制可以让其他服务器拥有一个不断地更新的数据副本,从而使得拥有数据副本的服务器可以用于处理客户端发送的读请求。

在从服务器上配置slaveof host port,redis服务器就可以根据IP和端口号连接主服务器。

2.1 Redis复制的启动过程

从服务器连接主服务器的步骤:
在这里插入图片描述
在进行主从复制的时候,主服务器仍然对外提供服务,处理请求命令。如果服务器的内存不足创建子进程或者缓冲区,或者带宽不足,可能会影响请求的效率。一般主服务器的内存只使用50%~65%,留30%~45%的内存用作创建子进程和缓存区。

如果有多个从服务器连接同一个主服务器的时候:

  • 前一个从服务器第三步还没执行完,则这个服务器也会使用同一个rdb文件和缓冲区
  • 如果前一个已经执行完第五步,那么这个新连接就从第一步开始

大部分情况,我们期望尽可能减少Redis复制所需要的工作,尽可能同时。但是如果同步多个服务器可能会占用大量的带宽,从而影响主服务器接受请求命令。

哨兵模式:在切换主服务器的时候也会涉及到复制问题。
在这里插入图片描述

2.2 主从链

创建多个从服务器可能会造成网络不可用,原因如上带宽问题,因此诞生了主从链。从服务器对从服务器进行复制在操作上和从服务器对主服务器进行复制的唯一区别在于:如果从服务器X拥有从服务器Y,那么当从服务器X在执行步骤4时,它将断开与从服务器Y的连接,导致从服务器Y需要重新连接并重新同步(resync)。

当读请求的重要性明显高于写请求的重要性,并且读请求的数量远远超出一台Redis 服务器 可以处理的范围时,用户就需要添加新的从服务器来处理读请求。随着负载不断上升,主服务器 可能会无法快速地更新所有从服务器,或者因为重新连接和重新同步从服务器而导致系统超载。 为了缓解这个问题,用户可以创建一个由Redis 主从节点(master/slavenode)组成的中间层来分担主服务器的复 制工作:
在这里插入图片描述

3、处理系统故障

3.1 验证快照文件和AOF文件

无论是快照持久化还是AOF持久化,都提供了在遇到系统故障时进行数据恢复的工具。Redis提供了两个命令行程序redis-check-aof和redis-check-dump,它们可以在系统故障发生之后,检查AOF文件和快照文件的状态,并在有需要的情况下对文件进行修复。

程序修复AOF文件的方法非常简单:它会扫描给定的AOF文件,寻找不正确或者不完整的命令,当发现第一个出错命令的时候,程序会删除出错的命令以及位于出错命令之后的所有命令,只保留那些位于出错命令之前的正确命令。在大多数情况下,被删除的都是AOF文件末尾的不完整的写命令。

目前并没有办法可以修复出错的快照文件。尽管发现快照文件首个出现错误的地方是有可能的,但因为快照文件本身经过了压缩,而出现在快照文件中间的错误有可能会导致快照文件的剩余部分无法被读取。

4、事务

Redis的事务以特定的命令MULTI为开始,之后跟着多个命令,最后以EXEC命令结束。
事务示例:

WATCH key1
MULTI
SET key1 newValue
SET key2 newValue
EXEC

以下是这些命令的简要说明:

  1. MULTI 命令
    MULTI 命令用于标记一个事务块的开始。在执行了 MULTI 命令之后,所有的 Redis 命令都会被记录到一个待执行的队列中,但不会立即执行,而是等待 EXEC 命令的执行。

  2. EXEC 命令
    EXEC 命令用于执行所有之前通过 MULTI 命令放入队列中的命令。如果事务中的所有命令都被正确执行,那么 EXEC 命令会返回一个数组,包含了所有命令的返回值。如果事务在执行过程中遇到错误(例如语法错误),则整个事务会被放弃,之前的命令都不会被执行。

  3. DISCARD 命令
    DISCARD 命令用于取消一个事务,它清空之前通过 MULTI 命令放入队列中的所有命令。如果在一个事务已经开始但还没有调用 EXEC 或 DISCARD 的情况下发生错误,可以调用 DISCARD 来放弃事务。

  4. WATCH 命令
    WATCH 命令是一个乐观锁,用于在事务执行前监视一个或多个键。如果在 EXEC 执行时,被监视的键至少有一个已经被其他客户端改变,则整个事务不会执行,EXEC 命令将返回 nil 表示事务失败。这通常用于在并发环境下保证数据的一致性。

4.1 java中的redis事务使用

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;public class RedisOptimisticLockExample {public static void main(String[] args) {try (Jedis jedis = new Jedis("localhost", 6379)) {String key = "balance";int valueToAdd = 10;// 监视键"balance"jedis.watch(key);int currentBalance = Integer.parseInt(jedis.get(key));if (currentBalance < 100) {// 开启事务Transaction transaction = jedis.multi();transaction.incrBy(key, valueToAdd);// 提交事务if (transaction.exec() != null) {System.out.println("事务执行成功,余额增加了:" + valueToAdd);} else {System.out.println("事务执行失败,可能是监视的键发生了变化。");}} else {System.out.println("当前余额已足够,无需增加。");}// 取消监视键jedis.unwatch();} catch (Exception e) {e.printStackTrace();}}
}

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

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

相关文章

数据分析系列--③RapidMiner算子说明及数据预处理

一、算子说明 1.新建过程 2.算子状态灯 状态灯说明: (1)状态指示灯&#xff1a; 红色:指示灯说明有参数未被设置或输入端口未被连接等问题; 黄色:指示灯说明还未执行算子&#xff0c;不管配置是否基本齐全; 绿色:指示灯说明一切正常&#xff0c;已成功执行算子。 (2)三角…

基于Go语言的三甲医院人机与智能体协同环境系统(上.文章部分)

一、引言 1.1 研究背景与意义 1.1.1 三甲医院对高效协同系统的需求 三甲医院作为医疗体系的核心力量,承担着疑难病症诊治、医学科研教学等重要任务,其业务具有高度的复杂性。在日常运营中,三甲医院涉及多个科室,每个科室又包含众多专业领域,各科室之间需要紧密协作,共…

js笔记(黑马程序员)

&#xff08;Web APIs day4&#xff09; 一、日期对象 1.实例化 在代码中发现了 new 关键字时&#xff0c;一般将这个操作称为实例化 创建一个时间对象并获取时间// 1&#xff0e;得到当前时间 2.日期对象方法 因为日期对象返回的数据我们不能直接使用&#xff0c;所以需…

SOME/IP--协议英文原文讲解2

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 4.1 Speci…

python-leetcode-反转链表 II

92. 反转链表 II - 力扣&#xff08;LeetCode&#xff09; # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def reverseBetween(self, head: Optional…

LM Studio 本地部署DeepSeek及其他AI模型的详细操作教程及硬件要求

本篇文章主要讲解&#xff0c;通过LM Studio工具实现各类型AI模型本地部署的操作方法方式。 作者&#xff1a;任聪聪 日期&#xff1a;2025年1月29日 LM Studio 介绍&#xff1a; LM Studio是一款能够本地离线运行各类型大语言模型的客户端应用&#xff0c;通过LM Studio 可以…

SOME/IP--协议英文原文讲解3

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 Note: Thi…

Janus Pro:DeepSeek 开源革新,多模态 AI 的未来

Janus Pro 是 DeepSeek 开发的一个开源多模态人工智能框架&#xff0c;它通过集成视觉和语言处理能力&#xff0c;提供了高性能的多模态任务处理能力。 在线体验&#xff1a; https://deepseek-januspro.com/ 背景 Janus Pro 于2025年1月发布&#xff0c;是一个开源的多模态…

Jenkins上生成的allure report打不开怎么处理

目录 问题背景&#xff1a; 原因&#xff1a; 解决方案&#xff1a; Jenkins上修改配置 通过Groovy脚本在Script Console中设置和修改系统属性 步骤 验证是否清空成功 进一步的定制 也可以使用Nginx去解决 使用逆向代理服务器Nginx&#xff1a; 通过合理调整CSP配置&a…

指针的介绍3前

1.字符指针变量 1.1介绍 char arr[] "abcdef";char* p arr; 上面的代码中&#xff0c;我创建了 字符数组 arr 来存储一个字符串 此时&#xff0c;我可以创建一个指针变量对这个字符串进行相应的修改&#xff1a; 我也可以创建一个指针变量指向一个字符串&#xff…

Scrapy如何设置iP,并实现IP重用, IP代理池重用

前置知识 1/3乐观锁 2/3 Scrapy流程(非全部) 3/3 关于付费代理 我用的"快代理", 1000个ip, 每个ip1min的有效期, 你用的时候, 把你的链接, 用户名填上去就行 设置代理IP &#x1f512; & 帮助文档: ①meta ②meta#proxy$ 语法: ①proxy的设置: Request对象中…

gesp(C++六级)(7)洛谷:P10376:[GESP202403 六级] 游戏

gesp(C六级)&#xff08;7&#xff09;洛谷&#xff1a;P10376&#xff1a;[GESP202403 六级] 游戏 题目描述 你有四个正整数 n , a , b , c n,a,b,c n,a,b,c&#xff0c;并准备用它们玩一个简单的小游戏。 在一轮游戏操作中&#xff0c;你可以选择将 n n n 减去 a a a&am…

【16届蓝桥杯寒假刷题营】第2期DAY5

5.变变数组 - 蓝桥云课 给定一个长度为 n 的整数数组 A&#xff0c;A 中第 i 个元素为 Ai​&#xff08;1≤i≤n&#xff09;&#xff0c;你只能在 A 中选择一个元素 a&#xff0c;将 A 中所有数值等于 a 的元素变为 a2&#xff0c;请问变化后 A 中所有元素和的最大为多少。 …

论文阅读(十五):DNA甲基化水平分析的潜变量模型

1.论文链接&#xff1a;Latent Variable Models for Analyzing DNA Methylation 摘要&#xff1a; 脱氧核糖核酸&#xff08;DNA&#xff09;甲基化与细胞分化密切相关。例如&#xff0c;已经观察到肿瘤细胞中的DNA甲基化编码关于肿瘤的表型信息。因此&#xff0c;通过研究DNA…

SpringBoot+Electron教务管理系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1.查询课程表代码2.保存学生信息代码3.用户登录代码 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SpringBootElectron框架开发的教务管理系统。首先&#xff…

STM32 LED呼吸灯

接线图&#xff1a; 这里将正极接到PA0引脚上&#xff0c;负极接到GND&#xff0c;这样就高电平点亮LED&#xff0c;低电平熄灭。 占空比越大&#xff0c;LED越亮&#xff0c;占空比越小&#xff0c;LED越暗 PWM初始化配置 输出比较函数介绍&#xff1a; 用这四个函数配置输…

RAG是否被取代(缓存增强生成-CAG)吗?

引言&#xff1a; 本文深入研究一种名为缓存增强生成&#xff08;CAG&#xff09;的新技术如何工作并减少/消除检索增强生成&#xff08;RAG&#xff09;弱点和瓶颈。 LLMs 可以根据输入给他的信息给出对应的输出&#xff0c;但是这样的工作方式很快就不能满足应用的需要: 因…

docker 部署 java 项目详解

在平常的开发工作中&#xff0c;我们经常需要部署项目&#xff0c;开发测试完成后&#xff0c;最关键的一步就是部署。今天我们以若依项目为例&#xff0c;总结下部署项目的整体流程。简单来说&#xff0c;第一步&#xff1a;安装项目所需的中间件&#xff1b;第二步&#xff1…

【C++】STL介绍 + string类使用介绍 + 模拟实现string类

目录 前言 一、STL简介 二、string类 1.为什么学习string类 2.标准库中的string类 3.auto和范围for 4.迭代器 5.string类的常用接口说明 三、模拟实现 string类 前言 本文带大家入坑STL&#xff0c;学习第一个容器string。 一、STL简介 在学习C数据结构和算法前&#xff0c;我…

使用 MSYS2 qemu 尝鲜Arm64架构国产Linux系统

近期&#xff0c;我的师弟咨询我关于Arm64架构的国产CPU国产OS开发工具链问题。他们公司因为接手了一个国企的单子&#xff0c;需要在这类环境下开发程序。说实在的我也没有用过这个平台&#xff0c;但是基于常识&#xff0c;推测只要基于C和Qt&#xff0c;应该问题不大。 1. …