3、事务与持久化

目录

1、事务

2、持久化

1. RDB

2.AOF

3.Redis的主从架构

4、哨兵

5、Redis的集群


1、事务

Redis事务:一次失误操作,该成功的成功,该失败的失败。

先开启事务,执行一些列的命令,但是命令不会立即执行,会存放在一个

队列中,如果你执行事务,

这个队列中的所有命令都会执行,取消事务,所有命令全部作废。

redis事务的主要作用就是串联多个命令防止 别的命令插队。

大致的形式如下:

begin();

try {

// 执行业务相关代码

command1();

command2();

....

commit();

} catch(Exception e) {

rollback();

}

Redis 在形式上看起来也差不多,MULTI、EXEC、DISCARD这三个指令构成

了 redis 事务处理的基础:

MULTI:用来组装一个事务,从输入Multi命令开始,输入的命令都会依次进

入命令队列中, 但不会执行,直到输入Exec后,redis会将之前的命令依次执

行。

EXEC:用来执行一个事务

DISCARD:用来取消一个事务

事务操作案例1:

127.0.0.1:6379> set user_id 1 # 定义了一个user_id的key,value为1

OK

127.0.0.1:6379> get user_id

"1"

127.0.0.1:6379> MULTI # 标记事务开始

OK

127.0.0.1:6379> incr user_id # 多条命令按顺序入队,返回值为QUEUED,

表示这个命令加入队列了,还没有被执行。

QUEUED

127.0.0.1:6379> incr user_id # incr是自增的命令

QUEUED

127.0.0.1:6379> incr user_id

QUEUED

127.0.0.1:6379> exec # 执行事务过后返回的是事务块内所有命令的返回

值,按命令执行的先后顺序排列。

1) (integer) 2

2) (integer) 3

3) (integer) 4

127.0.0.1:6379> get user_id

"4"

上面的指令演示了一个完整的事务过程,所有的指令在 exec 之前不执行,

而是缓存在服务器的一个事务队列中,

服务器一旦收到 exec 指令,才开执行整个事务队列,执行完毕后一次性返

回所有指令的运行结果。

因为 Redis 的单线程特性,不用担心自己在执行队列的时候被其它指令打

搅,可以保证能得到的有顺序的执行。

案例二:取消事务,放弃执行事务块内的所有命令

127.0.0.1:6379> keys *

(empty list or set)

127.0.0.1:6379> MULTI

OK

127.0.0.1:6379> SET greeting "hello"

QUEUED

127.0.0.1:6379> set kaka aaa

QUEUED

127.0.0.1:6379> DISCARD

OK

127.0.0.1:6379> keys *

(empty list or set)

案例三:组队中某个命令出现了错误报告,执行时整个队列中所有的命令

都会被取消。

127.0.0.1:6379> flushdb

OK

127.0.0.1:6379> multi # 开启一个事务块

OK

127.0.0.1:6379> set name ready

QUEUED

127.0.0.1:6379> set age 30

QUEUED

127.0.0.1:6379> set1 age 60 # 命令有问题,导致加入队列失败

(error) ERR unknown command `set1`, with args beginning with: `age`,

`60`,

127.0.0.1:6379> exec # 执行exec的时候,事务中所有命令都被取消

(error) EXECABORT Transaction discarded because of previous errors.

127.0.0.1:6379> get name # 事务当中的命令也全都执行失败了

(nil)

127.0.0.1:6379> keys *

(empty list or set)

案例4:命令组队的过程中没有问题,执行中出现了错误会导致部分成功部

分失败。

127.0.0.1:6379> flushdb

OK

127.0.0.1:6379> multi

OK

127.0.0.1:6379> set books iamastring

QUEUED

127.0.0.1:6379> set poorman iamdesperate

QUEUED

127.0.0.1:6379> incr books

QUEUED

127.0.0.1:6379> exec

1) OK

2) OK

3) (error) ERR value is not an integer or out of range # incr是对数字类型的进行自增,而books存的是字母

