首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Redissons 锁细谈

Redissons 锁细谈

原创
作者头像
派大星在吗
发布2021-12-15 15:36:54
发布2021-12-15 15:36:54
3450
举报
文章被收录于专栏:我的技术专刊我的技术专刊

1.添加pom和配置文件

代码语言:txt
复制
        <!--redisson-->
代码语言:txt
复制
        <dependency>
代码语言:txt
复制
            <groupId>org.redisson</groupId>
代码语言:txt
复制
            <artifactId>redisson</artifactId>
代码语言:txt
复制
            <version>3.11.6</version>
代码语言:txt
复制
        </dependency>
代码语言:txt
复制
@Configuration
代码语言:txt
复制
@EnableCaching
代码语言:txt
复制
public class RedisConfig extends CachingConfigurerSupport {
代码语言:txt
复制
    @Autowired
代码语言:txt
复制
    private AppConfig appConfig;
代码语言:txt
复制
    /**
代码语言:txt
复制
     * 配置redisTemplate实例
     * @return
     */
    @Bean
    RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
代码语言:txt
复制
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
代码语言:txt
复制
        redisTemplate.setConnectionFactory(redisConnectionFactory);
代码语言:txt
复制
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
代码语言:txt
复制
        // 设置值(value)的序列化采用Jackson2JsonRedisSerializer。
代码语言:txt
复制
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
代码语言:txt
复制
        // 设置键(key)的序列化采用StringRedisSerializer。
代码语言:txt
复制
        redisTemplate.setKeySerializer(new StringRedisSerializer());
代码语言:txt
复制
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
代码语言:txt
复制
        redisTemplate.afterPropertiesSet();
代码语言:txt
复制
        return redisTemplate;
代码语言:txt
复制
    }
代码语言:txt
复制
  /**
代码语言:txt
复制
     * 配置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.使用方法

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

lock和tryLock的区别:

lock:加锁,会阻塞线程

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

使用Redisson的好处

相较于setnx,都可以实现分布式锁,但是redisson更加强大

setnx设置的锁过期时间不合理,且任务执行时间较长的时候会导致锁被释放了,肯定是有问题的。

解决办法:开启一个守护线程,监控任务执行时间,如果时间过长则延长锁的过期时间,这个开发代价会很大。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用Redisson的好处
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档