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的监控。

  • 相关阅读:
    linux ——process
    linux ipc—msgqueue
    JDEclipse源码查看
    用 AXIOM 促进 XML 处理
    使jets3t支持https
    正版太贵了……
    Axis2学习笔记 (Axiom 篇 )
    基于Hadoop的海量文本处理系统介绍
    详解ASP.NET MVC的请求生命周期
    .Net相关的资源连接
  • 原文地址:https://www.cnblogs.com/pjfmeng/p/7909444.html
Copyright © 2011-2022 走看看