分布式锁的实现(java)
当对接第三方接口时,往往会碰到同一时间发送了大量相同的请求,这个时候或许就是第三方发送接口的失误了。而我们需要做的就是针对这个情况来强化我们的系统。这个时候就需要用到分布式锁。让这些请求只有一个能发送进来。
分布式锁的实现一般有三种:
- 基于数据库的乐观锁;
- 基于redis的分布式锁;
- 基于zookeeper的分布式锁。
这里我们讲的是第二种:基于redis的分布式锁的原理以及实现。

下面是代码的实现:
public class DistributeLock {
/**
* setnx(key,value):如果key-value存在,缓存成功并返回1,否则返回0.
* getset(key,value):返回旧的value,然后更新旧的value为新的value.
* expire(key,seconds):设置key的过期时间为seconds秒.
* get(key):获取key对应的value,不存在返回nil.
*/
private final static long expire = 1000; // 设置锁的过期时间
public static boolean getLockByRedis(Jedis jedis,String lock){
boolean success = false;
long flag = jedis.setnx(lock, String.valueOf(System.currentTimeMillis() + expire + 1));
// 获取分布式锁成功
if (flag == 1) {
success = true;
}else{ // 可能其他线程持有锁,也有可能是锁超时
long getVale = Long.valueOf(jedis.get(lock));
if (getVale < System.currentTimeMillis()) { //超时
String oldValue = jedis.getSet(lock,String.valueOf(System.currentTimeMillis() + expire + 1));
if (oldValue != null) {
// 被其他线程抢占
if (Long.valueOf(oldValue) == getVale) {
success = false;
}else{
success = true;
}
}
}else{
success = false;
}
}
return success;
}
/**
* 谁上锁,谁释放
* @param jedis
* @param lock
*/
public static void releaseLock(Jedis jedis,String lock) {
if (System.currentTimeMillis() < Long.valueOf(jedis.get(lock))) {
jedis.del(lock);
}
}
}
分布式锁的实现(java)的更多相关文章
- 从分布式锁角度理解Java的synchronized关键字
分布式锁 分布式锁就以zookeeper为例,zookeeper是一个分布式系统的协调器,我们将其理解为一个文件系统,可以在zookeeper服务器中创建或删除文件夹或文件.设D为一个数据系统,不具备 ...
- Java分布式锁三种实现方案
方案一:数据库乐观锁 乐观锁通常实现基于数据版本(version)的记录机制实现的,比如有一张红包表(t_bonus),有一个字段(left_count)记录礼物的剩余个数,用户每领取一个奖品,对应的 ...
- java使用zookeeper实现的分布式锁示例
java使用zookeeper实现的分布式锁示例 作者: 字体:[增加 减小] 类型:转载 时间:2014-05-07我要评论 这篇文章主要介绍了java使用zookeeper实现的分布式锁示例,需要 ...
- 如何优雅地用Redis实现分布式锁?
转: 如何优雅地用Redis实现分布式锁? BaiduSpring 01-2500:01 什么是分布式锁 在学习Java多线程编程的时候,锁是一个很重要也很基础的概念,锁可以看成是多线程情况下访问 ...
- springboot(十二)-分布式锁(redis)
什么是分布式锁? 要介绍分布式锁,首先要提到与分布式锁相对应的是线程锁.进程锁. 线程锁:主要用来给方法.代码块加锁.当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段.线程锁只在同一 ...
- Redis的“假事务”与分布式锁
关注公众号:CoderBuff,回复"redis"获取<Redis5.x入门教程>完整版PDF. <Redis5.x入门教程>目录 第一章 · 准备工作 第 ...
- Redis分布式锁 (图解-秒懂-史上最全)
文章很长,而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三 ...
- 分布式锁2 Java非常用技术方案探讨之ZooKeeper
前言: 由于在平时的工作中,线上服务器是分布式多台部署的,经常会面临解决分布式场景下数据一致性的问题,那么就要利用分布式锁来解决这些问题.以自己结合实际工作中的一些经验和网上看到的一些资料 ...
- Java分布式锁之数据库实现
之前的文章<Java分布式锁实现>中列举了分布式锁的3种实现方式,分别是基于数据库实现,基于缓存实现和基于zookeeper实现.三种实现方式各有可取之处,本篇文章就详细讲解一下Java分 ...
- Java分布式锁实现详解
在进行大型网站技术架构设计以及业务实现的过程中,多少都会遇到需要使用分布式锁的情况.那么问题也就接踵而至,哪种分布式锁更适合我们的项目? 下面就这个问题,我做了一些分析: 分布式锁现状: 目前几乎很多 ...
随机推荐
- CMutex、CCriticalSection、CSemaphore、CEvent、WaitForSingleObject 的小例子
一.CMutex CMutex mutex; mutex.Lock(); // 互斥的动作 // mutex.Unlock(); 二.CCriticalSection CCriticalSection ...
- par函数pch参数-控制点的形状
pch函数用来控制点的形状,这个参数不仅在par函数中有,在大多数的高级绘图函数中都有. 代码示例: plot(rep(1:5, times = 5), rep(5:1, each = 5), pch ...
- Project Navigator Help: Creating a Workspace in Xcode
Creating a Workspace Start a multiproduct development endeavor by creating a workspace. 1.Choose Fil ...
- Oracle查询优化-使用字符串
--1.遍历字符串 --1.1.建立测试视图 CREATE OR REPLACE VIEW V AS SELECT '天天向上' AS 汉字,'TTXS' AS 首拼 FROM DUAL; --要求每 ...
- 创建SQL语句_面试
创建一个表:create table if not exists Teachaers(tea_id integer primary key autoincrement,tea_name text,t ...
- 【PyMongo】连接10055错误的处理--windows7
http://stackoverflow.com/questions/25621893/mongodump-utility-raise-socketexception
- 公式编辑器编辑倒L符号的方法
数学公式全都是由数字字母和一些符号组成的,一些常用的字母符号我们使用起来也很熟练,但是在数学中也有一些符号是比较少用的,比如倒着的L,这个符号在一些函数中出现过,表示某一类的函数.在word公式编辑器 ...
- Visual Basic的未来之路
Green首先列出了当时使用VB进行开发的四个基础指导原则: 1.VB和C#共享的通用IDE和平台构建块. 2.共享的“多范式.面向对象.命令式.强类型等”语言 ...
- php 中的 short_open_tag 的作用
在php的配置文件(php.ini)中有一个short_open_tag的值,开启以后可以使用PHP的段标签:(<? ?>). 同时,只有开启这个才可以使用 <?= 以代替 < ...
- 如何使用CodeSmith批量生成代码(原创系列教程)
在上一篇我们已经用PowerDesigner创建好了需要的测试数据库,下面就可以开始用它完成批量代码生成的工作啦. 下面我会一步步的解释如何用CodeSmith实现预期的结果的,事先声明一下,在此只做 ...