分布式锁 基于Redis

分布式锁的实现(基于Redis)

参考:http://www.jb51.net/article/75439.htm 

        http://www.linuxidc.com/Linux/2015-01/111827.htm 

        http://www.tuicool.com/articles/6juqmm7 

 方式一: 基于第三方类库 redssion 

1.安装redis

安装redssion的锁服务队redis的版本有要求,要求必须高于2.6版本。关于redis的安装,请参考redis安装。

2.redssion库

redssion的库添加的pom文件中去。

<dependency>
   <groupId>org.redisson</groupId>
   <artifactId>redisson</artifactId>
   <version>2.1.0</version>
</dependency>

3.测试例子

 Config config = new Config();
        config.useSingleServer().setAddress("ipaddress:6379");
        Redisson redisson = Redisson.create(config);
        
        for(int i=0;i<5;i++){
        RLock lock = redisson.getLock("testLock");
        lock.lock(10, TimeUnit.SECONDS);//10s超时
        logger.info("the lock client id is client{}",i);
        Thread.sleep(1000);
        logger.info("client{} unlock",i);
        lock.unlock();
        }

4.参考

redisson

 

 

方式二: 自定义代码实现 



import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import redis.clients.jedis.Jedis;

/**
* redis实现的分布式锁
*/
public final class Lock {

private static final String LOCK = "redis:lock:%s";
private static final int EXPIRE = 20 * 60;//20分钟
private static final Logger logger = LoggerFactory.getLogger(Lock.class);

private Lock() {
}


public static Lock getLock() {
return new Lock();
}

/**
* 获得锁,超时退出
* @param id
* @param timeout 超时时间(ms)
* @return
*/
public boolean lock(String id, int timeout) {

//这里的Jedis实际上是个代理。代理类JedisCallback,JedisFactoryBean
Jedis jedisProxy = JedisProxy.create();

long lock = 0;

long start = System.currentTimeMillis();

while (lock != 1) {
long now = System.currentTimeMillis();
//判断超时
if (timeout > 0 && now > start + timeout) {
return false;
}
long timestamp = now + EXPIRE * 1000 + 1;

try {
String key = String.format(LOCK, id);
lock = jedisProxy.setnx(key, String.valueOf(timestamp));
if (lock == 1) {
logger.info("设置redis锁key成功,lock key=" + key);
jedisProxy.expire(key, EXPIRE);
logger.info("设置redis锁key过期时间成功,lock key=" + key);
} else {
String s = jedisProxy.get(key);
Long lastLockTime = Long.parseLong(s);

//一个项目部署多个服务,锁可能已经被相同定时任务的其他进程获得,则直接返回false
if (jedisProxy.ttl(key)!=-1&&lastLockTime > System.currentTimeMillis()){
logger.info("redis锁已经被其他服务获得,lock key=" + key);
return false;
}
/**
* 如果上次锁定的时间已经过期,则清除key锁,以便定时任务能够启动
* 造成未能释放的原因主要是jedis.expire(key, EXPIRE);失败
* 或者是获取锁之后,由于程序错误或网络错误,unlock未被成功调用
*/
if (jedisProxy.ttl(key)==-1||lastLockTime < System.currentTimeMillis()) {
jedisProxy.del(key);
continue;
}
// this.wait(100);
Thread.sleep(100);
}
} catch (Exception e) {
logger.error("从redis获取定时任务锁错误,key="+String.format(LOCK, id), e);
return false;
}
}
return true;
}

/**
* 释放锁
* @param id
*/
public void unLock(String id) {

//这里的Jedis实际上是个代理。代理类JedisCallback,JedisFactoryBean
Jedis jedisProxy = JedisProxy.create();
String key = String.format(LOCK, id);
jedisProxy.del(key);
}
}

JedisProxy类

