Redis事务和持久化
Redis事务和持久化
1.Redis事务
Redis事务的主要作用就是串联多个命令防止别的命令插队。Redis事务的三大特性如下:
(1)单独的隔离操作。事务中的所有命令都会序列化,按顺序执行。事务在执行的过程中,不会被其他客户端发送来的命令请求打断。
(2)没有隔离级别的概念。队列中的命令没有提交之前都不会实际地被执行,因为在事务提交前,任何指令都不会被实际执行。
(3)不保证原子性。Redis同一个事务中如果又一条命令执行失败,其后的命令仍然会被执行,没有回滚。
Redis事务分为组队阶段和执行阶段,其中涉及到3个关键命令,分别是multi、exec、discard。
从输入multi命令开始,输入的命令都会依次进入命令队列中,但不会执行,知道输入exec命令后,Redis才会将之前的命令队列中的命令依次执行。组队的过程中可以通过discard命令来放弃组队。
如果组队中某个命令出现了报告错误,那么执行时,所有队列都会被取消。
如果执行阶段某个命令报出了错误,则只有报错的命令不会被执行,而其他的命令都会被执行,不会回滚。
2.Redis持久化
由于Redis的数据都存储在内存中,如果没有配置持久化,Redis重启后数据旧会全部丢失,这样就需要开启Redis的持久化功能,将数据保存到 磁盘上,当Redis重启后,可以从磁盘中 恢复数据。Redis提供RDB和AOF两中方式进行持久化。
2.1 RDB持久化
RDB会在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是Snapshot快照,它恢复时是将快照文件直接读到内存里。RDB持久化是Redis默认的持久化方式,默认的文件名称为dump.rdb,RDB文件的保存路径默认为Redis启动时命令行所在的目录下。
Redis进行持久化时,会单独创建一个子进程来进行持久化,Redis先将数据写入到一个临时文件中,待持久化过程都结束后,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,RDB持久化是比较好的选择。
RDB的优点如下:
(1)节省磁盘空间。 (2)恢复速度快。
RDB的缺点如下:
(1)备份数据庞大时比较消耗性能。 (2)有数据丢失的风险。
RDB默认的保存策略:
也可以通过save 或者bgsave命令 手动保存快照。
可以通过修改该配置文件来更改dump.rdb的存储路径,默认存储路径dump.rdb,如下图
2.2 AOF持久化
AOF是以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来,只许追加文件但不可以改写文件,Redis启动之初会读取该文件重新构建数据,换言之,Redis重启就会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。在Redis中,AOF默认不开启,需要在配置文件中手动开启。AOF文件的保存路径和RDB的路径一致。
AOF的优点:
(1)备份机制更稳健,丢失数据概率更低。
(2)可读的日志文本,通过操作AOF文件可以处理误操作。
AOF的缺点:
(1)比起RDB会占用更多的磁盘空间。
(2)恢复备份速度更慢。
(3)每次读写都同步,有一定的性能压力。
(4)可能存在个别Bug,造成数据恢复不全。
AOF的备份机制和性能虽然和RDB不同,但是备份和恢复的操作同RDB一样,都是拷贝备份文件,需要恢复时再拷贝到Redis工作目录下,启动系统即加载数据。
可以通过将配置文件中的appendonly no改为appendonly yes开启AOF。
同时开启RDB和AOF的情况下,系统默认取AOF的数据。
本文来自博客园,作者:爱吃糖的橘猫,转载请注明原文链接:https://www.cnblogs.com/sglblog/p/15229283.html