Redisson实现方案

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
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

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
运维 NoSQL 安全
Redisson分布式锁最基础内容
Redisson分布式锁最基础内容
85 0
|
6月前
|
存储 NoSQL Java
Redisson实现分布式锁
Redisson实现分布式锁
83 0
|
6月前
|
NoSQL Java 中间件
如何使用Redisson实现分布式锁?
如何使用Redisson实现分布式锁?
350 1
|
6月前
|
监控 NoSQL 算法
Redisson–红锁(Redlock)–使用/原理
Redisson–红锁(Redlock)–使用/原理
340 0
|
缓存 NoSQL API
分布式锁工具:Redisson,很强!
分布式锁工具:Redisson,很强!
297 1
|
分布式计算 NoSQL Java
Redisson—分布式服务
Redisson—分布式服务
148 1
|
NoSQL Java 程序员
为什么引入Redisson分布式锁?
Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。其中包含了各种各样的分布式锁的实现。
为什么引入Redisson分布式锁?
Zp
基于Redisson实现分布式锁并分析其原理
基于Redisson实现分布式锁并分析其原理
Zp
91 0
|
监控 NoSQL 算法
【SimpleFunction系列二.3】Redisson分布式锁8种锁模式剖析
可重入锁就是我们前面讲解的Redis分布式锁的Redisson实现,对于延时、过期等功能,Redisson内部提供了一个监控锁的看门狗,它的作用是在Redisson实例被关闭前,不断的延长锁的有效期。
819 2
【SimpleFunction系列二.3】Redisson分布式锁8种锁模式剖析
|
NoSQL Java Redis
Springboot基于Redisson实现Redis分布式可重入锁【案例到源码分析】
Springboot基于Redisson实现Redis分布式可重入锁【案例到源码分析】
239 0
Springboot基于Redisson实现Redis分布式可重入锁【案例到源码分析】