redis 事务
Posted 是的哟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis 事务相关的知识,希望对你有一定的参考价值。
事务执行时,不会中断去执行其他命令
不支持回滚,执行时某个命令出错,其他命令也会继续执行
multi
set "name" "zhangsan"
get "name"
set "age" 18
get "age"
exec
multi 将客户端从非事务状态切换到事务状态
非事务状态,客户端发送的命令会被服务器立即执行
事务状态,服务器会根据客户端不同的命令来执行不同的操作:
exec、discard、watch、multi会立即执行,
其他命令会入队,服务器为每个客户端维护一个队列
客户端发送exec命令时,服务器会遍历这个客户端的事务队列,执行里面的所有命令
发送discard时,会清空队列,并将客户端切换到非事务状态
watch是一个乐观锁,可以在执行exec前监视任意数量的key,
执行exec时如果有key被修改了,服务器将拒绝执行事务,并向客户端返回事务失败的空回复
watch "name" //客户端A监视name
multi //客户端A开启事务
set "name" "zhangsan" //客户端A修改name
set "name" "lisi" //客户端 B 修改name
exec //客户端A执行事务
有个watched_keys字典,字典键是被watch的key,
字典值是一个链表,保存着所有监视这个key的客户端
所有修改命令,如set等,执行后都会检查是否有客户端在监视刚刚被修改的key
若修改过,则打开该客户端的redis_dirty_cas标识。
exec执行事务前,服务器会检查redis_dirty_cas标识,来判断事务是否安全,不安全则不执行
redis事务的ACID
原子性 atomicity 要么都执行,要么都不执行 redis事务满足原子性
一致性 consistency 若数据库在执行事务前是一致的,那么执行事务后也是一致的
"一致"指的是数据符合数据库本身的定义和要求,没有非法或无效的错误数据
入队错误:命令不存在或格式不正确,redis会拒绝该事务
执行错误:例如对key执行了错误类型的操作,这种命令在执行时会被识别出来,并进行相应的错误
处理,不会对数据库做出任何修改,也不会影响一致性
服务器停机:没做持久化会恢复到空白状态,做了持久化会恢复到以前的某个一致性状态。
隔离性 isolation 多个事务并发执行,不会相互影响,和串行执行事务的效果一样
redis是单线程的,且服务器在执行事务期间不会中断事务,所以事务总是以串行方式执行的。
耐久性 durability 事务执行完,结果会被保存到永久介质里,即使停机结果也不会丢失
没做持久化时,不具备耐久性;RDB不会及时保存,也不具备耐久性;AOF且appendfsync选项为always时,具备耐久性,appendfsync为其他值时,不具备耐久性。
以上是关于redis 事务的主要内容,如果未能解决你的问题,请参考以下文章