一、Redis事务介绍

Redis事务是一个单独的隔离操作 :事务中的所有命令都会序列化按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
Redis事务的主要作用就是串联多个命令防止别的命令插队。

二、Multi、Exec、discard命令

从输入Multi 命令开始,输入的命令都会依次进入命令队列中,但不会执行,直到输入Exec后, Redis会将之前的命令队列中的命令依次执行。组队的过程中可以通过discard来放弃组队。

discard取消组队如下图:

如果在multi组队过程中,发生提示错误,在执行exec提交时会发生错如下图:

如果在multi组队过程中,发生了非提示错误,并不会立马报错,而是在exec提交时才会报错,而且其他命令会正常执行。

三、事务冲突问题

当多个请求同时操作一个数据时会发生数据错误,为了防止这种错误,我们可以进行加锁操作。

1. 乐观锁

悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁表锁等,读锁写锁等,都是在做操作之前先上锁。这样的缺点是效率低

2. 悲观锁

乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。Redis就是利用这种check-and-set机制实现事务的。

3. watch key [key]

在执行multi之前,先执行watch key1 [key2],可以监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

4. unwatch

取消 WATCH 命令对所有 key 的监视。如果在执行 WATCH 命令之后,EXEC 命令或DISCARD 命令先被执行了的话,那么就不需要再执行UNWATCH 了。

四、Redis事务三大特性

1. 单独的隔离操作

 事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

2. 没有隔离级别的概念

 队列中的命令没有提交之前都不会实际被执行,因为事务提交前任何指令都不会被实际执行。

3. 不保证原子性

 事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。

五、持久化操作

Redis 提供了2个不同形式的持久化方式:RDB(Redis DataBase)、AOF(Append Of File)

1. RDB

 (1)什么是RDB

 在指定的时间间隔内将内存中的数据集快照写入磁盘, 也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。

 (2)RDB如何进行备份 

 Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到 一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。 整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能 如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失

 (3)RDB备份  

 先通过config get dir  查询rdb文件的目录

 将*.rdb的文件拷贝到别的地方

 rdb的恢复

  关闭Redis

  先把备份的文件拷贝到工作目录下 cp dump2.rdb dump.rdb

  启动Redis, 备份数据会直接加载

 (4)RDB的优势

 适合大规模的数据恢复

 对数据完整性和一致性要求不高更适合使用

 节省磁盘空间

 恢复速度快

 (5)RDB的缺点

 Fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑

 虽然Redis在fork时使用了写时拷贝技术,但是如果数据庞大时还是比较消耗性能。

 在备份周期在一定间隔时间做一次备份,所以如果Redis意外down掉的话,就会丢失最后一次快照后的所有修改。

2. AOF

 (1)什么是AOF  

 以日志的形式来记录每个写操作(增量保存),将Redis执行过的所有写指令记录下来(读操作不记录), 只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis 重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作

 (2)AOF的持久化过程

(1)客户端的请求写命令会被append追加到AOF缓冲区内;

(2)AOF缓冲区根据AOF持久化策略[always,everysec,no]将操作sync同步到磁盘的AOF文件中;

(3)AOF文件大小超过重写策略或手动重写时,会对AOF文件rewrite重写,压缩AOF文件容量;

(4)Redis服务重启时,会重新load加载AOF文件中的写操作达到数据恢复的目的;

 (3)AOF的优势

 备份机制更稳健,丢失数据概率更低。

 可读的日志文本,通过操作AOF稳健,可以处理误操作。

 (4)AOF的劣势

 比起RDB占用更多的磁盘空间。

 恢复备份速度要慢。

 每次读写都同步的话,有一定的性能压力。

 存在个别Bug,造成恢复不能。

3. AOF和RDB选择

 官方推荐两个都启用

 如果对数据不敏感,可以选单独用RDB。

 不建议单独用 AOF,因为可能会出现Bug。

 如果只是做纯内存缓存,可以都不用。