127.0.0.1:6379> get books # 只有incr books 执行失败了,其他都执行成功了。

"iamastring"

127.0.0.1:6379> get poorman

"iamdesperate"

watch监听

WATCH:在执行multi之前,先执行watch key1 [key2 …],可以监视一个或

者多个key,

若在事务的exec命令之前这些key对应的值被其他命令所改动了,那么

事务中所有命令都将被打断,

即事务所有操作将被取消执行。

unwatch:取消 WATCH 命令对所有 key 的监视。如果在执行 WATCH 命

令之后,

EXEC 命令或 DISCARD 命令先被执行了的话,那么就不

需要再执行UNWATCH 了。

注意:Redis 禁止在 multi 和 exec 之间执行 watch 指令,而必须在 multi

之前做好盯住关键变量,否则会出错。

案例一:监视 key,且事务成功执行

127.0.0.1:6379> set lock aa # 新增了一个key/value

OK

127.0.0.1:6379> keys * # 数据库目前就只有lock一个key

1) "lock"

127.0.0.1:6379> watch lock lock_times # 开始监视key为lock或者

lock_times的值。lock_times在数据库不存在也是可以监视的

OK

127.0.0.1:6379> multi # 开启事务

OK

127.0.0.1:6379> SET lock "huangz"

QUEUED

127.0.0.1:6379> INCR lock_times # INCR是对一个key值进行自增,假如

key值没有在数据库当中会进行创建并赋值为1

QUEUED

127.0.0.1:6379> EXEC # 开始执行事务

1) OK

2) (integer) 1

127.0.0.1:6379> get lock

"huangz"

127.0.0.1:6379> get lock_times

"1"

案例二:监视 key,且事务被打断,这里需要准备两个客户端进行测试

案例三:watch监听key后只对当前客户端第一个事务有效,并不影响其他命令执行

127.0.0.1:6379> watch lock

OK

127.0.0.1:6379> set lock 'cccc'

OK

127.0.0.1:6379> get lock

"cccc"

127.0.0.1:6379> multi

OK

127.0.0.1:6379> set lock bbb

QUEUED

127.0.0.1:6379> exec #exec 指令返回一个 null 回复时,事务执行是失败

(nil)

案例四:取消监听

127.0.0.1:6379> WATCH lock lock_times

OK

127.0.0.1:6379> UNWATCH

OK

2、持久化

1. RDB

RDB是Redis默认的持久化机制

RDB持久化文件,速度比较快,而且存储的是一个二进制的文件,传

输起来很方便。

RDB持久化时机:

save 900 1:在900内,有1个key改变了,就执行RDB持久化。

save 300 10:在300内,有10个key改变了,就执行RDB持久化。

save 60 10000:在60内,有10000个key改变了,就执行RDB持久化。

RDB无法保证数据的绝对安全。

2.AOF

AOF持久化机制默认是关闭的,Redis官方推荐同时开启RDB和AOF持

久化,更安全,避免数据丢失。

AOF持久化的速度,相对于RDB是较慢的,存储的是一个文本文件,

到了后期文件会比较大,传输困难。

AOF持久化时机。

appendfsync always:每执行一个写操作,立即持久化到AOF文件中,

性能比较低。

appendfsync ererysec:每一秒执行一次持久化。

appendfsyncno:会根据你的操作系统不同,

环境的不同,在一定时间内持久。

AOF 相对RDB更安全,推荐同时开启AOF和RDB

同时开启RDB和AOF的注意事项:

如果同时开启了AOF和RDB持久化,那么在Redis宕机重启之后,需要

加载一个持久化文件,

优先选择AOF文件。

如果先开启了RDB,再次开启AOF,如果RDB执行了持久化,那么

RDB文件中的内容会被AOF覆盖掉。

3.Redis的主从架构

4、哨兵

哨兵可以帮助我们解决主从结构中的单点故障问题

