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;
        }
    }
}

相关推荐

  1. Springboot-Jedis实现分布式

    2024-05-09 12:58:03       16 阅读
  2. springboot3 redis 实现分布式

    2024-05-09 12:58:03       20 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-09 12:58:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-09 12:58:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-09 12:58:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-09 12:58:03       20 阅读

热门阅读

  1. shell_结束进程脚本

    2024-05-09 12:58:03       13 阅读
  2. deepspeed+transformers模型微调

    2024-05-09 12:58:03       14 阅读
  3. docker无法映射/挂载根目录

    2024-05-09 12:58:03       10 阅读
  4. 【算法刷题day46】Leetcode:139. 单词拆分

    2024-05-09 12:58:03       15 阅读
  5. apk一键换包名工具

    2024-05-09 12:58:03       18 阅读
  6. Swift 基本运算符

    2024-05-09 12:58:03       14 阅读
  7. 【数据结构和算法】--链表

    2024-05-09 12:58:03       12 阅读
  8. websocket

    websocket

    2024-05-09 12:58:03      12 阅读
  9. vue触发原生form提交到指定action地址

    2024-05-09 12:58:03       12 阅读
  10. c++中constexpr的一个用法——在泛型编程中的作用

    2024-05-09 12:58:03       11 阅读