博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Redis分布式锁实现
阅读量:5983 次
发布时间:2019-06-20

本文共 3201 字,大约阅读时间需要 10 分钟。

redis分布式锁解决多个应用进程间同步操作

import java.util.List;import java.util.UUID;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;import redis.clients.jedis.Transaction;import redis.clients.jedis.exceptions.JedisException;/** * Jedis实现分布式锁 * */public class DistributionLock {    private final JedisPool jedisPool;    public DistributionLock(JedisPool jedisPool) {        this.jedisPool = jedisPool;    }    /**     * 获取分布式锁     *      * @param lockName     *            竞争获取锁key     * @param acquireTimeoutInMS     *            获取锁超时时间     * @param lockTimeoutInMS     *            锁的超时时间     * @return 获取锁标识     */    public String acquireLockWithTimeout(String lockName,            long acquireTimeoutInMS, long lockTimeoutInMS) {        Jedis conn = null;        boolean broken = false;        String retIdentifier = null;        try {            conn = jedisPool.getResource();            String identifier = UUID.randomUUID().toString();            String lockKey = "lock:" + lockName;            int lockExpire = (int) (lockTimeoutInMS / 1000);            long end = System.currentTimeMillis() + acquireTimeoutInMS;            while (System.currentTimeMillis() < end) {                if (conn.setnx(lockKey, identifier) == 1) {                    conn.expire(lockKey, lockExpire);                    retIdentifier = identifier;                }                if (conn.ttl(lockKey) == -1) {                    conn.expire(lockKey, lockExpire);                }                try {                    Thread.sleep(10);                } catch (InterruptedException ie) {                    Thread.currentThread().interrupt();                }            }        } catch (JedisException je) {            if (conn != null) {                broken = true;                jedisPool.returnBrokenResource(conn);            }        } finally {            if (conn != null && !broken) {                jedisPool.returnResource(conn);            }        }        return retIdentifier;    }    /**     * 释放锁     * @param lockName 竞争获取锁key     * @param identifier 释放锁标识     * @return     */    public boolean releaseLock(String lockName, String identifier) {        Jedis conn = null;        boolean broken = false;        String lockKey = "lock:" + lockName;        boolean retFlag = false;        try {            conn = jedisPool.getResource();            while (true) {                conn.watch(lockKey);                if (identifier.equals(conn.get(lockKey))) {                    Transaction trans = conn.multi();                    trans.del(lockKey);                    List results = trans.exec();                    if (results == null) {                        continue;                    }                    retFlag = true;                }                conn.unwatch();                break;            }        } catch (JedisException je) {            if (conn != null) {                broken = true;                jedisPool.returnBrokenResource(conn);            }        } finally {            if (conn != null && !broken) {                jedisPool.returnResource(conn);            }        }        return retFlag;    }}

 

 

参考:

http://www.cnblogs.com/wuhuajun/p/5242644.html

你可能感兴趣的文章
Android 70道面试题汇总不再愁面试
查看>>
从ArrayList说起的JAVA复制与参数传递机制
查看>>
Servlet
查看>>
比较好的网站及工具
查看>>
Keychain
查看>>
Webview图片自适应
查看>>
使用 getopt() 进行命令行处理
查看>>
js去掉html标记,中正则表达式,去掉字符,截取字符
查看>>
使用Akka Http,ActiveMQ搭建一个邮件发送服务器
查看>>
kvm starting domain: cannot send monitor command
查看>>
Tomcat主配置文件Server.xml详解
查看>>
中考在即,您为孩子选择什么?--读<<招生全攻略>>有感
查看>>
深入剖析 HTML5
查看>>
Mysql mysql.server启动脚本详解 .
查看>>
网格(GridView)+图片(ImageView)+文字(TextView)
查看>>
jquery遇上Ajax
查看>>
iptables
查看>>
我的友情链接
查看>>
RHEL-6.1/5.4安装Heartbeat-3-0-7有可能碰见的各种错误及解决方法
查看>>
win32控制台应用程序中使用CString类型的方法
查看>>