Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。
        Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。
        Redisson和jedis以及lettuce一样都是redis客户端,只不过Redisson功能更强大。

Redisson的作用

        1.集成了大量redis的方法,操作更简单

        2.提供了非关系型数据库,不需要频繁操作数据库

        3.提供了分布式锁可以有效避免高并发带来的数据丢失

        4.服务器集群部署时,解决不同服务器同时执行同一方法问题。

官方文档

目录 · redisson/redisson Wiki · GitHubicon-default.png?t=M3C8https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95

Redisson的使用

        依赖引入:

    maven

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.6.RELEASE</version>
        <relativePath/>
    </parent>

    <dependencies>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson-spring-boot-starter</artifactId>
            <version>3.13.0</version>
        </dependency>

    </dependencies>

application.yml

server:
  port: 8183
spring:
  application:
    name: redission-study
  redis:
    # 数据库索引
    database: 0
    # 单节点redis配置
    host: 192.168.31.236
    port: 6379

   Controller

  分布式ID

    @Autowired
    RedissonClient redissonClient;


    @GetMapping("/getOrderNumber")
    @ResponseBody
    public String getOrderNumber() {

        //格式化格式为年月日
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMdd");
        //获取当前时间
        String now = LocalDate.now().format(dateTimeFormatter);
        //通过redis的自增获取序号
        RAtomicLong atomicLong = redissonClient.getAtomicLong(now);
        atomicLong.expire(1, TimeUnit.DAYS);
        //拼装订单号
        return now + "" + atomicLong.incrementAndGet();

    }

测试:

        用JMeter对其进行多线程并行测试,线程数:20

 初始值是20220416118,之前已经测试过

 测试完成,20次都成功

 浏览器访问一次看结果

 20220416118+20=20220416138,再访问一次就是20220416139

结论:RAtomicLong源码已经提供了锁,在高并发下也不会丢失数据

RAtomicLong也提供了对数据进行set和get方法

 

分布式锁

        常见方法

anyLock:redission队列的唯一标识

        //获取分布式锁
        RLock lock = redissonClient.getLock("anyLock");

  上锁

两种常用上锁方式tryLock()或者lock() 

lock.lock();
transferLock.lock(10,TimeUnit.SECONDS);

waittime=10 排队等待时间,leasetime=300,锁维持时间,TimeUnit.SECONDS=时间单位 秒

lock.tryLock()
lock.tryLock(10,300,TimeUnit.SECONDS);

 释放锁

lock.unlock();

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