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.rhkb.cn/news/10292.html

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

相关文章

【AI非常道】二零二五年一月(二),AI非常道

经常在社区看到一些非常有启发或者有收获的话语&#xff0c;但是&#xff0c;往往看过就成为过眼云烟&#xff0c;有时再想去找又找不到。索性&#xff0c;今年开始&#xff0c;看到好的言语&#xff0c;就记录下来&#xff0c;一月一发布&#xff0c;亦供大家参考。 有关AI非…

从巫师求雨说起

树上停着一只猫头鹰&#xff1a; 你相信吗&#xff1f;这不是一般的鸟&#xff0c;猫头鹰其实是一个人&#xff0c;它是一个巫师变的。 你不相信&#xff1f;那我问你&#xff0c;为什么猫头鹰和乌鸦一样&#xff0c;那叫声&#xff0c;常常让人瘆得慌&#xff1f;(owl&#x…

【C++】类和对象

面向对象编程 学习过C语言的小伙伴知道&#xff1a;C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 面向过程编程也叫结构化编程。虽然结构化编程的理念提高了程序的清晰度&#xff0c;可靠性&#xff0c…

21.3-启动流程、编码风格(了解) 第21章-FreeRTOS项目实战--基础知识之新建任务、启动流程、编码风格、系统配置 文件组成和编码风格(了解)

21.3-启动流程、编码风格(了解) 启动流程 第一种启动流程(我们就使用这个): 在main函数中将硬件初始化、RTOS系统初始化&#xff0c;同时创建所有任务&#xff0c;再启动RTOS调度器。 第二种启动流程&#xff1a; 在main函数中将硬件初始化、RTOS系统初始化&#xff0c;只…

富文本 tinyMCE Vue2 组件使用简易教程

参考官方教程 TinyMCE Vue.js integration technical reference Vue2 项目需要使用 tinyMCE Vue2 组件(tinymce/tinymce-vue)的第 3 版 安装组件 npm install --save "tinymce/tinymce-vue^3" 编写组件调用 <template><Editorref"editor"v-m…

vue框架技术相关概述以及前端框架整合

vue框架技术概述及前端框架整合 1 node.js 介绍&#xff1a;什么是node.js Node.js就是运行在服务端的JavaScript。 Node.js是一个事件驱动I/O服务端JavaScript环境&#xff0c;基于Google的V8引擎。 作用 1 运行java需要安装JDK&#xff0c;而Node.js是JavaScript的运行环…

【AI】Deepseek本地部署探索,尝试联网搜索

前言 1月下旬&#xff0c;Deepseek-R1横空出世&#xff0c;其依靠堪比GPT-o1的推理能力&#xff0c;训练成本及使用成本均只有gpt几十分之一甚至百分之一的超高性价比&#xff0c;以及它足够“OPEN”的特性直接暴打人工智能的资本行业&#xff0c;本着求实求新的精神&#xff…

DeepSeek介绍

目录 前言 1.介绍一下你自己 2.什么是CUDA CUDA的核心特点&#xff1a; CUDA的工作原理&#xff1a; CUDA的应用场景&#xff1a; CUDA的开发工具&#xff1a; CUDA的局限性&#xff1a; 3.在AI领域&#xff0c;PTX是指什么 1. PTX 的作用 2. PTX 与 AI 的关系 3. …

WGCLOUD服务器资源监控软件使用笔记 - Token is error是什么错误

[wgcloud-agent]2025/01/30 10:41:30 WgcloudAgent.go:90: 主机监控信息上报server开始 [wgcloud-agent]2025/01/30 10:41:30 WgcloudAgent.go:99: 主机监控信息上报server返回信息: {"result":"Token is error"} 这个错误是因为agent配置的wgToken和serv…

OpenAI-Edge-TTS:本地化 OpenAI 兼容的文本转语音 API,免费高效!

