1.事务机制
mysql事务的四大特性:原子性,一致性,隔离性,持久性
1.2事务介绍
Redis是支持事务的
含义 | 命令 |
---|---|
开启事务 | multi |
添加 | sadd |
执行事务 | exec |
取消事务 | discard |
获取正确指令数据 | get name |
获取数据 | get lesson |
监视某个key的值是否发生了变化 | watch key |
取消监视 | unwatch |
1.3事务处理机制
Redis对于命令执行错误的处理有两种方式:
1.语法错误(编译):所有命令都执行不成功
2.执行错误(运行):正确的命令执行成功,错误的命令执行失败
mysql的事务可以保证所有的命令同时成功或者同时失败,但redis会区分语法错误还是执行错误
1.3.1Redis事务的注意事项与局限性
1.无回滚机制
2.事务内的命令不支持条件判断
3.性能影响(尽量将事务中的命令数量控制在一个合理的范围)
4.ACID特性
特性 | 注意事项 |
---|---|
原子性 | Redis事务具有一定的原子性,但不支持回滚 |
一致性 | Redis事务不能完全保证一致性 |
隔离性 | Redis事务保证隔离性,因为是单线程所以执行事务时禁止其他客户端发送命令给Redis服务器 |
持久性 | Redis事务不保证持久性,持久化机制都是异步刷盘,存在数据丢失风险 |
2.持久化机制
2.1 场景分析
Redis将数据保存在内存中一但服务器宕机重启内存中数据就可能会丢失,为让Redis进行数据恢复,提供了持久化机制,将内存中数据保存到磁盘避免数据丢失
Redis提供了两种持久化机制:RDB、AOF,可以选择一种或者一起使用
2.2 RDB快照
RDB是Redis默认存储方式,给予快照思想。触发后会将内存数据进行快照保存在磁盘上,经过压缩的二进制文件,后缀名为.rdb
2.2.1 RDB触发条件
默认触发机制:
命令 | 含义 |
---|---|
save 3600 1 | 一小时内至少1个键被更改则进行快照 |
save 300 100 | 五分钟内至少100个键被更改则进行快照 |
save 60 10000 | 一分钟内至少10000个键被更改则进行快照 |
2.2.2 手动执行save和bgsave命令
在Redis客户端执行save或bgsave命令手动触发RDB快照
1.进入客户端:./redis-cli
2.执行save命令(同步执行): save
执行bgsave命令(异步子线程):bgsave
2.2.3 save和bgsave的区别:
SAVE 保存是阻塞主进程,客户端无法连接redis,等SAVE完成后,主进程才开始工作,客户端可以连接
BGSAVE 是fork一个save的子进程,在执行save过程中,不影响主进程,客户端可以正常链接redis,等子进程fork执行save完成后,通知主进程,子进程关闭。综上所述很明显BGSAVE方式比较适合线上的维护操作。
2.2.4Bgsave的优缺点
优点:基于二进制文件完成数据备份,占用空间少,便于文件传输
可自定义规则,根据Redis繁忙状态进行数据备份
缺点:无法保证数据完整性,会丢失最后一次快照后的所有数据
执行save阻塞Redis用户线程,影响系统吞吐率
2.3AOF
数据丢失持久化的另一种解决方式
AOF方式需要手动开启,修改redis.conf
AOF触发的三种方式:always,everysec,no
2.3.1触发配置
通过redis.conf进行配置
当前aof文件大小超过上一次aof文件大小的百分之多少时进行重写 auto-aof-rewrite-percentage 100 文件大小小于64mb的时候,不需要进行优化 auto-aof-rewrite-min-size 64mb
2.4RDB与AOF对比
RDB | AOF |
---|---|
默认开启 | 手动开启 |
性能高 | 性能低 |
安全性低 | 安全性高 |
优先级低 | 优先级高 |
存储某个是开的数据快照 | 存储写命令 |
配置触发状态会丢失最后一次快照以后更改的所有数据 | 默认使用everysec,每秒保存一次,最多丢失两秒以内的数据。 |
3.高可用主从复制
步骤:
1.配置一主两从创建三个配置文件:
vim redis6379.conf
在三个配置文件中输入内容
appendonly配置为no port 6379 设置端口为6379 pidfile /var/run/redis_6379.conf 写入pid的文件位置 dbfilename dump6379.rdb 设置redis数据库文件名字 可使用:%s/6379/6380将端口号全部修改
2.复制其他两个从机配置
cp redis6379.conf redis6380.conf cp redis6379.conf redis6381.conf
3.启动三台服务器
./redis-server redis6379.conf ./redis-server redis6380.conf ./redis-server redis6381.conf
查看redis启动进程
ps -ef|grep redis