zoukankan      html  css  js  c++  java
  • Redis中的事务及乐观锁的实现

     

    介绍

        Redis中的事务(transaction)是一组命令的集合。
        事务同命令一样都是Redis最小的执行单位,一个事务中的命令要么都执行,要么都不执行。
        Redis事务的实现需要用到 MULTI 和 EXEC 两个命令,事务开始的时候先向Redis服务器发送 MULTI 命令,然后依次发送需要在本次事务中处理的命令,最后再发送 EXEC 命令表示事务命令结束。

    事务中的命令

    Redis的事务中使用的4个命令:
        1.multi,开启Redis的事务,置客户端为事务态;
        2.exec,提交事务,执行从multi到此命令前的命令队列,置客户端为非事务态;
        3.discard,取消事务,置客户端为非事务态;
        4.watch,监视键值对,作用时如果事务提交exec时发现监视的监视对发生变化,事务将被取消;

    乐观锁

        乐观锁基于CAS思想,是不具有互斥性,不会产生锁等待而消耗资源,但是需要反复的重试,但也是因为重试的机制,能比较快的响应。

        redis中可以使用watch命令会监视给定的key,当exec时候如果监视的key从调用watch后发生过变化,则整个事务会失败。也可以调用watch多次监视多个key。这样就可以对指定的key加乐观锁了。注意watch的key是对整个连接有效的,事务也一样。如果连接断开,监视和事务都会被自动清除。当然了exec,discard,unwatch命令都会清除连接中的所有监视。

    redis-cli的操作

    redis中的操作:

    127.0.0.1:6379> set locktest 1
    OK
    127.0.0.1:6379> get locktest
    "1"
    127.0.0.1:6379> watch locktest
    OK
    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> set locktest 3
    QUEUED
    127.0.0.1:6379> exec
    1) OK
    127.0.0.1:6379> get locktest
    "3"
    127.0.0.1:6379>

    代码实现

    if("OK".equals(jedis.watch(key))){
        String oldData = jedis.get(key);
        Transaction tx = jedis.multi();
        tx.set(key, "new value");
        //transaction do some work
        //if throw some Exception
        //tx.discard();
        List<Object> results = tx.exec();
        if (results != null) {
            flag = true;
            System.out.println("获得乐观锁耗时" + ((System.currentTimeMillis() - start) / 1000.0) + "秒");
        } else {
            jedis.unwatch();
        }
    }

    Redis乐观锁实现(基于事务型Transaction && watch):

        https://www.jianshu.com/p/d777eb9f27df

        http://blog.csdn.net/evankaka/article/details/70570200

     
  • 相关阅读:
    BZOJ 1066 [SCOI2007]蜥蜴 (最大流)
    Codeforces 1092 D2 Great Vova Wall (Version 2) (栈)
    BZOJ 1046 [HAOI2007]上升序列(LIS + 贪心)
    牛客练习赛34 D little w and Exchange(归纳)
    BZOJ 1042 [HAOI2008]硬币购物(完全背包+容斥)
    GTMD并查集!
    2018icpc南京现场赛-G Pyramid(打标找规律+逆元)
    drwxr-xr-x 2 root root 4096 06-29 14:30 Test 分段解释
    Linux里面非常重要的目录
    点击 触发 事件 的 jQuery 写法样式
  • 原文地址:https://www.cnblogs.com/itommy/p/10644551.html
Copyright © 2011-2022 走看看