java redis evalsha_高并发 共享资源 死锁 分布式锁 redisTemplate实现分布式锁 EvalSha is not supported in cluster environm...

本文介绍了如何在Java中使用RedisTemplate实现分布式锁,通过Lua脚本确保命令的原子性。然而,在集群环境中遇到`EvalSha is not supported`的错误,代码中分别处理了集群模式和单机模式的执行方式。提供了获取锁和释放锁的示例方法,但集群模式下使用EvalSha会报错。
摘要由CSDN通过智能技术生成

也有不用回调函数直接调用脚本的版本,但是经过我的测试之后,发现报错EvalSha is not supported in cluster environment

上锁解锁的代码比较简单,也好理解。利用lua脚本解释redis命令,保证命令一次性运行成功,从而保证命令执行的原子性。

但是想和业务系统结合起来还是有难度的。特别是在本地事务中去使用的时候,需要结合业务特点,本地事务提交之后解锁也要成功。

/**

* 获取锁

* @param lockKey

* @param value

* @param expireTime:单位-秒

* @return

*/

public static boolean getLock(String lockKey, String requestId, int expireTime) {

boolean ret = false;

try {

List keys = new ArrayList();

keys.add(lockKey);

List args = new ArrayList();

args.add(requestId);

args.add(expireTime + "");

String script = "if redis.call('setNx',KEYS[1],ARGV[1])==1  then return redis.call('expire',KEYS[1],ARGV[2]) else return 0 end";

Lo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值