redis事务和锁机制、持久化操作RDB/AOF的更多相关文章

  1. 分布式缓存技术redis学习系列(三)——redis高级应用(主从、事务与锁、持久化)

    上文<详细讲解redis数据结构(内存模型)以及常用命令>介绍了redis的数据类型以及常用命令,本文我们来学习下redis的一些高级特性. 安全性设置 设置客户端操作秘密 redis安装 ...

  2. 分布式缓存技术redis学习(三)——redis高级应用(主从、事务与锁、持久化)

    上文<详细讲解redis数据结构(内存模型)以及常用命令>介绍了redis的数据类型以及常用命令,本文我们来学习下redis的一些高级特性.目录如下: 安全性设置 设置客户端操作秘密 客户 ...

  3. 分布式缓存技术redis系列(三)——redis高级应用(主从、事务与锁、持久化)

    上文<详细讲解redis数据结构(内存模型)以及常用命令>介绍了redis的数据类型以及常用命令,本文我们来学习下redis的一些高级特性. 安全性设置 设置客户端操作秘密 redis安装 ...

  4. redis系列之3----redis高级应用(主从、事务与锁、持久化)

    文章主目录 安全性设置 主从复制 事务与锁 持久化机制 发布以及订阅消息 上文<详细讲解redis数据结构(内存模型)以及常用命令>介绍了redis的数据类型以及常用命令,本文我们来学习下 ...

  5. Redis两种持久化方式(RDB&AOF)

    爬虫和转载请注明原文地址;博客园蜗牛:http://www.cnblogs.com/tdws/p/5754706.html Redis所需内存 超过可用内存怎么办 Redis修改数据多线程并发—Red ...

  6. redis 事务(悲观锁和乐观锁)

    MULTI 开启事务,后续的命令会被加入到同一个事务中 事务中的操作会发送给客服端,但是不会立即执行,而是将操作放到了该事务对应的一个队列中,服务端返回QUEQUD EXEC 执行EXEC后,事务中的 ...

  7. MySQL 事务与锁机制

    下表展示了本人安装的MariaDB(10.1.19,MySQL的分支)所支持的所有存储引擎概况,其中支持事务的有InnoDB.SEQUENCE,另外InnoDB还支持XA事务,MyISAM不支持事务. ...

  8. 详细分析Redis的持久化操作——RDB与AOF

    一.前言   由于疫情的原因,学校还没有开学,这也就让我有了很多的时间.趁着时间比较多,我终于可以开始学习那些之前一直想学的技术了.最近这几天开始学习Redis,买了本<Redis实战>, ...

  9. Redis持久化操作RDB和AOF 对比于HDFS的SecondaryNode

    写在前面的话 最近学习比较多流行的大数据框架和完成两个大数据项目后,又突然学起了Redis.之所以之前的框架不学习记录呢,是因为之前的学习都是为了完成参加服创比赛的项目所以时间较紧,现在基本架构和编码 ...

  10. Redis事务及锁应用

    Redis只支持简单的事务,不像mysql那样比较完整严格,对数据的完整性也维持的很好.redis的开启事务实际上只是将开启事务之后的一段命令用队列包裹起来了,当调用redis的执行命令(exec)全 ...

随机推荐

  1. K8s高可用集群部署(四)

    k8s官网高可用部署参考:https://kubernetes.io/docs/setup/independent/high-availability/                 目录 一 ,k ...

  2. CSS兄弟范围选择器

    我们想要选择一部分兄弟元素,根据需要试着写了一个  td:nth-child(4)~td:not(:nth-child(7)~td) {        display: none;  } 从第5个元素 ...

  3. ICPC2020上海B - Mine Sweeper II

    思维 [B-Mine Sweeper II_第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(上海)(重现赛)@hzy0227 (nowcoder.com)](https://codeforc ...

  4. Linux详解

    什么是操作系统?1.操作系统:(Operating System,OS)是计算机系统中的一个系统软件,它们管理和控制计算机系统中的硬件及软件资源,为用户提供一个功能强大.使用方便的和可扩展的工作环境. ...

  5. kibana7.6.2内网windows系统下编译打包部署

    1.在kibana根目录下执行命令: yarn build  --skip-os-packages 2.报错无法下载node:将node相关文件下载放到kibana/.node_binaries/10 ...

  6. 肖sir__ 代码题 ___华为od练习

    www.online1987.com 这个网站,有概率看到机考原题,后续内招,这个网站做到了原题

  7. 多个git账户ssh密钥配置

    假设两git网站:A.com和B.com,在这两个网站上使用的邮箱和用户名分别为a@mail, userA和b@mail, userB. 清除全局配置 git config --global --li ...

  8. springboot-mybatis集成pagehelper分页插件

    1.引入jar包(示例) implementation group: 'com.github.pagehelper', name: 'pagehelper-spring-boot-starter', ...

  9. 如何在 Linux 上扫描/检测新的 LUN 和 SCSI 磁盘

    当 Linux 系统连接到 SAN(存储区域网络)后,你需要重新扫描 iSCSI 服务以发现新的 LUN. 要做到这一点,你必须向存储团队提供 Linux 主机的 WWN 号和所需的 LUN 大小. ...

  10. 2N2218仿真估算静态工作点

    (在找到的2N2218技术手册中没有发现输入输出特性曲线,只能自己估算了) 共射极直流通路电路 #静态工作点表达式 #IBQ = (Vcc - UBEQ)/RB #ICQ = (Vcc - UCEQ) ...