Redis事务
开启事务之后,进行命令入队,但是命令没有执行,只是等待,直到执行exec时才会执行
开启事务
multi
命令入队
执行事务
exec
discard 清空队列,放弃事务
Redis单条指令保证原子性,但是事务不保证原子性
执行时错误:
语法没有问题,但是不能对字符串执行➕1操作,只有这一句出错,其他语句正常执行。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> set k1 "v1"
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr k1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> exec
1) (error) ERR value is not an integer or out of range
2) OK
127.0.0.1:6379> get k2
"v2"
编译时错误:
事务中的语法错误,执行事务时提示错误,并且其他语句都不执行
乐观锁
通过watch
监视
监视数据
watch key
事务开启前监视变量,进入事务,提交操作,但是另一个线程改变变量,此时提交事务,返回nil
失败
Redis持久化
Redis是内存数据库,如果不将内存中的数据库状态保存到磁盘,服务器退出,数据库就会消失,因此持久化非常重要
RDB(Redis DataBase)
指定时间间隔中将内存中的数据快照写入磁盘,回复就是将快照文件读取到内存中。
默认使用RDB进行持久化,如果要进行大规模数据恢复,且对数据恢复的完整性是非常敏感的,那么RDB比AOF方式更加高效,RDB的缺点是最后一次持久化后的数据可能丢失。
RDB默认的文件名dump.rdb
,出发机制:
- save,自动触发
- 执行
flushall
- 退出redis
只需要将rdb文件放在redis启动目录就可以,redis启动的时候会自动检查dump.rdb
恢复其中的数据
127.0.0.1:6379> config get dir
1) "dir"
2) "/usr/local/bin"
AOF
AOF相当于将所有的创建和删除语句都存储下来,在重新导入时,重新执行一遍,比较浪费时间