文本转语音&#xff08;TTS&#xff09;技术已经成为人工智能领域的重要一环&#xff0c;无论是语音助手、教育内容生成&#xff0c;还是音频文章创作&#xff0c;TTS 工具都能显著提高效率。今天要为大家介绍的是 OpenAI-Edge-TTS&#xff0c;一款基于 Microsoft Edge 在线文本…

Leetcode 131 分割回文串(纯DFS)

131. 分割回文串https://leetcode.cn/problems/palindrome-partitioning/https://leetcode.cn/problems/palindrome-partitioning/ 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 示例 1&#xff1a…

服务器虚拟化技术详解与实战:架构、部署与优化

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 引言 在现代 IT 基础架构中&#xff0c;服务器虚拟化已成为提高资源利用率、降低运维成本、提升系统灵活性的重要手段。通过服务…

记录一次,PyQT的报错,多线程Udp失效,使用工具如netstat来检查端口使用情况。

1.问题 报错Exception in thread Thread-1: Traceback (most recent call last): File "threading.py", line 932, in _bootstrap_inner File "threading.py", line 870, in run File "main.py", line 456, in udp_recv IndexError: list…

【PyTorch】6.张量运算函数:一键开启!PyTorch 张量函数的宝藏工厂

目录 1. 常见运算函数 个人主页&#xff1a;Icomi 专栏地址&#xff1a;PyTorch入门 在深度学习蓬勃发展的当下&#xff0c;PyTorch 是不可或缺的工具。它作为强大的深度学习框架&#xff0c;为构建和训练神经网络提供了高效且灵活的平台。神经网络作为人工智能的核心技术&…

线段树 算法

文章目录 基础知识适用场景小结 题目概述题目详解300.最长递增子序列2407.最长递增子序列 II 基础知识 线段树和树状数组都只是一个工具来的&#xff0c;题目并不会一下子就告诉你这个题目用到线段树和树状数组&#xff0c;这个取决于你想使用的数据结构以及所要优化的方向 线…

JVM_类的加载、链接、初始化、卸载、主动使用、被动使用

①. 说说类加载分几步&#xff1f; ①. 按照Java虚拟机规范,从class文件到加载到内存中的类,到类卸载出内存为止,它的整个生命周期包括如下7个阶段: 第一过程的加载(loading)也称为装载验证、准备、解析3个部分统称为链接(Linking)在Java中数据类型分为基本数据类型和引用数据…

SpringBoot+Vue的理解(含axios/ajax)-前后端交互前端篇

文章目录 引言SpringBootThymeleafVueSpringBootSpringBootVue&#xff08;前端&#xff09;axios/ajaxVue作用响应式动态绑定单页面应用SPA前端路由 前端路由URL和后端API URL的区别前端路由的数据从哪里来的 Vue和只用三件套axios区别 关于地址栏url和axios请求不一致VueJSPS…

socket实现HTTP请求,参考HttpURLConnection源码解析

背景 有台服务器&#xff0c;网卡绑定有2个ip地址&#xff0c;分别为&#xff1a; A&#xff1a;192.168.111.201 B&#xff1a;192.168.111.202 在这台服务器请求目标地址 C&#xff1a;192.168.111.203 时必须使用B作为源地址才能访问目标地址C&#xff0c;在这台服务器默认…

Hive:复杂数据类型之Map函数

Map函数 是Hive里面的一种复杂数据类型, 用于存储键值对集合。Map中的键和值可以是基础类型或复合类型&#xff0c;这使得Map在处理需要关联存储信息的数据时非常有用。 定义map时,需声明2个属性: key 和 value , map中是 key value 组成一个元素 key-value, key必须为原始类…

项目集成GateWay

文章目录 1.环境搭建1.创建sunrays-common-cloud-gateway-starter模块2.目录结构3.自动配置1.GateWayAutoConfiguration.java2.spring.factories 3.pom.xml4.注意&#xff1a;GateWay不能跟Web一起引入&#xff01; 1.环境搭建 1.创建sunrays-common-cloud-gateway-starter模块…