Laravel  
laravel
文档
数据库
架构
入门
php技术
    
Laravelphp
laravel / php / java / vue / mysql / linux / python / javascript / html / css / c++ / c#

java redis分布式锁实现

作者:嗜血苍狼   发布日期:2025-09-16   浏览:88

import redis.clients.jedis.Jedis;
import redis.clients.jedis.params.SetParams;

public class RedisDistributedLock {

    private static final String LOCK_SUCCESS = "OK";
    private static final String SET_IF_NOT_EXIST = "NX";
    private static final String SET_WITH_EXPIRE_TIME = "PX";

    private Jedis jedis;

    public RedisDistributedLock(Jedis jedis) {
        this.jedis = jedis;
    }

    /**
     * 尝试获取分布式锁
     * @param lockKey 锁的key
     * @param requestId 请求标识
     * @param expireTime 锁的超时时间(毫秒)
     * @return 是否成功获取锁
     */
    public boolean tryGetLock(String lockKey, String requestId, int expireTime) {
        SetParams params = new SetParams();
        params.nx().px(expireTime);
        String result = jedis.set(lockKey, requestId, params);
        return LOCK_SUCCESS.equals(result);
    }

    /**
     * 释放分布式锁
     * @param lockKey 锁的key
     * @param requestId 请求标识
     * @return 是否成功释放锁
     */
    public boolean releaseLock(String lockKey, String requestId) {
        String script =
            "if redis.call('get', KEYS[1]) == ARGV[1] then " +
            "   return redis.call('del', KEYS[1]) " +
            "else " +
            "   return 0 " +
            "end";
        Object result = jedis.eval(script, 1, lockKey, requestId);
        return result != null && (Long) result == 1L;
    }
}

解释说明

  1. tryGetLock 方法:

    • 使用 SET 命令并带上 NXPX 参数来实现加锁操作。
    • NX 表示只有当锁不存在时才设置锁。
    • PX 表示设置锁的过期时间,单位为毫秒。
    • 如果返回值是 "OK",则表示成功获取锁。
  2. releaseLock 方法:

    • 使用 Lua 脚本来确保只有持有锁的客户端才能释放锁。
    • Lua 脚本首先检查锁的值是否与请求标识一致,如果一致则删除锁,否则不删除。
    • 这样可以避免误删其他客户端持有的锁。
  3. Jedis:

    • Jedis 是一个 Redis 的 Java 客户端库,用于与 Redis 服务器进行交互。

上一篇:java 延迟队列

下一篇:java divide函数

大家都在看

java连接数据库的代码

java djl

ubuntu 卸载java

java读取excel中的图片

java新建

java sort用法

java collections.sort

java file类的方法

java发送qq邮件

java 判断

Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3

Laravel 中文站