美文网首页
Redis乐观锁

Redis乐观锁

作者: 小狼在IT | 来源:发表于2018-12-13 15:34 被阅读0次

原则上,乐观锁可以用数据库去做,这里我用了Redis做乐观锁。
如果不懂什么是乐观锁,可以百度下,很多高手写得很详尽。

public static void main(String[] args) {
    RedissonClient redisson = null;
    try{
        Config config = new Config();
        config.useSingleServer().setAddress("127.0.0.1:6379");
        redisson = Redisson.create(config);
        RAtomicLong rAtomicLong = redisson.getAtomicLong("optiLock");
        rAtomicLong.set(1);

        Thread t = new Thread(()->{
            try{
                RedissonClient redisson1 = Redisson.create(config);
                RAtomicLong rAtomicLong1 = redisson1.getAtomicLong("optiLock");
                Long nowVersion = rAtomicLong1.get() ;
                System.out.println("Thead1得到版本号"+nowVersion);
                //得到乐观锁的值,操作其它功能。。。
                Thread.sleep(10000);

                RLock rLock = redisson1.getLock("myLock");
                //操作乐观锁值,需要加个锁,避免并发冲突
                System.out.println("Thead1操作完成,去查看乐观锁值");
                rLock.lock();
                rAtomicLong1 = redisson1.getAtomicLong("optiLock");
                Long nowVersion2 = rAtomicLong1.get() ;
                if(nowVersion.equals(nowVersion2)){
                    rAtomicLong1.set(nowVersion2+1);
                    System.out.println("Thead1修改了版本号"+nowVersion2);
                }else {
                    System.out.println("版本号失败,操作回滚,新版本号:"+nowVersion2);
                }

                rLock.unlock();
                //可以提交操作了
                System.out.println("Thead1结束");

                redisson1.shutdown();
            }
            catch (Exception ex){}

        });
        t.start();

        Thread t2 = new Thread(()->{
            RedissonClient redisson1 = Redisson.create(config);

            RAtomicLong rAtomicLong1 = redisson1.getAtomicLong("optiLock");
            Long nowVersion = rAtomicLong1.get();
            System.out.println("Thead2得到版本号"+nowVersion);
            //得到乐观锁的值,操作其它功能。。。

            RLock rLock = redisson1.getLock("myLock");
            //操作乐观锁值,需要加个锁,避免并发冲突
            System.out.println("Thead2操作完成,去查看乐观锁值");
            rLock.lock();
            rAtomicLong1 = redisson1.getAtomicLong("optiLock");
            Long nowVersion2 = rAtomicLong1.get() ;
            if(nowVersion.equals(nowVersion2)){
                rAtomicLong1.set(nowVersion2+1);
                System.out.println("Thead2修改了版本号"+nowVersion2);
            }else {
                System.out.println("版本号失败,操作回滚,新版本号:"+nowVersion2);
            }

            rLock.unlock();
            //可以提交操作了
            System.out.println("Thead2结束");

            redisson1.shutdown();
        });
        t2.start();
    }
    catch (Exception ex){
        System.out.println(ex.getMessage());
    }
    finally {
        redisson.shutdown();
    }

}

运行结果:


image.png

运行时,Thread1和Thead2同时得到了乐观锁的版本号1,而Thread1的运行时间比较久的关系,Thread2已经运行完毕,并且修改了版本号为2 。等到Thread1运行完,发现版本号已经被修改了,与自己原先取得的版本号不同,于是只能回滚操作。
注意在操作完后,查看当前版本号前必须加锁(悲观锁),否则可能会出现冲突。
这种方式适合于冲突不多的场景,如果冲突很多,数据争用激烈,会导致不断地尝试,反而降低了性能。

相关文章

  • 秒杀随笔

    方法: mysql悲观锁 mysql乐观锁 PHP+redis分布式锁 PHP+redis乐观锁(redis wa...

  • Redis实现CAS的乐观锁

    Redis实现CAS的乐观锁

  • Redis乐观锁

    原则上,乐观锁可以用数据库去做,这里我用了Redis做乐观锁。如果不懂什么是乐观锁,可以百度下,很多高手写得很详尽...

  • 知识点整理

    redis redis为什么高效,及应用场景 锁 死锁产生条件,及避免死锁 悲观锁与乐观锁 数据库 事务 事务特性...

  • redis Redis事务&乐观锁

    起因:随着项目的进一步推广,数据量的增大,直接访问mysql数据库获取数据所使用的时间越来越长,为解决当前主要矛盾...

  • Redis事务(乐观锁)

    一、什么是事务事务是指一系列操作步骤,这一系列的操作步骤,要么完全地执行,要么完全地不执行。 比如微博中:A用户关...

  • redis事务,乐观锁

    一.Redis事务介绍 Redis单条命令是保证原子性的(要么一起成功,要么一起失败),但是事务不保证原子性 Re...

  • Redis 乐观锁实现

    应用场景 高并发,秒杀场景 步骤 set key = 0 watch key 开启事务 multi set key...

  • Redis 分布式锁

    Redis 分布式锁 前言 分布式锁一般有三种实现方式:1. 数据库乐观锁;2. 基于Redis的分布式锁;3. ...

  • Redis分布式锁----乐观锁的实现,以秒杀系统为例

    本文使用redis来实现乐观锁,并以秒杀系统为实例来讲解整个过程。 乐观锁 大多数是基于数据版本(ver...

网友评论

      本文标题:Redis乐观锁

      本文链接:https://www.haomeiwen.com/subject/gfhbhqtx.html