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

  • 相关阅读:
    vue3学习笔记
    学习笔记-Python-爬虫5-Selenium + PhantomJS
    学习笔记-Python-爬虫4-数据提取-正则、XML、XPath、BeautifulSoup4
    学习笔记-Python-爬虫7-Scrapy、分布式爬虫
    学习笔记-Python-爬虫6-验证码
    学习笔记-Python-爬虫3-requests
    学习笔记-Python-爬虫2-SSL、js加密、ajax
    学习笔记-Python-爬虫1-urllib、chardet
    Java多线程同步问题
    jQuery限制文本框只能输入正整数
  • 原文地址:https://www.cnblogs.com/pjfmeng/p/7909444.html
Copyright © 2011-2022 走看看