Redisson

目录

Redisson

Redisson入门

Redisson可重入锁原理(解决不可重入)

Lua实现获取锁​编辑

Lua脚本实现释放锁​编辑

Redisson的深入理解(解决不可重试和超时释放)

总结

解决主从一致性问题

总结​


前文链接:

主要是要学习redis分布锁的原理,其实redis有专门用来处理这些问题的工具

(1条消息) Redis——实现优惠券秒杀_486过于烦躁的博客-优快云博客

(1条消息) 基于Redis的分布式锁实现(秒杀优惠券的优化)_486过于烦躁的博客-优快云博客

Redisson可以解决以下四个问题 

Redisson

之所以引用Redisson是因为前文我们自己实现的锁不满足可重入性(什么是 “可重入”:可重入就是说某个线程已经获得某个锁,可以再次获取锁而不会出现死锁)


Redisson入门

 

实现

    @Resource
    private RedissonClient redissonClient;


     @Transactional
    public Result createVoucherOrder(Long voucherId) {
        //获取用户Id
        UserDTO user = UserHolder.getUser();
        Long userId = user.getId();

        //创建锁对象
        RLock redisLock = redissonClient.getLock("lock:order:" + userId);

        //尝试获取锁
        boolean isLock = redisLock.tryLock();
        //判断
        if(!isLock){
            //获取锁失败,直接返回失败或者重试
            return Result.fail("不允许重复下单");
        }

        try {
            //一人一单
            Integer count = query().eq("user_id", userId).eq("voucher_id", voucherId).count();
            if(count>0){
                //说明用户之前买过了
                return Result.fail("用户已经购买过一次");
            }

            VoucherOrder voucherOrder = new VoucherOrder();

            //扣减库存
            seckillVoucherService.update()
                    .setSql("stock = stock - 1")
                    .eq("voucher_id",voucherId).gt("stock",0)
                    .update();

            //设置订单Id
            long orderId = redisIdWorker.nextId("order");
            voucherOrder.setId(orderId);
            //设置优惠券Id
            voucherOrder.setVoucherId(voucherId);
            //设置用户Id
            voucherOrder.setUserId(userId);

            save(voucherOrder);

            //返回订单Id
            return Result.ok(orderId);
        } finally {
            //释放锁
            redisLock.unlock();
        }
    }

Redisson可重入锁原理(解决不可重入)

通过记录获取锁的数目,可以据此来判断当前是否是在最外围;

因为操作需要具有原子性,所以得采用Lua脚本进行编写

Lua实现获取锁

Lua脚本实现释放锁

可以深入Redisson获取锁与释放锁的流程,可以看到Lua脚本、

获取锁:

释放锁:

Redisson的深入理解(解决不可重试和超时释放)

锁重试:不是一直尝试获取锁,而是等待释放锁的信号量

WatchDog机制:简单来说就是每过一段时间去重置一下有效期;(如果负责储存这个分布式锁的Redisson节点宕机以后,而且这个锁正好处于锁住的状态时,这个锁会出现锁死的状态。为了避免这种情况的发生,Redisson内部提供了一个监控锁的看门狗,它的作用是在Redisson实例被关闭前,不断的延长锁的有效期。默认情况下,看门狗的检查锁的超时时间是30秒钟,也可以通过修改Config.lockWatchdogTimeout来另行指定。)

总结


解决主从一致性问题

如下图,如果按照下面方法来操作,获取锁时,如果redis的主节点宕机了,主从还未执行同步,而redis会从slave结点中选取作为主节点,但再次访问时会发现锁已经失效了

初始

 宕机后,选取主节点

multiLock(联锁)

需要同时获取成功才算成功,避免了主机宕机而导致锁失效的问题

总结

<think>好的,我需要回答用户关于Redisson使用指南或官方文档的问题。首先,用户可能想了解如何开始使用Redisson,特别是如何集成到项目中。根据引用[1],Redisson提供了Spring Boot Starter,这应该是用户需要的第一个步骤。需要提到如何添加依赖,以及自动配置的bean,比如RedissonClient和RedisTemplate。 然后,用户可能需要一些基本的使用示例。比如BitMap的使用,引用[2]和[3]提到了BitSet和BitMap,可以展示如何用Redisson操作位图。另外,分布式集合和锁也是常见用途,引用[3]中有提到Map、Lock等结构,应该举例说明。 接下来是配置部分,用户可能需要知道如何连接不同的Redis模式,比如单机、集群或哨兵模式。需要引用[1]中的配置示例,说明application.yml的写法。 高级特性方面,分布式锁、Live Object服务以及Bloom Filter可能也是用户关心的点。引用[3]中的信息可以支持这些内容,需要简要介绍每个功能的作用和用法。 最后,必须包含官方文档的链接,并建议用户查阅以获取最新信息。同时生成相关问题,帮助用户深入探索。要确保所有代码示例和配置使用正确格式,数学表达式用$...$,独立公式用$$...$$,不过在这个问题中可能数学公式不多,但要注意格式正确。回答结构要清晰,分步骤说明,确保用户能逐步理解和应用Redisson。</think>### Redisson使用指南 #### 一、环境集成 1. **Spring Boot集成** - 添加依赖至`pom.xml`: ```xml <dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> <version>3.17.7</version> </dependency> ``` - 自动注入的Spring Bean包括:$RedissonClient$、$RedisTemplate$、$ReactiveRedisTemplate$等[^1]。 2. **配置连接** ```yaml # application.yml spring: redis: redisson: config: | singleServerConfig: address: "redis://127.0.0.1:6379" database: 0 ``` #### 二、核心功能示例 1. **分布式集合** ```java RMap<String, String> map = redisson.getMap("myMap"); map.put("key", "value"); // 数据自动同步至Redis ``` 2. **位图操作(BitMap)** ```java RBitSet bitSet = redisson.getBitSet("flags"); bitSet.set(0, true); // 设置偏移量0为1 boolean flag = bitSet.get(0); // 返回true[^2] ``` 3. **分布式锁** ```java RLock lock = redisson.getLock("resourceLock"); lock.lock(); try { // 执行临界区代码 } finally { lock.unlock(); } ``` #### 三、高级特性 1. **Live Object服务** ```java @REntity public class LiveObjectExample { @RId private String id; // 字段自动持久化 } ``` 2. **布隆过滤器** ```java RBloomFilter<String> bloomFilter = redisson.getBloomFilter("userFilter"); bloomFilter.tryInit(10000L, 0.03); bloomFilter.add("user1"); // 添加元素 ``` #### 四、官方资源 - **文档地址**: [Redisson官方文档](https://redisson.org/documentation.html) - **GitHub示例**: [redisson-examples](https://github.com/redisson/redisson-examples) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值