Redisson实现方案

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: Redisson方式1引入依赖

Redisson

方式1

引入依赖

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.15.1</version>
</dependency>

配置文件application.properties

自定义配置

redisson.url=redis://127.0.0.1:6379

配置类

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RedissonConfig {
    @Value("${redisson.url}")
    private String redisUrl;
    @Bean
    public RedissonClient getRedissonClient(){
        Config config = new Config();
        config.useSingleServer().setAddress(redisUrl);
        return Redisson.create(config);
    }
}

使用

import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class DemoService {
    @Autowired
    private RedissonClient redissonClient;
    public void doSomething(){
        RLock lock = redissonClient.getLock("lock_key");
        try {
            lock.lock();
            // TODO 业务逻辑
        } finally {
            lock.unlock();
        }
    }
}

方式2:

依赖

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

配置文件application.properties(这种方式完全兼容SpringBoot配置)

spring.redis.host=127.0.0.1

spring.redis.port=6379

使用

import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class DemoService {
    @Autowired
    private RedissonClient redissonClient;
    public void doSomething(){
        RLock lock = redissonClient.getLock("lock_key");
        try {
            lock.lock();
            // TODO 业务逻辑
        } finally {
            lock.unlock();
        }
    }
}

spring-integration-redis

依赖

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

配置文件application.properties

spring.redis.host=127.0.0.1

spring.redis.port=6379

配置类

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.integration.redis.util.RedisLockRegistry;
@Configuration
public class RedisLockConfig {
    @Bean
    public RedisLockRegistry redisLockRegistry(RedisConnectionFactory redisConnectionFactory) {
        return new RedisLockRegistry(redisConnectionFactory, "registry_key");
    }
}

使用

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.integration.redis.util.RedisLockRegistry;
import org.springframework.stereotype.Service;
import java.util.concurrent.locks.Lock;
@Service
public class DemoService {
    @Autowired
    private RedisLockRegistry redisLockRegistry;
    public void doSomething(){
        Lock lock = redisLockRegistry.obtain("lock_key");
        try {
            lock.lock();
            // TODO 业务逻辑
        } finally {
            lock.unlock();
        }
    }
}

追加方式:两种方式测试方便合在一块,实际独立的

org.redisson redisson 3.15.1

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RedissonConfig {
    @Bean
    public RedissonClient getRedissonClient() {
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379");
        return Redisson.create(config);
    }
}
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest(classes = TaskApplication.class)
public class ExceptionTest {
    //way of first
    //redisson-spring-boot-starter-3.13.6.jar
    @Autowired
    private RedissonClient redissonClient;
//    //way of second
//    //lock4j-redisson-spring-boot-starter-2.2.2.jar
//    @Resource
//    private LockTemplate lockTemplate;
    //way of first
    @Test
    public void redisTest() {
        RLock lock = redissonClient.getLock("this_is_key");
        try {
            lock.lock();
            //模拟业务
            Thread.sleep(5000);
        } catch (Exception e) {
            log.warn("e:{}", e);
        } finally {
            lock.unlock();
        }
    }
//    //way of second
//    @Test
//    public void secondTest(){
//        LockInfo lockInfo = null;
//        try {
//            lockInfo = lockTemplate.lock("this_is_second_key", 5000L, 0);
//
//            Thread.sleep(5000);
//        } catch (Exception e) {
//            log.warn("e:{}", e);
//        }
//
//        lockTemplate.releaseLock(lockInfo);
//    }
}

==========第二种



com.baomidou

lock4j-redisson-spring-boot-starter

2.2.2

spring:
  redis:
    host: 127.0.0.1
    port: 6379


@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest(classes = TaskApplication.class)
public class ExceptionTest {
//    //way of first
//    //redisson-spring-boot-starter-3.13.6.jar
//    @Autowired
//    private RedissonClient redissonClient;
    //way of second
    //lock4j-redisson-spring-boot-starter-2.2.2.jar
    @Resource
    private LockTemplate lockTemplate;
//    //way of first
//    @Test
//    public void redisTest() {
//        RLock lock = redissonClient.getLock("this_is_key");
//        try {
//            lock.lock();
//            //模拟业务
//            Thread.sleep(5000);
//        } catch (Exception e) {
//            log.warn("e:{}", e);
//        } finally {
//            lock.unlock();
//        }
//    }
    //way of second
    @Test
    public void secondTest(){
        LockInfo lockInfo = null;
        try {
            lockInfo = lockTemplate.lock("this_is_second_key", 5000L, 0);
            Thread.sleep(5000);
        } catch (Exception e) {
            log.warn("e:{}", e);
        }
        lockTemplate.releaseLock(lockInfo);
    }
}

参考:http://t.zoukankan.com/LUA123-p-14516530.html

相关文章
|
Java Spring
在Spring Boot中,可以通过控制`@PostConstruct`注解方法的执行顺序来实现初始化时的顺序控制
在Spring Boot中,可以通过控制`@PostConstruct`注解方法的执行顺序来实现初始化时的顺序控制
1170 1
|
NoSQL Java Redis
Redisson集群管理工具、对Redis节点的操作
Redisson集群管理工具、对Redis节点的操作
564 1
|
NoSQL Shell Redis
Redis热升级秘诀:保证高可用性的技术方案
Redis热升级方案允许在不中断业务的情况下,实现数千级别Redis的无缝更新。通过构建Redis Shell程序保存数据库状态,封装动态连接库,以及在运行时加载新版本库,保持客户端连接,该方法确保了业务连续性和高可用性,且升级仅需几毫秒,显著提升了系统效率。
991 6
|
Arthas Java 测试技术
Arthas 排查JVM问题总结
Arthas 排查JVM问题总结
828 0
Arthas 排查JVM问题总结
|
缓存 算法 Java
JVM问题排查
JVM问题排查
316 0
|
SQL 监控 Oracle
MySQL发现sql语句执行很慢排查建议
MySQL发现sql语句执行很慢排查建议
706 0
|
Prometheus 监控 Cloud Native
[基础服务] Grafana/Prometheus/node-exporter 的安装和部署
[基础服务] Grafana/Prometheus/node-exporter 的安装和部署
1437 0
[基础服务] Grafana/Prometheus/node-exporter 的安装和部署
|
存储 监控 数据可视化
日志服务 SLS 全新发布按写入数据量计费模式
日志服务 SLS 全新推出的按写入数据量计费模式让 SLS 更普惠、更易用!仅收取原始数据(非压缩)写入费用、存储费用以及外网数据流量费用,帮助用户购买更简单、费用可预期、轻松拓展更丰富场景。
2466 0
|
小程序 开发工具
小程序:uniapp解决 vendor.js 体积过大的问题
小程序:uniapp解决 vendor.js 体积过大的问题
2628 0
|
消息中间件 存储 算法
1.5万字长文:从 C# 入门 Kafka
1, 搭建 Kafka 环境 安装 docker-compose 单节点 Kafka 的部署 Kafka 集群的部署 2, Kafka 概念 基本概念 关于 Kafka 脚本工具 主题管理 使用 C# 创建分区 分区与复制 生产者消费者 修改配置 3, Kafka .NET 基础 生产者 批量生产 使用 Tasks.WhenAll 如何进行性能测试 消费 4,生产者 连接 Broker Key 分区 评估消息发送时间 生产者配置 acks bootstrap.servers retries enable.idempotence max.in.flight.requests.per.connec
1089 0