zoukankan      html  css  js  c++  java
  • 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

    声明:本博客文章为原创,只代表本人在工作学习中某一时间内总结的观点或结论。转载时请在文章页面明显位置给出原文链接。
  • 相关阅读:
    deepin-wine-tim 字体发虚
    windows&linux双系统时间相差8小时
    Linux 禁用 ipv6
    双系统win10更新后无法进入linux
    Failed to receive SOCKS4 connect request ack 解决
    zsh 使用通配符功能
    vux修改css样式的2种办法
    Ubuntu 16.04 安装OpenSSH7.4
    Nginx开启http2访问和gzip网页压缩功能
    vue开发环境和生产环境里面解决跨域的几种方法
  • 原文地址:https://www.cnblogs.com/se7end/p/9522236.html
Copyright © 2011-2022 走看看