/**
* Jedis代理
*/
@Component
public class JedisProxy implements ApplicationContextAware {

private static volatile ApplicationContext ac;

/**
* 创建Jedis 代理
*
* @return
*/
public static Jedis create() {
return ac.getBean(Jedis.class);
}

@Override
public void setApplicationContext(ApplicationContext applicationContext) {
if (ac != null) {
return;
}
synchronized (JedisProxy.class) {
if (ac != null) {
return;
}
ac = applicationContext;
}
}
}

 

 

 

 

 

 

转载于:https://www.cnblogs.com/wangdaijun/p/5301858.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458164.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学好Linux决心书

我叫李杨&#xff0c;经过在老男孩教育linux运维班5个月学习后&#xff0c;我一定要达到的的薪水目标是7k,为了达到此目标我将采取如下5大行动或方案&#xff1a;1.每天坚持学习7个小时2.坚持每天跑步1小时3.调整思路 严于利己4.让自己生活更加充实&#xff0c;不在浑浑噩噩5.为…

如何通俗易懂地解释欧拉公式(e^πi+1=0)?

from&#xff1a;https://www.zhihu.com/question/41134540 http://www.matongxue.com/madocs/8.html

IIS(1)

转载&#xff1a;http://blog.csdn.net/ce123 IIS音频总线学习&#xff08;一&#xff09;数字音频技术 一、声音的基本概念 声音是通过一定介质传播的连续的波。 图1 声波重要指标&#xff1a; 振幅&#xff1a;音量的大小周期&#xff1a;重复出现的时间间隔频率&#xff1a;…

手机屏幕适配原理及实现

为什么80%的码农都做不了架构师&#xff1f;>>> 手机屏幕是用户与 App 最直接的交互点 不同的分辨率下用户对我们的 App 具有明显的感观差异&#xff0c;主流分辨率的更新迭代却又完全独立于 App 进行。这让我们想要使 App 在绝大多数主流手机上都保持感观、体验的…

【数字图像处理】傅里叶变换在图像处理中的应用

from&#xff1a;https://www.cnblogs.com/tenderwx/p/5245859.html 1.理解二维傅里叶变换的定义 1.1二维傅里叶变换 二维Fourier变换: 逆变换&#xff1a; 1.2二维离散傅里叶变换 一个图像尺寸为MN的 函数的离散傅里叶变换由以下等式给出&#xff1a; 其中 和。其中变量u和…

最好的云备份选项

能够实现数据备份的方式有很多。在虚拟化技术最为兴盛的时期&#xff0c;首选方式是使用数据保护软件&#xff0c;在hypervisor层进行备份或者复制整台虚拟机&#xff0c;比如Veeam Backup以及Zerto提供的同步软件。 对于使用VMware云的IT部门来说&#xff0c;这种方式现在仍然…

求二叉树中两个节点的最远距离

问题定义如果我们把二叉树看成一个图&#xff0c;父子节点之间的连线看成是双向的&#xff0c;我们姑且定义"距离"为两节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。计算一个二叉树的最大距离有两个情况:情况A: 路径经过左子树的最深节…

halcon学习(算子汇总)

from:https://www.cnblogs.com/hanzhaoxin/archive/2013/01/09/2852213.html dev_clear_obj(Objects : : : ) 删除一个iconic对象 dev_error_var( : : ErrorVar, Mode : ) 定义或取消定义一个错误变量 dev_get_exception_data( : : Exception, Name : Value) 获取异常数据…

Bing Speech Recognition 标记

Bing Speech Services Bing Bing Speech Services provide speech capabilities for Windows and Windows Phone https://msdn.microsoft.com/en-us/library/dn303461.aspx 已失效。 转载于:https://www.cnblogs.com/zangdalei/p/5312440.html

Source Insight 4.0 最简单的破解安装

from&#xff1a;https://blog.csdn.net/biubiuibiu/article/details/78044232 三步完成Source Insight 4.0 破解安装 下载地址有更新&#xff0c;之前有朋友因潜在的版权问题封禁没下到&#xff0c;现在更新后可正常使用了。 文末有完全清除上次安装残留的方法&#xff0c;…

