redis乐观锁事务分布式锁的实现

Posted wdw123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis乐观锁事务分布式锁的实现相关的知识,希望对你有一定的参考价值。

配置,需要设置setEnableTransactionSupport,开启事务


  @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
            throws UnknownHostException {
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        template.setEnableTransactionSupport(true);//开启支持事务 multi exec
        return template;
    }

实现理念

  /**
     * redis 乐观锁 + 事务 的实现
     */
    @Test
    public void lockDemo1() {

        try {
            redisTemplate.watch("name");

            redisTemplate.multi();

            //进行事务代码
            // .....
            // .....
            // .....

            //最后提交事务
            List<Object> exec = redisTemplate.exec();

            if (exec.isEmpty()) {
                System.out.println("操作失败");
            }

        } catch (RuntimeException e) {

            //出现异常撤销
            redisTemplate.discard();

        } finally {
            redisTemplate.unwatch();
        }
    }

使用 setnx(set if not exist)实现分布式锁

setnx性质:如果不存在那么返回 0 ,不存在返回 1 。

 /**
     * redis 使用setnx命令实现分布式锁
     */
    @Test
    public void lockDemo() {

        Supplier<Boolean> getLock = () -> {
            Boolean b = redisTemplate.opsForValue().setIfAbsent("lock-name", "lock-val");
            return b != null && b;
        };

        try {

            //循环获取分布式锁
            while (!getLock.get()) ;

            //进行的业务代码
            synchronized (RedisTest.class) {
                //.....
            }

        } finally {
            //防止异常,释放锁
            redisTemplate.delete("lock-name");
        }

    }

以上是关于redis乐观锁事务分布式锁的实现的主要内容,如果未能解决你的问题,请参考以下文章

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

乐观锁的实现

使用Redis实现分布式锁

Redis分布式锁的原理是啥?如何续期?

基于redis的分布式锁的分析与实践

利用Redis实现分布式锁