# 哨兵需要后台启动

daemonize yes

# 指定Master节点的ip和端口(主)

sentinel monitor master localhost 6379 2

# 指定Master节点的ip和端口(从)

sentinel monitor master master 6379 2

# 哨兵每隔多久监听一次redis架构

sentinel down-after-milliseconds mymaster 10000

5、Redis的集群

Redis集群在保证主从加哨兵的基本功能之外,还能够提升Redis存储

数据的能力。

Redis集群架构图

Redis集群是无中心的。

Redis集群有一个ping-pang机制

投票机制,Redis集群节点的数量必须是2n+1.

Redis集群中默认分配了16384个hash槽,在存储数据时,就会将key进

行crc16的算法,

并且对16384取余,根据最终的结果,将key-value存放到指定Redis节

点中,

而且每一个Redis集群都在维护着相应的hash槽。

为了保证数据的安全性,每一个集群的节点,至少要有一个从节点。

单独针对Redis集群中的某一个节点搭建主从。

当Redis集群中,超过半数的节点宕机之后,Redis集群就瘫痪了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第9章 继承和派生习题(详解)

一、选择题 1.下列表示引用的方法中, () 是正确的。已知:int m10: A.int &xm; B.int &y10; C.int &z; D.fl…

双指针——移动零

题目 示例 算法原理 我们使用两个指针,cur扫描数组,如果nums[cur]为非0,dest,然后让nums[cur]与nums[dest]交换,从而实区间[0,dest]为非0,[dest1,cur]为0,[cur,numsSize-1]为未扫描 题目链接:28…

1.1 理解大数据(2)

