• Java Redis 做分布式锁


    最近在做集群的时候,多台服务器上都有Spring定时任务的代码。

    如果不做处理的话,每台服务器上的定时任务都会执行,而实际只需要一台服务器上的定时任务执行就可以了。

    我这里用的是Redis来保证这个一致性。

    大致逻辑:

    1.多台服务器定时任务同时触发。

    2.在代码块中增加向Redis请求添加KEY的操作,添加成功则表示锁定,当前服务器执行定时任务。添加失败不执行定时任务。

    3.执行完成之后释放锁。

    java部分代码:

    // 锁名称
    String key = "ProductStatus";
    // 获取锁
    if(lock(key)) {
        // 当前服务器执行定时任务
    } else {
        // 不执行
        return;
    }
        private boolean lock(String key) {
            String str = jedis.set(getKey(key), "1", "NX", "PX", 100);
            if("OK".equals(str)) {
                return true;
            }
            return false;
        }

    释放锁,为了避免释放的过程失败,使用的是Redis脚本代码。

    private boolean unlock(String key) {
            String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
            Object result = jedis.eval(script, Collections.singletonList(getKey(key)), Collections.singletonList("1"));
            Long r = 1L;
            if(r.equals(result)) {
                return true;
            }
            return false;
        }

    这里还需要注意的是,集群服务器的时间在部署的时候必须进行同步。

    否则定时任务执行的时间会存在偏差。

    作者:Se7end

    声明:本博客文章为原创,只代表本人在工作学习中某一时间内总结的观点或结论。转载时请在文章页面明显位置给出原文链接。
  • 相关阅读:
    菜鸟系列Golang学习 — 协程
    菜鸟系列Golang学习 — 切片
    菜鸟系列Golang学习 — 数组
    菜鸟系列Fabric —— Fabric-CA
    菜鸟系列计算机网络——TCP和UDP协议
    菜鸟系列Fabric源码学习 — kafka共识机制
    菜鸟系列Fabric源码学习 — 背书节点和链码容器交互
    Amazon's Dynamo 论文中文版
    3、递归(动态规划思想)
    2、链表(python实现)
  • 原文地址:https://www.cnblogs.com/se7end/p/9522236.html
Copyright © 2020-2023  润新知