zoukankan      html  css  js  c++  java
  • Redis自学笔记:4.1进阶-事务

    第4章:进阶

    4.1事务

    4.1.1概述

    redis中的事务是一组命令的集合
    事务同命令一样都是redis的最小执行单位,一个事务中的命令要么都执行,
    要么都不执行

    事务的原理是先将一个事务的命令发送给redis,然后再让redis依次执行
    这些命令,例如:

    127.0.0.1:6379> multi 
    OK
    127.0.0.1:6379> sadd 'user:1:following' 2
    QUEUED
    127.0.0.1:6379> sadd 'user:2:following' 1
    QUEUED
    127.0.0.1:6379> exec
    1
    1
    

    事务的使用方式:

    1. 首先使用 multi 命令,声明下面的命令属于同一个事务
    2. 发送操作命令.redis不会执行命令,而是把它们暂存起来.
      返回值 queued 表示这两条命令已进入等待执行事务的队列.
    3. 最后使用 exec 命令结束暂存命令,同时redis将事务队列中的
      所有命令按照发送顺序依次执行. exec 返回值是暂存命令执
      行的返回值组成的列表,返回顺序和命令顺序相同.

    redis保证一个事务中的所有命令要么都执行,要么都不执行.如果在发
    送exec命令前客户端断线,redis会清空事务队列.一旦发送了redis命令,
    所有命令就会被执行,即使客户端断线也没有关系.

    redis的事务还能保证一个事务内的命令依次执行而不被其他命令插入.
    4.1.2错误处理

    导致事务执行出错的原因:

    1. 语法错误.
      命令不存在或者命令参数的个数不对.
      127.0.0.1:6379> multi
      OK
      127.0.0.1:6379> set foo 1
      QUEUED
      127.0.0.1:6379> set foo
      ERR wrong number of arguments for 'set' command
      127.0.0.1:6379> errorcommand foo
      ERR unknown command 'errorcommand'
      127.0.0.1:6379> exec
      EXECABORT Transaction discarded because of previous errors.
      127.0.0.1:6379> keys *
      
      • 事务中的命令都没有执行
    2. 运行错误
      命令执行时出现的错误.比如使用散列类型的命令操作集合类型的键,这
      种错误在实际执行之前redis是无法发现的.如果事务里一条命令出现了
      运行错误,事务里其他的命令依然会执行(包括出错命令之后的命令).
      127.0.0.1:6379> multi
      OK
      127.0.0.1:6379> set foo 1
      QUEUED
      127.0.0.1:6379> sadd foo 2
      QUEUED
      127.0.0.1:6379> set foo 3
      QUEUED
      127.0.0.1:6379> exec
      OK
      WRONGTYPE Operation against a key holding the wrong kind of value
      OK
      127.0.0.1:6379> keys *
      foo
      127.0.0.1:6379> get foo
      3
      

    redis的事务没有关系数据库提供的回滚(rollback)功能.也使得redis在事务
    上可以保持简洁和快速.

    4.1.3 watch命令介绍

    watch命令可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的
    事务就不会执行。监控一直持续到exec命令(事务中的命令是在exec之后才执行
    的,所以在multi命令后可以修改watch监控的键值)

    127.0.0.1:6379> set qux 1
    OK
    127.0.0.1:6379> watch qux
    OK
    127.0.0.1:6379> set qux 2
    OK
    127.0.0.1:6379> get qux
    2
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> set qux 3
    QUEUED
    127.0.0.1:6379> exec
    
    127.0.0.1:6379> get qux
    2
    127.0.0.1:6379> set thud 1
    OK
    127.0.0.1:6379> watch thud
    OK
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> set thud 2
    QUEUED
    127.0.0.1:6379> exec
    OK
    127.0.0.1:6379> get thud
    2
    

    由于watch命令的作用只是当被监控的键值被修改后阻止之后一个事务的执行,而
    不能保证其他客户端不修改这一键值,所以在一般的情况下我们需要在exec执行失
    败后重新执行整个函数。

    执行exec命令后会取消对所有键的监控,如果不想执行事务中的命令也可以使用
    unwatch命令来取消监控。

  • 相关阅读:
    2008北京奥运男子100M决赛黑人的竞技场
    Bit,Bytes,KB,MB,GB,TB,PB,EB,ZB,YB
    请教:TableLayoutPanel.Controls.Add中的下一个可行的单元位置(.net2.0,C#)
    ORACLE获取表所占用空间大小计算和展示
    C#中创建对象的方式
    一个怕360的病毒
    ubuntu以root权限登录
    安装ubootmkimage
    安装配置armlinuxgcc
    移动虚拟机注意问题
  • 原文地址:https://www.cnblogs.com/wangbaby/p/10207032.html
Copyright © 2011-2022 走看看