Redis 作为一个非关系型内存数据库,也有事务定义
1. 事务的定义-ACID特性
A表示原子性:即事务是一个不可分割的实体,事务中的操作要么都完成,要么都不完成
C表示一致性:即事务前后数据完整性必须一致,假设数据库有很多完整性约束,比如id字段不能为空,则事务执行后,这些完整性约束不能被违反
I表示隔离性:即一个事务内部对其他事务操作是隔离的,并发执行的各事务间不能相互干扰
D表示持久性:即事务一旦提交完成,该事务对数据库的操作是永久性的,并不能在进行回滚了,哪怕数据库出现故障该修改操作也将一直保持
2. Redis 事务的相关命令
multi命令 开启事务
# 开启事务
multi
# OK
若干操作组成一个事务
set name zhangsan
# QUEUED
set age 22
# QUEUED
get name
# QUEUED
get age
# QUEUED
exec命令 提交事务
# 提交事务
exec
# OK
# OK
# zhangsan
# 22
discard命令 撤销事务并丢弃事务队列中的 redis 操作
->discard
watch命令 监视指定的键值对 从而让事务有条件的执行
# watch命令监视一个或多个key
# 若在exec提交事务之前,name被其他事务修改,则不执行该事务,否则执行
watch name
multi
get name
exec
3. Redis 持久化
将redis内存中的数据保存到磁盘上称之为 redis 持久化
1)AOF:Append Only File---保持事务持久性
在redis修改相关的命令执行后,将命令添加到aof_buf缓冲区,然后定时写入到硬盘的AOF文件中
# 修改配置文件
vi /etc/redis.conf
appendonly yes # 默认是no 不开启
appendfilename "appendonly.aof"
appendfsync everysec
# appendfsync 参数值
# always: 每条修改命令都更新到磁盘上的aof文件
# everysec: 每秒更新数据到磁盘上的aof文件
# no: 不自动更新,由操作系统决定何时更新
修改完配置文件,重启 redis 服务
sudo systemctl restart redis
2)RDB:Redis DataBase---不能确保事务持久性
RDB 持久化指的是在满足一定的触发条件时(在一个的时间间隔内执行修改命令达到一定的数量,或者手动执行 SAVE 和 BGSAVE 命令),对这个时间点的数据库所有键值对信息生成一个压缩文件 dump.rdb存入硬盘,然后将旧的删除,进行替换
默认触发条件
# 900秒内有一个以上的键被修改,就会生成快照文件
save 900 1
# 300秒内有十个及以上的键被修改,就会生成快照文件
save 300 10
# 60秒内有10000个及以上的键被修改,就会生成快照文件
save 60 10000
默认快照文件名
dbfilename dump.rdb
默认快照文件硬盘路径
dir /var/lib/redis