使用失效的方式实现分布式锁(推荐)


  1. import redis.clients.jedis.Jedis;
  2. /**
  3. * 使用redis实现分布式锁(推荐)
  4. *
  5. */
  6. public class JedLock {
  7. private static final String LOCK_KEY = "jedis_lock";
  8. private static final int RETRY_TIME = 10 * 1000; //等待锁的时间
  9. private static final int EXPIRE_TIME = 60 * 1000;//锁超时的时间
  10. private boolean locked;
  11. private long lockValue;
  12. public synchronized boolean lock(Jedis jedis){
  13. int retryTime = RETRY_TIME;
  14. try {
  15. while (retryTime > 0) {
  16. lockValue = System.nanoTime();
  17. if ("OK".equalsIgnoreCase(jedis.set(LOCK_KEY, String.valueOf(lockValue), "NX", "PX", EXPIRE_TIME))) {
  18. locked = true;
  19. return locked;
  20. }
  21. retryTime -= 100;
  22. Thread.sleep(100);
  23. }
  24. } catch (Exception e) {
  25. e.printStackTrace();
  26. }
  27. return false;
  28. }
  29. public synchronized void unlock(Jedis jedis){
  30. if(locked) {
  31. String currLockVal = jedis.get(LOCK_KEY);
  32. if(currLockVal!=null && Long.valueOf(currLockVal) == lockValue){
  33. jedis.del(LOCK_KEY);
  34. locked = false;
  35. }
  36. }
  37. }
  38. public static void main(String[] args) throws InterruptedException {
  39. Jedis jedis = new Jedis("192.168.75.129", 6379);
  40. JedLock redLock = new JedLock();
  41. if(redLock.lock(jedis)) {
  42. System.out.println(Thread.currentThread().getName() + ": 获得锁!");
  43. Thread.sleep(25000);
  44. System.out.println(Thread.currentThread().getName() + ": 处理完成!");
  45. redLock.unlock(jedis);
  46. System.out.println(Thread.currentThread().getName() + ": 释放锁!");
  47. }else {
  48. System.out.println("get lock fail!!!");
  49. }
  50. }
  51. }

判断锁超时的方式实现分布式锁


  1. import redis.clients.jedis.Jedis;
  2. /**
  3. * 使用redis实现分布式锁
  4. *
  5. */
  6. public class RedLock {
  7. private static final String LOCK_KEY = "redis_lock";
  8. private static final int RETRY_TIME = 10 * 1000; //等待锁的时间
  9. private static final int EXPIRE_TIME = 60 * 1000;//锁超时的时间
  10. private boolean locked;
  11. private long lockValue;
  12. public synchronized boolean lock(Jedis jedis){
  13. int retryTime = RETRY_TIME;
  14. try {
  15. while (retryTime > 0) {
  16. lockValue = System.currentTimeMillis() + EXPIRE_TIME + 1;//锁到期时间
  17. String lockValueStr = String.valueOf(lockValue);
  18. //判断能否获取锁
  19. if (jedis.setnx(LOCK_KEY, lockValueStr) == 1) {
  20. //成功获取锁
  21. locked = true;
  22. return locked;
  23. }
  24. String currLockVal = jedis.get(LOCK_KEY);
  25. // 判断锁是否已经失效
  26. if (currLockVal != null && Long.valueOf(currLockVal) < System.currentTimeMillis()) {
  27. //锁已经失效,使用命令getset设置最新的过期时间
  28. String oldLockVal = jedis.getSet(LOCK_KEY, lockValueStr);
  29. //判断锁是否已经被抢占
  30. if (oldLockVal != null && oldLockVal.equals(currLockVal)) {
  31. locked = true;
  32. return locked;
  33. }
  34. }
  35. retryTime -= 100;
  36. Thread.sleep(100);
  37. }
  38. }catch (Exception e){
  39. e.printStackTrace();
  40. }
  41. return false;
  42. }
  43. public synchronized void unlock(Jedis jedis){
  44. if(locked) {
  45. String currLockVal = jedis.get(LOCK_KEY);
  46. if(currLockVal != null && Long.valueOf(currLockVal) == lockValue) {
  47. jedis.del(LOCK_KEY);
  48. locked = false;
  49. }
  50. }
  51. }
  52. public static void main(String[] args) throws InterruptedException {
  53. Jedis jedis = new Jedis("192.168.75.129", 6379);
  54. RedLock redLock = new RedLock();
  55. if(redLock.lock(jedis)) {
  56. System.out.println(Thread.currentThread().getName() + ": 获得锁!");
  57. Thread.sleep(150000);
  58. System.out.println(Thread.currentThread().getName() + ": 处理完成!");
  59. redLock.unlock(jedis);
  60. System.out.println(Thread.currentThread().getName() + ": 释放锁!");
  61. }else {
  62. System.out.println("get lock fail!!!");
  63. }
  64. }
  65. }

