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

     
  • 相关阅读:
    A Simple Problem with Integers poj 3468 多树状数组解决区间修改问题。
    Fliptile 开关问题 poj 3279
    Face The Right Way 一道不错的尺取法和标记法题目。 poj 3276
    Aggressive cows 二分不仅仅是查找
    Cable master(二分题 注意精度)
    B. Pasha and String
    Intervals poj 1201 差分约束系统
    UITextField的快速基本使用代码块
    将UIImage转换成圆形图片image
    color转成image对象
  • 原文地址:https://www.cnblogs.com/itommy/p/10644551.html
Copyright © 2011-2022 走看看