概述
Redis高可用高性能缓存的应用系列的第二篇,主要介绍Redis事务机制和IO多路复用、和持久化的知识点。
Redis事务机制
Redis事务机制,和Mysql有大的不同,分为4步进行执行:
- 1.事务提交前,先检查命令语法是否正确
- 2.提交命令后,一定会被执行
- 3.有命令报错也会执行完
- 4.不能回滚
Redis事务和批量操作的区别:Redis在执行exec时,命令要么执行,要么都不执行,批量操作不会检查语法。
Redis事务命令说明:
- multi:告诉Redis开启一个事务(注意只是开启,而不是执行)
- exec: 告诉Redis开始执行事务
- discard:告诉Redis取消事务
- watch:监视某一个键值对,它的作用是在事务执行之前,如果监视的键值被修改,事务会被取消
当执行multi命令后,表明Redis开启一个事务,在执行后续的命令都属于在排队中,执行exec命令时,Redis事务的命令要么全部执行,要么全不执行。
redis-cli> set name "stark"
OK
redis-cli> multi
OK
redis-cli> set name "stark张宇"
QUEUED
redis-cli> set age 33
QUEUED
redis-cli> exec
1) OK
2) OK
如果因为执行的命令语法错误,整个Redis的事务会被服务驳回,全部不执行。
redis-cli> multi
OK
redis-cli> set name "stark张宇"
QUEUED
redis-cli> lpop "changchang" "quanquan" "xiaoshenyang"
QUEUED
redis-cli> exec
(error) wrong number of arguments (given 3, expected 1)
如果语法没有错误,在执行过程中数据有错误抛出,Redis也会全部执行,只要语法正确,命令都会被执行。
redis-cli> multi
OK
redis-cli> set name "stark张宇"
QUEUED
redis-cli> lpop name
QUEUED
redis-cli> exec
1) OK
2) WRONGTYPE Operation against a key holding the wrong kind of value
I/O多路复用
首先要说明一点,redis采用单线程处理请求, 假设服务器是4核的CPU,只会占用一个,其他3个都不进行参与,在线程处理上是并行的。
Redis 6.0版本后对这里进行了优化,使用了I/O thread概念,Redis 6.0的主进程只做计算,不在参与读写操作,I/O thread 处理上都是并行的关系,充分利用了多核CPU的优势,节省了处理时间,提升了处理请求的性能。
持久化
Redis的数据是保存在内存中的,所以当服务器重启时会造成数据丢失,Redis提供了数据持久化方案,把数据保存到磁盘上,使用文件恢复数据,主要有3种持久化方式:
- rdb : 生成某一时刻的快照,然后保存在二进制文件中
- aof :记录每一条命令,追加到文件中,打开可以看到具体的操作记录
- 混合模式:它是上面两种方式的结合
- 手动触发
- save ,会让Redis处于阻塞状态,直到rdb持久化完成,线上环境要谨慎使用
- bgsave ,它会fork出一个子进程,用来执行持久化,主进程继续响应客户端请求,它会有短暂的阻塞
2.自动触发
- 在m秒内,执行命令最终执行的是bgsave
bgsave的执行过程:1)首先,redis主进程fork出子进程,2)子进程会共享子进程的数据,并把主进程设置成read only,然后开始执行持久化的操作,当有新命令要修改数据时,Redis采用写实复制的方法来解决数据不一致的问题。
rdb持久化的优缺点:
优点:
- 容灾性好,方便备份
- 性能最大化,fork出一个子进程来操作,对主进程没有影响
- 数据比较多时,相对于aof启动效率比较高
缺点:
- 假如中间发生故障,故障期间会造成数据丢失
Aof同步策略
- appendfsync everysec 每秒同步一次,默认是每秒同步一次
- appendfsync always 每次操作后要同步一次
- appendfsync no 由操作系统进行调度
Aof的重写策略:因为在Redis操作的过程中有很多命令都是对同一个key进行操作,会造成大量的命令重复,造成Aof文件过大,而整理出的解决方案。
- 手动触发,执行bgrewriteaof命令
- 自动触发
auto-aof-rewrit-precentage
:当前Aof文件大小和最后一次重写后的大小之间的比率等于或者是等于指定的增长百分比,如100是代表当前Aof文件是上次重写的两倍时候才重写的。
auto-aof-rewrit-mini-size
:当Aof文件大小大于该值时候才可能重写。
优点:数据安全,不会造成数据的丢失
缺点:比rdb重启效率低,运行效率比rdb低