分布式锁的几种实现方法:redis实现分布式锁的更多相关文章

  1. Java分布式锁的三种实现方案(redis)

    方案一:数据库乐观锁 乐观锁通常实现基于数据版本(version)的记录机制实现的,比如有一张红包表(t_bonus),有一个字段(left_count)记录礼物的剩余个数,用户每领取一个奖品,对应的 ...

  2. Redis之分布式锁

    目录 一.加锁原因 二.原子操作 三.分布式锁 四.分布式锁常见问题 一.加锁原因 在一些比较高并发的业务场景,经常听到通过加锁的方法实现线程安全. 下面简单介绍一下 1.1 加锁方式 数据库锁 数据 ...

  3. SpringBoot电商项目实战 — Redis实现分布式锁

    最近有小伙伴发消息说,在Springboot系列文第二篇,zookeeper是不是漏掉了?关于这个问题,其实我在写第二篇的时候已经考虑过,但基于本次系列文章是实战练习,在项目里你能看到Zookeepe ...

  4. Redis 中的原子操作(3)-使用Redis实现分布式锁

    Redis 中的分布式锁如何使用 分布式锁的使用场景 使用 Redis 来实现分布式锁 使用 set key value px milliseconds nx 实现 SETNX+Lua 实现 使用 R ...

  5. 聊聊如何用 Redis 实现分布式锁?

    作者:小林coding 计算机八股文网站:https://xiaolincoding.com 哈喽,我是小林. 今天跟大家聊聊两个问题: 如何用 Redis 实现分布式锁? Redis 是如何解决集群 ...

  6. 基于redis 实现分布式锁的方案

    在电商项目中,经常有秒杀这样的活动促销,在并发访问下,很容易出现上述问题.如果在库存操作上,加锁就可以避免库存卖超的问题.分布式锁使分布式系统之间同步访问共享资源的一种方式 基于redis实现分布式锁 ...

  7. asp.net core mvc基于Redis实现分布式锁,C# WebApi接口防止高并发重复请求,分布式锁的接口幂等性实现

    使用背景:在使用app或者pc网页时,可能由于网络原因,api接口可能被前端调用一个接口重复2次的情况,但是请求内容是一样的.这样在同一个短暂的时间内,就会有两个相同请求,而程序只希望处理第一个请求, ...

  8. 程序员修神之路--redis做分布式锁可能不那么简单

    菜菜哥,复联四上映了,要不要一起去看看? 又想骗我电影票,对不对? 呵呵,想去看了叫我呀 看来你工作不饱和呀 哪有,这两天我刚基于redis写了一个分布式锁,很简单 不管你基于什么做分布式锁,你觉得很 ...

  9. nginx+iis+redis+Task.MainForm构建分布式架构 之 (redis存储分布式共享的session及共享session运作流程)

    本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,上一篇分享文章制作是在windows上使用的nginx,一般正式发布的时候是在linux来配 ...

随机推荐

  1. 「JOI 2019 Final」 硬币收藏

    题目链接 戳我 \(Solution\) 先将所有棋子移动到最近的目标点上 我们设两个变量\(ans1,ans2\)表示到目前为止这个点上可以移动棋子的数目,然后\(f[i][j]\)表示\((i,j ...

  2. beta week 2/2 Scrum立会报告+燃尽图 05

    此作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/9957 一.小组情况 组长:贺敬文组员:彭思雨 王志文 位军营 徐丽君队名: ...

  3. Ubuntu下qt5使用vlc

      一:Ubuntu下在线安装qt5,同时安装了qt creator 二:打开终端执行sudo apt-get install libvlc5 libvlc-dev libvlccore-dev 安装 ...

  4. -webkit-scrollbar 的使用,滚动条的隐藏

    滚动条的隐藏 -webkit-scrollbar 是一个伪类选择器 设置滚动条的样式 例如滚动条的隐藏 元素::-webkit-scrollbar{ width:0; }

  5. Java-内存模型 final 和 volatile 的内存语义

    前提:内存屏障 内存屏障(Memory Barrier)与内存栅栏(Memory Fence)是同一个概念. 用于阻止指令重排序.保证了特定操作的执行顺序和某些变量的内存可见性. JMM 内存屏障分为 ...

  6. html5-meta标签和搜索引擎

    emta标签的组成: meta标签分两大部分:HTTP-EQUIV  和  NAME  变量. HTTP-EQUIV:HTTP-EQUIV类似于HTTP的头部协议,它回应给浏览器一些有用的信息,以帮助 ...

  7. cad二次开发中DBText对象的外框GeometricExtents有问题?

    CAD2007版本 acDoc.Editor.WriteMessage( string.Format("[{0:F1},{1:F1},{2:F1}] - [{3:F1},{4:F1},{5: ...

  8. [go]unsafe.Sizeof浅析

    sizeof 如果x为一个切片,sizeof返回的大小是切片的描述符,而不是切片所指向的内存的大小. 那么这里如果换成一个数组呢?而不是一个切片 arr := [...]int{1,2,3,4,5} ...

  9. mpVue学习笔记整理

    第一章: mpVue(Vue in Mini Program) 1.1 简介 美团工程师推出的基于Vue.js封装的用于开发小程序的框架 融合了原生小程序和Vue.js的特点 可完全组件化开发 1.2 ...

  10. Android开发 移动端适配

    1 UI自适应(UGUI) UI自适应又分为锚点自适应和缩放.锚点主要控制UI控件在父控件之中的位置,同时也能影响缩放. 锚点自适应缩放: 我们使用UGUI创建一个界面,设计使用1920x1080分辨 ...