标签:get 事务 lan unknown queue str 允许 需要 lock
RDB(Redis DataBase)策略 , redis默认策略
AOF(Append Only File)策略
小结: 根据需求选择开启持久化策略,一般开启RDB就够了
Redis的事务:允许把一组redis命令放在一起,把命令序列化,然后一起执行,保证部分原子性
multi :用来标记一个事务的开始
exec :用来执行事务队列中所有的命令
127.0.0.1:6379> multi # 开启事务
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> exec # 执行事务队列
1) OK
2) OK
127.0.0.1:6379> mget k1 k2 # 查看是否成功设置键值对
1) "v1"
2) "v2"
redis事务只能保证部分原子性
1.如果一组命令中,有压入事务队列过程中发生错误的命令,则本事务中所有命令都不执行,能保证事务的原子性
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k3 v3
QUEUED
127.0.0.1:6379(TX)> this is error # 这是故意加的一条错误命令
(error) ERR unknown command `this`, with args beginning with: `is`, `error`,
127.0.0.1:6379(TX)> set k4 v4
QUEUED
127.0.0.1:6379(TX)> exec # 执行事务队列失败,因为其中有一条错误命令
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> mget k3 k4
1) (nil)
2) (nil)
2.如果一组命令中,在压入队列过程中正常,但是在执行事务队列命令时发生了错误,则只会影响发生错误的指令,不会影响其他命令的执行,所以不能保证事务的原子性
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k3 v3
QUEUED
127.0.0.1:6379(TX)> incr k1 # 语法上incr k1并没有错,但是执行时发现k1的值并不是数字,所以不能自增
QUEUED
127.0.0.1:6379(TX)> set k4 v4
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) (integer) 1
3) OK
127.0.0.1:6379> mget k3 k4
1) "v3"
2) "v4"
discard :清除所有已经压入队列中的命令,并且结束整个事务
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k5 v5
QUEUED
127.0.0.1:6379(TX)> set k6 v6
QUEUED
127.0.0.1:6379(TX)> discard # 清除队列命令,结束事务
OK
127.0.0.1:6379> exec
(error) ERR EXEC without MULTI
127.0.0.1:6379> mget k5 k6
1) (nil)
2) (nil)
Redis事务小结:
1、单独的隔离操作:事务中的所有命令都会序列化、顺序地执行。事务在执行过程中,不会被其它客户端发来的命令请求所打断,除非使用watch命令监控某些键。
2、不保证事务的原子性: redis 同一个事务中如果一条命令执行失败,其后的命令仍然可能会被执行,redis 的事务没有回滚。Redis 已经在系统内部进行功能简化,这样可以确保更快的运行速度,因为Redis不需要事务回滚的能力
标签:get 事务 lan unknown queue str 允许 需要 lock
原文地址:https://www.cnblogs.com/jiehao-yu/p/14771250.html