ZBLOG

redis 分布式锁 请给出java代码

下面是一个简单的基于Redis实现的分布式锁Java代码示例:

  1. import redis.clients.jedis.Jedis;
  2. import redis.clients.jedis.params.SetParams;
  3. public class DistributedLock {
  4. private final Jedis jedis;
  5. private final String lockKey;
  6. private final String lockValue;
  7. private final int expireTime; // 锁过期时间,单位:秒
  8. public DistributedLock(Jedis jedis, String lockKey, String lockValue, int expireTime) {
  9. this.jedis = jedis;
  10. this.lockKey = lockKey;
  11. this.lockValue = lockValue;
  12. this.expireTime = expireTime;
  13. }
  14. public boolean tryLock() {
  15. SetParams params = new SetParams();
  16. params.nx(); // 只有键不存在时才设置值
  17. params.ex(expireTime); // 设置过期时间,防止死锁
  18. String result = jedis.set(lockKey, lockValue, params);
  19. return "OK".equals(result);
  20. }
  21. public boolean releaseLock() {
  22. // Redis不支持原子删除带有特定值的键,需要使用Lua脚本来实现
  23. String luaScript = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
  24. Object result = jedis.eval(luaScript, 1, lockKey, lockValue);
  25. return (Long) result == 1L;
  26. }
  27. }

使用示例:

  1. Jedis jedis = new Jedis("localhost", 6379); // 连接到Redis服务器
  2. DistributedLock lock = new DistributedLock(jedis, "my-lock", "my-value", 30); // 创建分布式锁
  3. if (lock.tryLock()) { // 尝试获取锁
  4. try {
  5. // 执行需要加锁的代码,同一时刻只能有一个线程执行该代码
  6. } finally {
  7. lock.releaseLock(); // 释放锁
  8. }
  9. }

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=405

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?