013 redis事务特性和持久化机制

事务:简单理解为把一些列操作当做一个原子性操作,要么成功要么失败;

        事务存在四种特性ACID;事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)一致性(consistency)隔离性 (isolation)和持久性(durability)的缩写。

事务的原子性:表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。 
事务的一致性:表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。 
事务的隔离性:表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。 
事务的持久性:表示已提交的数据在事务执行失败时,数据的状态都应该正确。

非官方理解:(关系型数据库)

原子性:事务包含的所有操作,要么全部成功要么失败;

一致性:事务必须使数据的一个状态变为另一个状态,比如转账,A用户给B用户转账,转账前两个用户的钱加起来有5000,不管两个用户转账多少次,他们俩个加起来的钱也同样是5000;

隔离性:当多个用户并发访问,例如,下订单点餐,多个人同时点了相同的菜,数据库会为每一个用户开启一个事务,多个订单之间互不影响,更新库存是相对独立的事务,相互隔离;

持久化:一个事务一旦提交之后,那么数据库中的数据就是永久改变了,无法回退;

redis事务:(只支持简单事务)

MULTIEXECDISCARDWATCH命令是Redis事务功能的基础。Redis事务允许在一次单独的步骤中执行一组命令,并且可以保证如下两个重要事项:

Redis会将一个事务中的所有命令序列化,然后按顺序执行。Redis不可能在一个Redis事务的执行过程中插入执行另一个客户端发出的请求。这样便能保证Redis将这些命令作为一个单独的隔离操作执行

在一个Redis事务中,Redis要么执行其中的所有命令,要么什么都不执行。因此,Redis事务能够保证原子性。EXEC命令会触发执行事务中的所有命令

redis事务用法:

MULTI 用于标记事务块的开始

EXEC 在一个事务中执行所有先前放入队列的命令,然后恢复正常的连接状态

DISCARD 清除所有先前在一个事务中放入队列的命令,然后恢复正常的连接状态

WATCH 当某个事务需要按条件执行时,就要使用这个命令将给定的键设置为受监控的

UNWATCH 清除所有先前为一个事务监控的键

事务演示:

说明第一步操作redis没有执行,而是存入本地队列中;

一旦调用exec,那么队列中的所有操作都会执行,如果调用discard会放弃队列中所有操作;

注意:redis事务不支持回滚,一个队列中有任务执行失败,redis会继续执行队列中的其他任务,不做回滚;

redis持久化机制:

RDB 持久化 RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,也是默认的持久化方式

save 900 1 #900秒内如果超过1key被修改,则发起快照保存

save 300 10 #300秒内如超过10key被修改,则发起快照保存

save 60 10000

优:

1.RDB模式只有一个文件,对应备份策略非常方便,方便传输;

2.对应恢复而言也是非常方便,因为只有一个数据文件,包含所有数据内容;

3.性能最大化,RDB只有一个子进程,不影响其他IO操作;

4.相对AOF模式,如果数据量大,启动效率会更高;

劣:

1.如果要保障数据的高可用性,最大限度避免数据丢失,RDB不是明智的选择,其只在某个时间结点做快照,如果在快照前出现故障,时间间隔内的数据就丢失了;

2.RDB是fork一个子进程来协助完成持久化工作,当数据量过大,可能会导致整个服务器停止一定时间间隔(毫秒、秒单位);

AOF 持久化 aofredis的一种记录数据库写操作的持久化方案,他会忠实的记录所有的写操作,并且以redis协议的格式存储在一个.aof文件中,在重启redis的时候,redis可以根据.aof文件的内容来恢复数据集

appendfsync always //收到写命令就立即写入到磁盘,效率最慢,但是保证完全的持久化(生产环境不推荐使用)

appendfsync everysec //每秒钟写入磁盘一次,在性能和持久化方面做了很好的折中(生产环境如果需要开启AOF,推荐使用)

appendfsync no //完全依赖os 性能最好 持久化没保证

优:

1.相对RDB更高的数据安全性,appendfsync everysec模式每秒写入磁盘一次,对应数据丢失的概率更低一些;

2.AOF的持久化机制是对日志文件的写入操作,采用的是追加模式,因此在写入当中即便出现宕机,也不会影响已存在的内容;如果写入一半出现问题,可以在下一次启动后使用redis-check-aof命令来保障一致性(修复);

3.如果日志过大,redis可以自动启用重写的机制,会不断将修改内容写入老日志,同时创建新日志文件,记录此期间有哪些被修改的内容,切换时更换的保障数据安全;

4.AOF的日志文件,格式清晰,易于理解,并且可以通过日志文件进行重放;

劣:

1.对应相同数据量的数据集来说,AOF文件通常要大于RDB文件,因为AOF记录了全部的操作,RDB只记录数据库状态;

2.RDB回复大数据集时要快于AOF;

3.AOF的总体运行效率要比RDB慢;

注意:具体要根据系统实际特性去选择;

如果要保障数据的持久化可以牺牲一下性能那就选择AOF,相反数据不那么重要,要保障性能就可以选择RDB;

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值