小肥柴的Hadoop之旅 1.1 理解大数据(2) 目录1.1 理解大数据1.1.3 大数据概述1.1.4 更多思考 参考文献和资料 目录 1.1 理解大数据 1.1.3 大数据概述 step_0 大数据定义 【《大数据算法设计分析》】: 通常来讲大数据(Big Data&am…

pyqt5用qtdesign设计页面时,去掉页面的空白界面、边框和标题栏

前言 Windows默认的标题栏有时候自己觉得不太美观,就想自己设计一个,然后把默认的去掉,并且把长方形的边框和多余的空表界面去掉,就是下图中圈出来的区域: 去掉之后的效果如图: 这样我们就可以自定义窗…

Spring Boot 3 集成 Jasypt详解

随着信息安全的日益受到重视,加密敏感数据在应用程序中变得越来越重要。Jasypt(Java Simplified Encryption)作为一个简化Java应用程序中数据加密的工具,为开发者提供了一种便捷而灵活的加密解决方案。本文将深入解析Jasypt的工作…

57.网游逆向分析与插件开发-游戏增加自动化助手接口-接管游戏的自动药水设定功能

内容来源于:易道云信息技术研究院VIP课 码云地址(master分支):https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号:51307d6bf69f2f3c645c70d09f841f5e32da79b9 代码下载地址,在 SRO_EX 目录下&…

MySQL 8.0 InnoDB Tablespaces之Undo Tablespaces(UNDO表空间)

文章目录 MySQL 8.0 InnoDB Tablespaces之Undo Tablespaces(UNDO表空间)Undo Tablespaces(UNDO表空间)默认UNDO表空间添加 Undo 表空间查看Undo 相关的信息查看Undo 相关参数变量查看Undo 状态信息通过information_schema.innodb_…

Java ArrayList在遍历时删除元素

文章目录 1. Arrays.asList()获取到的ArrayList只能遍历,不能增加或删除元素2. java.util.ArrayList.SubList有实现add()、remove()方法3. 遍历集合时对元素重新赋值、对元素中的属性赋值、删除元素、新增元素3.1 普通for循环3.2 增强for循环3.3 forEach循环3.4 str…

JavaScript编程进阶 – 迭代器

JavaScript编程进阶 – 迭代器 JavaScript Programming Advanced - Iterators By JacksonML 在JavaScript语言中,迭代器是对象(Object), 它事先定义好了一个序列,并在其终止时有可能地(潜在地)返回值。 本文简要介绍迭代器对象如…

初识HTTP协议

Web服务器可以接收浏览器的请求,并将服务器中的web项目资源响应给浏览器,浏览器与服务器之间进行网络通信遵循HTTP协议。 一、什么是HTTP协议 超文本传输协议(HTTP,HyperText Transfer Protocol)(浏览器---->web服务…

2024新版塔罗占卜网站源码风水起名附带搭建视频及文本教程

附带文本教学及视频教程安装方法以linux为例: 1、建议在服务器上面安装宝塔面板,以便操作,高逼格技术员可以忽略这步操作。 2、把安装包文件解压到根目录,同时建立数据库,把数据文件导入数据库 3、修改核心文件conf…

Linux下使用Wireshark抓包教程

在实际开发中,涉及网络传输的环节是非常多的。在这些过程中,我们经常有查看被传输的数据信息的需求,因此,抓包工具应运而生。Wireshark便是一款非常有名的抓包及分析软件,具有强大的协议解析能力。本文将介绍如何在Lin…

前端算法之二叉树

二叉树 二叉树用于解决什么问题 数据的组织与搜索:排序:表达式和计算:图形处理: 举例:二叉树的最近公共祖先 思路: 排序/排布方式 和 (排序中)当前树和节点的关系 举例2:…

二叉树的前序遍历 、二叉树的最大深度、平衡二叉树、二叉树遍历(leetcode)

目录 一、二叉树的前序遍历 方法一:全局变量记录节点个数 方法二:传址调用记录节点个数 二、二叉树的最大深度 三、平衡二叉树 四、二叉树遍历 一、二叉树的前序遍历 方法一:全局变量记录节点个数 计算树的节点数: 函数TreeSize用于递…

Zookeeper注册中心实战

Java学习手册面试指南:https://javaxiaobear.cn Spring Cloud Zookeeper通过自动配置和绑定到 Spring 环境和其他 Spring 编程模型习惯用法,为 Spring Boot 应用程序提供Apache Zookeeper集成。通过一些简单的注释,您可以快速启用和配置应用…

51单片机中TCON, IE, PCON等寄存器的剖析

在单片机中,如何快速通过名字记忆IQ寄存器中每一个控制位的作用呢? IE(interrupt enable)寄存器中,都是中断的使能位置。 其中的EA(enable all)是总使能位,ES(enable serial)是串口…

Head First Design Patterns - 装饰者模式

什么是装饰者模式 装饰者模式动态地将额外责任附加到对象上。对于拓展功能,装饰者提供子类化的弹性替代方案。 --《Head First Design Patterns》中的定义 为什么会有装饰者模式 根据上述定义,简单来说,装饰者模式就是对原有的类&#xff0c…

STM32与TB6612电机驱动器的基础入门教程

TB6612是一款常用的双路直流电机驱动芯片,适用于小型机器人以及其他需要控制电机方向和转速的应用。在STM32微控制器的配合下,可以实现对TB6612电机驱动器的控制,进而实现电机的控制。本文将带领读者一步步了解如何搭建基于STM32与TB6612的电…

华为云默认安全组配置规则说明

华为云服务器默认安全组可选Sys-default、Sys-WebServer或Sys-FullAccess。default是默认安全组规则,只开放了22和3389端口;Sys-WebServer适用于Web网站开发场景,开放了80和443端口;Sys-FullAccess开放了全部端口。阿腾云atengyun…

机器学习——主成分分析(PCA)

目录 背景 引入 特征维度约减 特征维度约减的概念 为何要维度约减? 维度约减的应用 常规维度约减方法 主成分分析 主成分分析 (PCA)基本思路 主成分的代数定义和代数推导 主成分的代数定义 主成分的代数推导 PCA算法两种实现方法 1、基于特征值分解协方差矩阵实…