赞
踩
SET NX
命令是 Redis 中用于实现分布式锁的一个重要命令。它的语法和用法如下:
SET key value NX [EX seconds | PX milliseconds]
key
:要设置的键名。value
:要设置的键值,通常用一个唯一标识符(如 UUID)来标识持有锁的客户端。NX
:表示只有在键不存在时才执行 SET
操作。NX 是 “Not eXists” 的缩写。EX seconds
:可选参数,设置键的过期时间,以秒为单位。PX milliseconds
:可选参数,设置键的过期时间,以毫秒为单位。SET NX
命令用于在 Redis 中原子性地设置一个键值对,并且只有在该键不存在时才会进行设置。它结合 EX
或 PX
参数,可以实现一个具有过期时间的分布式锁。
SET NX
命令通常用于实现分布式锁,以确保在分布式环境中,同一时间只有一个客户端可以持有锁,从而避免并发访问导致的数据不一致问题。
假设我们有一个需要加锁的资源,使用 SET NX
命令实现分布式锁的过程如下:
import redis.clients.jedis.Jedis; import java.util.UUID; public class DistributedLock { private Jedis jedis; private String lockKey; private String lockValue; private int expireTime; public DistributedLock(Jedis jedis, String lockKey, int expireTime) { this.jedis = jedis; this.lockKey = lockKey; this.expireTime = expireTime; } // 获取锁 public boolean acquireLock() { this.lockValue = UUID.randomUUID().toString(); String result = jedis.set(lockKey, lockValue, "NX", "EX", expireTime); return "OK".equals(result); } // 释放锁 public boolean releaseLock() { String luaScript = "if redis.call('get', KEYS[1]) == ARGV[1] then " + "return redis.call('del', KEYS[1]) " + "else " + "return 0 " + "end"; Object result = jedis.eval(luaScript, 1, lockKey, lockValue); return result.equals(1L); } public static void main(String[] args) { Jedis jedis = new Jedis("localhost", 6379); DistributedLock lock = new DistributedLock(jedis, "resource_lock", 10); if (lock.acquireLock()) { try { System.out.println("Lock acquired, doing some work..."); // 执行业务逻辑 } finally { lock.releaseLock(); System.out.println("Lock released"); } } else { System.out.println("Failed to acquire lock"); } jedis.close(); } }
获取锁:
lockValue
:生成一个唯一标识符,作为锁的值。jedis.set(lockKey, lockValue, "NX", "EX", expireTime)
:尝试使用 SET NX
命令设置锁。只有在 lockKey
不存在时,才能成功设置该键,并指定过期时间 expireTime
。释放锁:
if redis.call('get', KEYS[1]) == ARGV[1] then
return redis.call('del', KEYS[1])
else
return 0
end
lockKey
的值是否等于 lockValue
,如果相等,则删除该键,否则不执行任何操作。通过 SET NX
命令,可以有效实现分布式锁,保证分布式环境中资源的安全访问和数据的一致性。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。