Springboot-Jedis实现分布式锁

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: Springboot-Jedis实现分布式锁

依赖

        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.3.0</version>
        </dependency>

配置类

@Configuration
@EnableConfigurationProperties(RedisProperties.class)
public class RedisConfig {
   
    public static final String KEY_PREFIX ="xxx-service:";

    @Bean
    public JedisPool jedisPool(RedisProperties properties) {
   
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(128);
        config.setMaxIdle(16);
        config.setMinIdle(16);
        return new JedisPool(config, properties.getHost(), properties.getPort(), 2000, properties.getPassword());
    }
}

工具类

@Service
@Qualifier("jedisService")
public class JedisServiceImpl implements ILockService {
   

    @Autowired
    private JedisPool jedisPool;
    private static final String RELEASE_LOCK_LUA_SCRIPT =
            "if redis.call('get', KEYS[1]) == ARGV[1] then " +
                    "return redis.call('del', KEYS[1]) " +
                    "else " +
                    "return 0 " +
                    "end";
    private static final String TRY_LOCK_LUA_SCRIPT =
            "if redis.call('setNx', KEYS[1], ARGV[1]) then " +
                    "   if redis.call('get', KEYS[1]) == ARGV[1] then " +
                    "       return redis.call('expire', KEYS[1], ARGV[2]) " +
                    "   else " +
                    "       return 0 " +
                    "   end " +
                    "else " +
                    "   return 0 " +
                    "end";

    @Override
    public boolean tryLock(String lockKey, String lockValue, long expireSeconds) {
   
        lockKey= RedisConfig.KEY_PREFIX+lockKey;
        try (Jedis jedis = jedisPool.getResource()) {
   
            Object result = jedis.eval(TRY_LOCK_LUA_SCRIPT,
                    1,
                    lockKey,
                    lockValue,
                    String.valueOf(expireSeconds));
            // Redis会返回Long类型的结果
            return "1".equals(result.toString());
        } catch (Exception e) {
   
            //打印日志;
            return false;
        }
    }

    @Override
    public boolean releaseLock(String lockKey, String lockValue) {
   
        lockKey= RedisConfig.KEY_PREFIX+lockKey;
        try (Jedis jedis = jedisPool.getResource()) {
   
            Object result = jedis.eval(RELEASE_LOCK_LUA_SCRIPT,
                    1,
                    lockKey,
                    lockValue);
            return "1".equals(result.toString());
        } catch (Exception e) {
   
            //打印日志;
            return false;
        }
    }
}
相关实践学习
基于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
目录
相关文章
|
4天前
|
NoSQL Java 测试技术
字节二面:Spring Boot Redis 可重入分布式锁实现原理?
字节二面:Spring Boot Redis 可重入分布式锁实现原理?
178 1
|
4天前
|
Dubbo Java 应用服务中间件
Spring Boot Dubbo 构建分布式服务
Spring Boot Dubbo 构建分布式服务
54 0
|
4天前
|
Java 编译器 数据库
Spring Boot 整合 redisson 实现分布式锁
Spring Boot 整合 redisson 实现分布式锁
32 1
|
4天前
|
编解码 NoSQL Java
Springboot框架使用redisson实现分布式锁
Redisson是官方推荐的Java Redis客户端,提供丰富的功能,包括默认的分布式锁支持。它可以无缝替代Spring Boot 2.x的Letture客户端,不影响原有RedisTemplate和Redis Repository的使用。集成包括spring-boot-starter-data-redis和redisson-spring-boot-starter,后者需排除默认的redisson-spring-data-23以匹配Spring Data Redis v.2.2.x。
|
4天前
|
消息中间件 人工智能 Java
Spring Boot+RocketMQ 实现多实例分布式环境下的事件驱动
Spring Boot+RocketMQ 实现多实例分布式环境下的事件驱动
27 1
|
4天前
|
Java BI 调度
Spring Boot 整合xxl-job实现分布式定时任务
XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。 xxl是xxl-job的开发者大众点评的许雪里名称的拼音开头。
|
4天前
|
存储 NoSQL Java
纠正误区:这才是 SpringBoot Redis 分布式锁的正确实现方式
纠正误区:这才是 SpringBoot Redis 分布式锁的正确实现方式
147 0
|
负载均衡 Java Spring
SpringBoot学习笔记-14:第十四章-SpringBoot 与分布式(2)
SpringBoot学习笔记-14:第十四章-SpringBoot 与分布式
106 0
|
Dubbo Java 应用服务中间件
SpringBoot学习笔记-14:第十四章-SpringBoot 与分布式(1)
SpringBoot学习笔记-14:第十四章-SpringBoot 与分布式
111 0
|
负载均衡 Dubbo Java
SpringBoot学习笔记-14:第十四章-SpringBoot 与分布式
SpringBoot学习笔记-14:第十四章-SpringBoot 与分布式
105 0