美文网首页
Redissons实现分布式锁

Redissons实现分布式锁

作者: 小方块886 | 来源:发表于2021-02-27 23:37 被阅读0次

1.添加pom和配置文件

        <!--redisson-->
        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson</artifactId>
            <version>3.11.6</version>
        </dependency>
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {

    @Autowired
    private AppConfig appConfig;

    /**
     * 配置redisTemplate实例
     * @return
     */
    @Bean
    RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {

        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        // 设置值(value)的序列化采用Jackson2JsonRedisSerializer。
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        // 设置键(key)的序列化采用StringRedisSerializer。
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());

        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

  /**
     * 配置RdeissonClint实例
     * @return
     */
    @Bean
    public RedissonClient redissonClient(){
        Config config = new Config();
        config.useSingleServer().setAddress("redis://" + "127.0.0.1" + ":" + "6379");
        if (StringUtils.isNotBlank(appConfig.getPassword())){
            config.useSingleServer().setPassword(appConfig.getPassword());
        }
        return Redisson.create(config);
    }

2.使用方法

    @Autowired
    private RedissonClient redissonClient;

    @GetMapping("seckill")
    public Integer test() throws InterruptedException {
        // 获取锁对象
        RLock lock = redissonClient.getLock("lock");
        try {
            // 参数一:尝试加锁等待时间
            // 参数二:锁key生存时间
            // 参数三:时间单位
            if (lock.tryLock(0,10, TimeUnit.SECONDS)) {
                //  加锁成功,Do something
            }else {
                // 加锁失败
            }
        }catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            // 释放锁
            lock.unlock();
        }
        return null;
    }

lock和tryLock的区别:
lock:加锁,会阻塞线程
tryLock:尝试加锁,不会阻塞线程,返回值是boolean值,建议使用

使用Redisson的好处

相较于setnx,都可以实现分布式锁,但是redisson更加强大
setnx设置的锁过期时间不合理,且任务执行时间较长的时候会导致锁被释放了,肯定是有问题的。
解决办法:开启一个守护线程,监控任务执行时间,如果时间过长则延长锁的过期时间,这个开发代价会很大。
redisson已经很好的锁过期时间的问题,内部使用了设计模式之观察者模式,监控任务执行时间和锁过期时间,如果锁快到时间了任务还没执行完,就会帮我们增加锁过期时间,是个很强大的框架。

相关文章

  • Redissons实现分布式锁

    1.添加pom和配置文件 2.使用方法 lock和tryLock的区别:lock:加锁,会阻塞线程tryLock:...

  • 大佬浅谈分布式锁

    redis 实现 redis 分布锁一、redis 实现分布式锁(可重入锁)redission 实现分布式锁1、对...

  • 分布式锁实现

    基于数据库实现分布式锁基于缓存(redis,memcached)实现分布式锁基于Zookeeper实现分布式锁 s...

  • 基于redis的分布式锁

    分布式锁实现方案 基于数据库实现分布式锁 基于缓存(redis,memcached,tair)实现分布式锁 基于Z...

  • Zookeeper实现分布式锁(一)While版

    前面文章讲解了用Redis实现分布式锁的方式: 分布式锁之Redis实现(acquire)分布式锁之Redis实现...

  • 基于redis实现的分布式锁

    本文要点 基于redis实现分布式锁demo 基于redis实现分布式锁原理 基于redis实现分布式锁优缺点 正...

  • Redis 如何实现分布式锁?ZooKeeper 如何实现分布式

    Redis 如何实现分布式锁?ZooKeeper 如何实现分布式锁?比较二者优劣? 分布式锁的三种实现: 基于数据...

  • 分布式 | 分布式锁的实现

    分布式锁的实现 在常见的分布式锁中有以下三种实现: Redis 实现 Zookeeper 实现 数据库实现 分布式...

  • Redis分布式锁实现方案

    1 Redis分布式锁的特性 在实现分布式锁时,需要保证锁实现的安全性和可靠性。基于这点特点,实现分布式锁需要具备...

  • 分布式锁

    为什么要用分布式锁 数据库乐观锁redis分布式锁zookeeper分布式锁 使用分布式锁的场景 实现分布式锁的方...

网友评论

      本文标题:Redissons实现分布式锁

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