spring redis 分布式锁集成与测试

5 篇文章 0 订阅

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

环境:
spring-boot 2.4.7

一、添加pom依赖

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

二、 配置及测试

1. RedisConfig

@Configuration
public class RedisConfig extends CachingConfigurerSupport {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(factory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        return redisTemplate;
    }

    @Bean
    public RedisTemplate<String, String> strRedisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(factory);
        StringRedisSerializer serializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(serializer);
        redisTemplate.setValueSerializer(serializer);
        return redisTemplate;
    }

    @Bean
    public RedisLockRegistry redisLockRegistry(RedisConnectionFactory redisConnectionFactory) {
        RedisLockRegistry redisLockRegistry = new RedisLockRegistry(redisConnectionFactory, "redis-lock", TimeUnit.MINUTES.toMillis(1));
        RedisLock.init(redisLockRegistry);
        return redisLockRegistry;
    }
}

2. RedisLock 封装一下


@Data
public class RedisLock {

    public static Logger log = LoggerFactory.getLogger(RedisLock.class);
    private static RedisLockRegistry redisLockRegistry;
    private Lock lock;

    public static void init(RedisLockRegistry redisLockRegistry) {
        RedisLock.redisLockRegistry = redisLockRegistry;
    }

    public boolean lock() {
        lock = redisLockRegistry.obtain(this.lockKey);
        return lock.tryLock();
    }

    public boolean tryLock(long wait, TimeUnit unit) {
        lock = redisLockRegistry.obtain(this.lockKey);
        try {
            return lock.tryLock(wait, unit);
        } catch (InterruptedException e) {
            return false;
        }
    }

    public Boolean unlock() {
        lock.unlock();
        return true;
    }
}

3. 测试


    @Test
    public void test1() throws InterruptedException {
        RedisLock lock = new RedisLock("test");
        log.info("res1: {}", lock.lock());
        new Thread(
            () -> {
                log.info("res1: {}", lock.tryLock(60L, TimeUnit.SECONDS));
            }
        )
            .start();
        Thread.sleep(20000);
        lock.unlock();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在Spring Boot集成Redis分布式锁可以使用Redisson来实现。Redisson是一个基于Redis的分布式对象和服务框架,内部已经实现了Redis分布式锁,使用起来更加方便和稳定。通过Redisson,可以使用RedLock算法来实现分布式锁,确保锁的正确性和可靠性。在Redis集群环境下,可能存在锁失效或死锁的问题,但使用Redisson的分布式锁可以解决这个问题。此外,分布式锁是为了解决分布式系统中控制共享资源访问的问题,因为在分布式系统中,多线程、多进程分布在不同机器上,传统的并发控制锁策略失效。因此,通过集成Redis分布式锁,可以有效地控制共享资源的访问。 #### 引用[.reference_title] - *1* *2* [springboot集成redis 分布式锁(redistemplate,lua,redisson)](https://blog.csdn.net/jun2571/article/details/130382023)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Springboot集成Redis——实现分布式锁](https://blog.csdn.net/tang_seven/article/details/126769580)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值