Redissons实现分布式锁

时间:2021-7-3 作者:qvyue

1.添加pom和配置文件

        
        org.redissonredisson3.11.6
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {

    @Autowired
    private AppConfig appConfig;

    /**
     * 配置redisTemplate实例
     * @return
     */
    @Bean
    RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {

        RedisTemplate 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已经很好的锁过期时间的问题,内部使用了设计模式之观察者模式,监控任务执行时间和锁过期时间,如果锁快到时间了任务还没执行完,就会帮我们增加锁过期时间,是个很强大的框架。

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。