redis-3,redis事务和管道和发布订阅

发布时间 2023-04-11 16:53:17作者: niko5960

redis事务

保证数据的一致性,具有原子性的命令

set k1 v1
get k1

在一个队列里有一次性的,排他性的执行一系列操作

multi
cmd1
cmd2
exec

redis数据库事务

  1. redis的事务仅仅是保证事务的操作会被连续单独的执行,redis命令的执行是单线程架构,在执行完事务内所有的命令前是不会执行客户端的其他请求
  2. 没有隔离级别的概念,不存在事务内的查询能看到事务里的更新,事务外的查询看不到的现象
  3. redis不能保证原子性,不能保证同时成功或者同时失败。
  4. 排他性,在事务执行的过程中,其他命令不会插入

事务的使用

case1. 正常执行

multi
exec

multi
set k1 v1
set k2 v2
incr count
exec

case2. 放弃事务

multi
discard

multi
set k1 v11
set k2 v22
discard
放弃执行事务

case3. 全体连坐

一条命令出错全部退回

multi
set k1 v22
set k2 v22
set k3	这条出错

一条出错全部出错

case4. 冤头债主

multi
set k1 v111
set k2 v222
incr count
incr eamil	这个email是字符串,不能用incr,所以出错

最终运行结果,只有出错的没有执行,其他的都执行成功

case5. watch监控

悲观锁,每次拿数据都认为别人会修改,所以每次操作数据都加锁
watch是一种检查并设置值的行为
没有改变监控值的

watch sount
multi
set k1 v11
incr count
exec

改变监控值的

watch balence
multi
set k1 abc3
get k1
set balence 150		这个时候另一个修改了balence
exec
exec的时候返回nil

unwatch命令

unwatch放弃监控

redis管道

如何优化频繁命令往返造成的性能瓶颈
redis是一种基于客户端服务器模型,一级请求响应协议的tcp服务
redis发送命令分为四步
发送命令
命令排队
执行命令
返回结果
并监听socket返回,通常以阻塞的方式监听
往返时间简称rtt
多条命令分散的传入的时候,会使redis多次从用户态转换到内核态,每次转换的状态转换引起的上下文转变会造成巨大的开销,使用管道一次性的执行一些命令,会降低用户态和内核态状态的转换

省时原理

客户端一次性的发送多条命令,服务端一次性处理多条命令,一次性返回命令执行结果
降低往返延时时间,上下文切换时间

用法

新建一个txt脚本,使用redis管道命令执行脚本
不会阻塞,没有原子性,如果一个命令发生异常,会继续执行

cat cmd.txt
set k100 v100
set k200 v200
hset k300 age 20

执行脚本
cat cmd.txt | redis-cli -a 111111 --pipe

返回服务器的响应

发布和订阅

了解即可