1、setNX命令说明:
SET resource_name my_random_value NX PX 30000
2、代码演示:
@Service
public class BaseSetNXDistributeLockService {
private static final Logger LOGGER = LoggerFactory.getLogger(BaseSetNXDistributeLockService.class);
@Autowired
private RedisTemplate redisTemplate;
public String redisLock() {
LOGGER.info("我进入了方法!");
String key = "redisKey";
String value = UUID.randomUUID().toString();
RedisCallback<Boolean> redisCallback = connection -> {
//设置NX
RedisStringCommands.SetOption setOption = RedisStringCommands.SetOption.ifAbsent();
//设置过期时间
Expiration expiration = Expiration.seconds(30);
//序列化key
byte[] redisKey = redisTemplate.getKeySerializer().serialize(key);
//序列化value
byte[] redisValue = redisTemplate.getValueSerializer().serialize(value);
//执行setnx操作
Boolean result = connection.set(redisKey, redisValue, expiration, setOption);
return result;
};
//获取分布式锁
Boolean lock = (Boolean) redisTemplate.execute(redisCallback);
if (lock) {
LOGGER.info("我进入了锁!");
try {
Thread.sleep(15000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
String script = "if redis.call(\"get\",KEYS[1]) == ARGV[1] then\n"+
" return redis.call(\"del\",KEYS[1])\n"+
"else\n"+
" return 0\n"+
"end";
RedisScript<Boolean> redisScript = RedisScript.of(script, Boolean.class);
List<String> keys = Arrays.asList(key);
Boolean result = (Boolean) redisTemplate.execute(redisScript,keys,value);
LOGGER.info("释放锁的结果:"+result);
}
}
return "方法执行完成!";
}
}
基于redis SETNX命令实现分布式锁:加解锁
于 2021-10-11 22:54:36 首次发布
本文介绍了如何使用Redis的setNX命令配合Spring Boot实现分布式锁,并通过`BaseSetNXDistributeLockService`服务提供代码实例,展示了如何获取和释放锁的过程。

172万+

被折叠的 条评论
为什么被折叠?