【原】Spark中Master源码分析(一)

Master作为集群的Manager&#xff0c;对于集群的健壮运行发挥着十分重要的作用。下面&#xff0c;我们一起了解一下Master是听从Client&#xff08;Leader&#xff09;的号召&#xff0c;如何管理好Worker的吧。 1.家当&#xff08;静态属性&#xff09; 1.设置一个守护单线程的…

XML——XML介绍和基本语法

from&#xff1a;https://blog.csdn.net/gavin_john/article/details/51511180 1.XML历史 gml(1969)->sgml(1985)->html(1993)->xml(1998) 1969 gml(通用标记语言)&#xff0c;主要目的是要在不同的机器之间进行通信的数据规范1985 sgml(标准通用标记语言)1993 htm…

Tomcat7.0安装配置

很久没有通过博客对学习所得进行记录了。 现在将使用Tomcat的一些经验和心得写到这里&#xff0c;作为记录和备忘。如果有朋友看到&#xff0c;也请不吝赐教。 首先&#xff0c;我个人使用的是apache-tomcat-7.0.27你可以下载使用&#xff0c;前提条件你需要安装JDK1.6或者1.7都…

TIFF图像文件格式详解

from&#xff1a;https://www.cnblogs.com/gywei/p/3393816.html 1 什么是TIFF&#xff1f; TIFF是Tagged Image File Format的缩写。在现在的标准中&#xff0c;只有TIFF存在&#xff0c; 其他的提法已经舍弃不用了。做为一种标记语言&#xff0c;TIFF与其他文件格式最大的不…

java 抽象工厂模式简单实例

抽象工厂模式&#xff1a;提供一个创建一系列的相关的或者依赖的对象的接口&#xff0c;无需指定它们的具体实现类&#xff0c;具体的时间分别在子类工厂中产生。 类似于工厂模式&#xff1a;隔离了具体类的生产实现&#xff0c;使得替换具体的工厂实现类很容易。包含有以下模块…

图像处理之积分图应用三(基于NCC快速相似度匹配算法)

from&#xff1a;https://blog.csdn.net/jia20003/article/details/53021614 图像处理之积分图应用三&#xff08;基于NCC快速相似度匹配算法&#xff09; 基于Normalized cross correlation(NCC)用来比较两幅图像的相似程度已经是一个常见的图像处理手段。在工业生产环节检测…

深入浅出地理解机器人手眼标定

from&#xff1a;https://blog.csdn.net/qq_16481211/article/details/79764730 所谓手眼系统&#xff0c;就是人眼镜看到一个东西的时候要让手去抓取&#xff0c;就需要大脑知道眼镜和手的坐标关系。如果把大脑比作B&#xff0c;把眼睛比作A&#xff0c;把手比作C,如果A和B的…

centos 6.5 安装 mongodb

官方给出的链接地址&#xff1a;https://docs.mongodb.org/manual/tutorial/install-mongodb-on-red-hat/ 安装后重要的日志 win10 上使用mongochef连接不上数据库 解决方案&#xff1a; 修改 /etc/mongod.conf 将bindIP 改为0.0.0.0 监听外网转载于:https://www.cnblogs.com/l…

scala学习资料

1. scala-sbt 构建工具&#xff1a; http://www.scala-sbt.org/0.13/docs/zh-cn/Directories.html 2. 资料&#xff1a; http://www.ibm.com/developerworks/cn/java/j-lo-funinscala2/ https://www.zhihu.com/question/34548588?sortcreated http://nerd-is.in/2013-09/scala…

opencv3/C++ 机器学习-SVM应用实例:药品(胶囊)识别与分类

from&#xff1a;https://blog.csdn.net/akadiao/article/details/79278072 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/akadiao/article/details/79278072 问题描述&#xff1a; 现对6种不同颜色药品&#xff08;胶囊…