zoukankan      html  css  js  c++  java
  • redis学习(五)事务

    事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

    1、事务基本命令:

    multi:标记一个事务块的开始

    exec:执行所有事务块内的命令

    discard:取消事务,放弃执行事务块内的所有命令

    watch:监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

    unwatch:取消 WATCH 命令对所有 key 的监视。

    redis 127.0.0.1:6379> multi
    OK
    redis 127.0.0.1:6379> set k1 v1
    QUEUED
    redis 127.0.0.1:6379> set k2 v2
    QUEUED
    redis 127.0.0.1:6379> get k1
    QUEUED
    redis 127.0.0.1:6379> set k1 v11
    QUEUED
    redis 127.0.0.1:6379> get k1
    QUEUED
    redis 127.0.0.1:6379> EXEC
    1) OK
    2) OK
    3) "v1"
    4) OK
    5) "v11"
    redis 127.0.0.1:6379>

    2、错误的处理

    之所以说部分支持事务,是因为redis对事务中语法错误和运行中错误的处理不同。

    语法时错误:对事务中的所有命令都不执行

    redis 127.0.0.1:6379> multi
    OK
    redis 127.0.0.1:6379> set k1 v1
    QUEUED
    redis 127.0.0.1:6379> sd dfsdwwe
    (error) ERR unknown command 'sd'
    redis 127.0.0.1:6379> EXEC
    (error) EXECABORT Transaction discarded because of previous errors.
    redis 127.0.0.1:6379>

    运行时错误:会忽略错误的命令,其他命令会继续执行

    redis 127.0.0.1:6379> multi
    OK
    redis 127.0.0.1:6379> SADD num 1 2 3
    QUEUED
    redis 127.0.0.1:6379> set k1 v1
    QUEUED
    redis 127.0.0.1:6379> get num
    QUEUED
    redis 127.0.0.1:6379> get k1
    QUEUED
    redis 127.0.0.1:6379> EXEC
    1) (integer) 3
    2) OK
    3) (error) ERR Operation against a key holding the wrong kind of value
    4) "v1"
    redis 127.0.0.1:6379>

    3、乐观锁

    乐观锁意思就是乐观的认为不同的客户端,大部分情况下,客户端会访问不同的健,不太可能会冲突。只有在冲突的情况下,Redis使用WATCH命令实现事务的“检查再设置”(CAS)行为。

    作为WATCH命令的参数的键会受到Redis的监控,Redis能够检测到它们的变化。在执行EXEC命令之前,如果Redis检测到至少有一个键被修改了,那么整个事务便会中止运行,然后EXEC命令会返回一个Null值,提醒用户事务运行失败。

    如:使用watch对健k1进行监控,设置k1的值为v1,然后进入事务,事务中设置k1的值为v2,然后执行EXEC运行事务,最后使用get查看k1的值,可以看到k1的值没有改变,说明事务中的命令根本没有执行(因为WATCH监控mykey的过程中,k1被修改了,所以随后的事务便会被取消)

    redis 127.0.0.1:6379> WATCH k1
    OK
    redis 127.0.0.1:6379> set k1 v1
    OK
    redis 127.0.0.1:6379> MULTI
    OK
    redis 127.0.0.1:6379> get k1
    QUEUED
    redis 127.0.0.1:6379> SET k1 v2
    QUEUED
    redis 127.0.0.1:6379> get k1
    QUEUED
    redis 127.0.0.1:6379> EXEC
    (nil)
    redis 127.0.0.1:6379> get k1
    "v1"
    redis 127.0.0.1:6379>

    可以使用unwatch k1,来取消对k1的监控。

  • 相关阅读:
    一个前端的博客
    win10安装redis
    RabbitMQ的基本使用
    SpringMVC 中 @ControllerAdvice 注解的三种使用场景
    在Spring cloud中使用Spring Cloud Alibaba Nacos Discovery报错
    MSBUILD : error MSB3428: 未能加载 Visual C++ 组件“VCBuild.exe”。
    asp.net自定义错误信息处理
    MVC返回值详解
    C#集合
    C#linq查询方法使用简介
  • 原文地址:https://www.cnblogs.com/pjfmeng/p/7909444.html
Copyright © 2011-2022 走看看