请教一下基于redis的分布式值锁的写法,在twemproxy环境

发布于 2021-11-23 16:44:42 字数 1971 浏览 808 评论 11

最近需要在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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(11

卸妝后依然美 2021-11-30 14:43:13

引用来自“Ambitor、石头”的评论

Redis做分布式锁很容易做的吧。。基于Redis的原子性操作去设计!~

岁月打碎记忆 2021-11-30 14:43:05

Redis做分布式锁很容易做的吧。。基于Redis的原子性操作去设计!~

眼眸 2021-11-30 14:42:46

Correct implementation with a single instance

背叛残局 2021-11-30 14:42:45

回复
在TWEMPROXY里面几乎不能用lua脚本的..

平生欢 2021-11-30 14:39:54

@Brin想写程序 1.可以考虑使用redis3.0官方集群解决方案

倚栏听风 2021-11-30 14:38:59

@Brin想写程序 即使不使用lua,问题也不会太大

网名女生简单气质 2021-11-30 14:34:49

回复
我发现问题了,我这个锁不能重入。

醉生梦死 2021-11-30 14:14:17

引用来自“Brin想写程序”的评论

引用来自“hongliuliao”的评论

你这样实现有问题,建议看下如下文档

http://redis.io/topics/distlock

檐上三寸雪 2021-11-30 06:20:22

引用来自“Brin想写程序”的评论

引用来自“hongliuliao”的评论

你这样实现有问题,建议看下如下文档

http://redis.io/topics/distlock

累赘 2021-11-29 07:02:36

引用来自“hongliuliao”的评论

你这样实现有问题,建议看下如下文档

http://redis.io/topics/distlock

千纸鹤带着心事 2021-11-25 19:36:53

你这样实现有问题,建议看下如下文档

http://redis.io/topics/distlock

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文