请教一下基于redis的分布式值锁的写法,在twemproxy环境
最近需要在twemproxy下面编写redis的程序,使用的这个redis的集群,几乎所有的事务性操作语句都不能使用。
所以根据信号量原理写了一个数值锁,用来锁定一个key的读写。不知道写的对不对,希望大家能给点意见。
public class MultiLock extends Store { public static final String MULTI = "multi"; private final JedisPool pool; private final String multiKey; public MultiLock(String openId, String key) { pool = this.getRedisPool(openId); multiKey = this.genKey(MULTI, key); } public MultiLock(String key) { pool = this.getRedisPool(key); multiKey = this.genKey(MULTI, key); } public void acquire() { Jedis jedis = null; try { jedis = pool.getResource(); long signal = jedis.incr(multiKey); jedis.expire(multiKey, SystemConfig.lockExpire); if (signal > 1) { //signal 大于1说明有线程抢占 System.out.println("conflict:key=" + multiKey + " signal=" + signal); String val = jedis.get(multiKey); if (val != null) { while (!val.equals("1")) { sleep(signal * SystemConfig.lockDelay); val = jedis.get(multiKey); if (val == null) { //死锁60秒后,超时跳出 break; } } } } } catch (Exception e) { e.printStackTrace(); } finally { pool.returnResource(jedis); } } public void release() { Jedis jedis = null; try { jedis = pool.getResource(); jedis.decr(multiKey); jedis.expire(multiKey, SystemConfig.lockExpire); } catch (Exception e) { e.printStackTrace(); } finally { pool.returnResource(jedis); } } }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(11)
引用来自“Ambitor、石头”的评论
Redis做分布式锁很容易做的吧。。基于Redis的原子性操作去设计!~
Redis做分布式锁很容易做的吧。。基于Redis的原子性操作去设计!~
Correct implementation with a single instance
回复
在TWEMPROXY里面几乎不能用lua脚本的..
@Brin想写程序 1.可以考虑使用redis3.0官方集群解决方案
@Brin想写程序 即使不使用lua,问题也不会太大
回复
我发现问题了,我这个锁不能重入。
引用来自“Brin想写程序”的评论
引用来自“hongliuliao”的评论
你这样实现有问题,建议看下如下文档
http://redis.io/topics/distlock
引用来自“Brin想写程序”的评论
引用来自“hongliuliao”的评论
你这样实现有问题,建议看下如下文档
http://redis.io/topics/distlock
引用来自“hongliuliao”的评论
你这样实现有问题,建议看下如下文档
http://redis.io/topics/distlock
你这样实现有问题,建议看下如下文档
http://redis.io/topics/distlock