zoukankan      html  css  js  c++  java
  • Redis笔记-事务、watch(乐观锁)

    介绍

    redis对事务的支持目前还比较简单。不保证事务的一致性,即使中间有一条命令出错了,其他命令仍然可以正常执行,并且无法回滚。
    和sql事务不同的是,Redis调用Exec只是将所有的命令变成一个单元一起执行,期间不会插入其他的命令。(隔离级别序列化)
    redis只能保证一个client发起的事务中的命令可以连续的执行。一般情况下redis在接受到一个client发来的命令后会立即处理并 返回处理结果,但是当一个client在一个连接中发出multi命令有,这个连接会进入一个事务上下文,该连接后续的命令并不是立即执行,而是先放到一 个队列中。当从此连接受到exec命令后,redis会顺序的执行队列中的所有命令。并将所有命令的运行结果打包到一起返回给client.然后此连接就 结束事务上下文。

    multi
    incr a
    incr b
    exec

    从这个例子我们可以看到incr a ,incr b命令发出后并没执行而是被放到了队列中。调用exec后俩个命令被连续的执行,最后返回的是两条命令执行后的结果
    可以调用discard命令来取消一个事务,discard命令其实就是清空事务的命令队列并退出事务上下文。

    discard

    Watch(乐观锁):

    前面说到通过multi命令只是保证一个事物中的所有命令可以在一起执行,显然只是实现这一点的话对于大部分的业务都是无法满足的。
    所以Redis提供了Watch命令来监控一个key以达到乐观锁的效果。
    下面展示一个乐观锁实例:

    watch money
    multi
    incr money 1
    decr money 2
    exec

    client执行exec命令时,如果Redis检测到name的值已经被其他客户端改过了,因此在事物中的所有命令都会回滚。
    watch命令是对整个连接有效的,用完之后可以用discard、unwatch、exec命令清除监视

  • 相关阅读:
    C#中的委托(转)
    面试总结
    int, Int32.Parse和Convert.ToInt32的不同之处(分享)
    数据结构与算法基础学习(一)
    SVN服务器搭建和使用(二)
    WCF学习笔记(第一天,1.WCF概述)
    在此计算机中仅有部分visual studio2010产品已升级到SP1,只有全部升级,产品才能正常运行解决办法
    FormsAuthentication使用指南
    Why do I get the error "The target GatherAllFilesToPublish does not exist"?
    非彼拉且数列的实现
  • 原文地址:https://www.cnblogs.com/fanfan-90/p/13236073.html
Copyright © 2011-2022 走看看