济南企业网站搭建,项城做网站,网络营销推广品牌,网站运营管理主要内容★ 事务相关的命令
Redis事务保证事务内的多条命令会按顺序作为整体执行#xff0c;其他客户端发出的请求绝不可能被插入到事务处理的中间#xff0c;
这样可以保证事务内所有命令作为一个隔离操作被执行。
Redis事务同样具有原子性#xff0c;事务内所有命令要么全部被执…★ 事务相关的命令
Redis事务保证事务内的多条命令会按顺序作为整体执行其他客户端发出的请求绝不可能被插入到事务处理的中间
这样可以保证事务内所有命令作为一个隔离操作被执行。
Redis事务同样具有原子性事务内所有命令要么全部被执行要么全部被放弃。 比如事务执行过程中遇到数据库宕机Redis会自动回滚这些已经执行过的命令。
需要说明的是某条命令执行出现错误并不会影响事务提交。这句下面会演示
▲ 事务相关的常用命令如下
DISCARD 取消事务放弃执行事务块内的所有命令。
MULTI 开启事务
EXEC 执行事务
WATCH key [key …] 监视一个或多个key如果在事务exec之前这些key对应的值被其他命令改动事务会自动中断。
UNWATCH 取消WATCH命令对所有key的监视。
【注意】 WATCH命令 必须在事务开启之前执行。
演示Redis的事务
一个简单的事务演示 某条命令执行出现错误并不会影响事务提交 如图这个事务一共有3条命令操作其中有一条命令是错误的会执行失败但是不影响事务提交。 演示两个事务之间的操作
情景甲事务要修改Redis中 A key所对应数据甲事务在执行的过程中肯定会对A key所对应数据加锁
等待事务结束才会释放对A key的加锁。
因此在甲事务在对A key所对应数据的修改过程中其他进程肯定无法修改A key对应的value。但试想一下A key的value依赖于B key的value
甲事务对A key的value所修改必须以B key所对应的value为基础。
换而言之如果B key所对应的value已经被其他进程修改了
那么甲事务对A key的value所修改应该自动撤销。此时就可以在甲事务开始之前使用WATCH命令来监视B key
这样当B key所对应的value发生修改后甲事务自动撤销。【注意】WATCH命令必须在事务开始之前执行。
比如 watch keyB # 指定当keyB对应的value在其他命令修改之后
当前进程中事务所做的修改就会自动撤销。演示先演示 keyA 和 keyB 没啥关系的情况下的事务执行。
先添加两个 key-value对 然后开始事务 修改 keyA 的value值 然后这时候再开启一个redis。 可以看出修改keyB的事务对修改keyA的事务并没有什么影响。
但是如果 keyA 和 keyB 有关联的话我们要的效果应该是当 keyB 被修改过后那么修改keyA的操作将失败才合理。 现在演示 假设keyA是依赖keyB的所以只要keyB在其他线程发生修改那keyA这边的事务就会被撤销。 UNWATCH 取消WATCH命令对所有key的监视。
测试这个watch 的监视的作用时间在上一个事务执行完成后就失效了我重新开一个事务就没有再监视keyB了。
测试在事务的执行过程中能否去掉对key的监视。 结论对keyB的监视作用还在所以说明这个去掉监视的命令 不能在事务中执行
再测试一遍在事务开启前取消对key的监视 结论表明这个取消对key监视的命令需要在事务开启前执行
★ 发布订阅相关的命令
Redis内置支持发布/订阅的消息机制消息订阅者可以订阅一个或多个channel 每个channel也可被多个消息订阅者订阅。只要消息发布者向某个channel发布消息 该消息就会同时被该channel的多个消息订阅者收到。
发布/订阅相关的常用命令如下
SUBSCRIBE channel [channel …] 订阅一个或多个channel。 UNSUBSCRIBE [channel [channel …]] 取消订阅一个或多个channel如果不带参数表明取消订阅所有channel。 PSUBSCRIBE pattern [pattern …] 按模式匹配的方式订阅一个或多个channel。 PUNSUBSCRIBE [pattern [pattern …]] 按模式匹配的方式取消订阅一个或多个channel如果不带参数表明取消订阅所有channel。 PUBLISH channel message 向指定channel发布消息。 PUBSUB subcommand [argument [argument …]] 检查订阅/发布系统状态。
演示redis中的基本的订阅-发布的操作