redis和zk分布式锁实现

CorelDRAW 2019安装指南:从下载到激活的完整步骤 本文提供了一份详细的CorelDRAW 2019安装指南,涵盖从下载安装包、检查系统环境到完成激活的完整步骤。文章重点解析了安装过程中的关键选项设置,并分享了首次启动后的优化配置与常见问题解决方案,旨在帮助用户高效、顺利地完成这款经典矢量设计软件的安装与配置。 阅读详情

分布式锁
场景演示为什么需要分布式锁
场景:一个订单表,库存表,支付表,多个用户对库存操作。当前库存为1
public class Order {
public void createOrder(){
System.out.println(Thread.currentThread().getName()+" 创建订单");
}
}

public class Pay {
public static void pay(){
System.out.println(Thread.currentThread().getName()+" 支付成功!");
}
}
public class Stock {
private static Integer COUNT = 1;
public boolean reduceStock(){
if(COUNT > 0){
COUNT – ;
return true;
}
return false;
}
}

如图所示:

模拟了两个用户对库存只有一时,两个用户都成功减库存成功了,并且支付成功了,所有在分布式系统中,需要有分布式锁控制同一时间只有一个用户进来访问。
分布式系统:表示有多个进程提供服务,完成一件事。

public class Main {
//模拟两个用户同时抢订单
public static void main(String[] args) {
Thread user1 = new Thread(new UserThread(),“user1”);
Thread user2 = new Thread(new UserThread(),“user2”);
user1.start();
user2.start();
}
static class UserThread implements Runnable{
@Override
public void run() {
new Order().createOrder();
Boolean result = new Stock().reduceStock();
if(result){
System.out.println(Thread.currentThread().getName() + " 减库存成功");
new Pay().pay();
}else{
System.out.println(Thread.currentThread().getName()+" 减库存失败");

        }
    }
}

}

redis分布式锁实现
package com.wf.springdemo.locktest;/**

  • Created by wufei on 2018/12/10.
    */

import com.wf.springdemo.locktest.redislock.RedisLock;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**

  • @author wufei
  • @create 2018-12-10 9:12
    **/
    public class Main {
    //模拟两个用户同时抢订单
    public static void main(String[] args) {
    Thread user1 = new Thread(new UserThread(),“user1”);
    Thread user2 = new Thread(new UserThread(),“user2”);
    user1.start();
    user2.start();
    }
    //public static Lock lock = new ReentrantLock();
    public static Lock lock = new RedisLock();
    static class UserThread implements Runnable{
    @Override
    public void run() {
    new Order().createOrder();
    lock.lock();
    Boolean result = new Stock().reduceStock();
    lock.unlock();
    if(result){
    System.out.println(Thread.currentThread().getName() + " 减库存成功");
    new Pay().pay();
    }else{
    System.out.println(Thread.currentThread().getName()+" 减库存失败");
    }
    }
    }
    }

package com.wf.springdemo.locktest.redislock;/**

  • Created by wufei on 2018/12/10.
    */

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;

import java.util.Collections;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;

/**

  • @author wufei

  • @create 2018-12-10 9:30
    **/
    public class RedisLock implements Lock {
    private static String LOCK_NAME = “redis_lock”;
    private static String REQUEST_ID = “123456”;

    ThreadLocal jedis = new ThreadLocal();

    //加锁
    @Override
    public void lock() {
    init();
    if(tryLock()){//如果没有锁则加锁
    //如果某个应用节点挂了,不能释放锁了也就是不能进入unlock()方法了,这个情况怎么办呢?设置过期时间
    // jedis.set(LOCK_NAME,REQUEST_ID);
    // jedis.expire(LOCK_NAME,3000);//设置过期时间
    //但是这个时间不是原子性,执行到jedis.set方法了,但是应用挂了,没有执行jedis.expire,所有还会导致无法释放锁。
    //怎么设置原子性呢。
    jedis.get().set(LOCK_NAME,REQUEST_ID,“NX”,“PX”,3000);
    }
    }

    /**

    • 获取锁 true 没有锁,false 有锁
    • @return
      */
      @Override
      public boolean tryLock() {
      //不停的获取锁
      while (true){
      //获取锁,怎样保证原子性呢 使用setnx方法
      //key不存在返回1,存在返回0
      //String lock = jedis.get(LOCK_NAME);
      Long lock = jedis.get().setnx(LOCK_NAME,REQUEST_ID);
      if(lock ==1){
      return true;
      }
      }
      }

    /**

    • 释放锁
      */
      @Override
      public void unlock() {
      //释放自己设置的锁,
      // String value = jedis.get().get(LOCK_NAME);
      // if(REQUEST_ID.equals(value)){
      // jedis.get().del(LOCK_NAME);
      // }
      //原子性 使用lua
      // String script = “if redis.call(‘get’,KEYS[1]==ARGV[1]) then return redis.call(‘del’,KEYS[1]) else return 0 end”;
      // jedis.get().eval(script, Collections.singletonList(LOCK_NAME),Collections.singletonList(REQUEST_ID));

      //lua script
      String script = “if redis.call(‘get’, KEYS[1]) == ARGV[1] then return redis.call(‘del’, KEYS[1]) else return 0 end”;
      Object result = jedis.get().eval(script, Collections.singletonList(LOCK_NAME), Collections.singletonList(REQUEST_ID));

    }

    private void init(){
    if(jedis.get() == null){
    jedis.set(new Jedis(“localhost”));
    }
    }

    @Override
    public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
    return false;
    }
    @Override
    public void lockInterruptibly() throws InterruptedException {

    }

    @Override
    public Condition newCondition() {
    return null;
    }
    }

zk分布式锁实现

5-EP4CE10F17C8-引脚配置 EP4CE10F17C8-引脚配置 阅读详情

相关推荐

从412到200:一步步拆解瑞数6代jsvmp的cookie生成与验证流程

本文深入解析瑞数6代JSVMP的动态安全防护机制,详细拆解从412到200状态的cookie生成与验证流程。通过剖析JSVMP虚拟机核心机制、动态元数据解析及环境检测绕过策略,为逆向工程师提供实用的技术解决方案,帮助突破瑞数6代的高级防御体系。

weixin_30342209的博客 509

基于Zookeeper实现分布式锁

在Zookeeper中的指定路径下创建创建节点,然后客户端根据当前路径下的节点状态来判断是否加锁成功,如下图一种情况为例,线程1创建节点成功后,线程2再去创建节点就会创建失败。(3)如果加锁次数等于0,则释放锁,删除掉创建的临时节点,下一个监听这个节点的客户端会感知到节点删除事件,从而重新去获取锁。3:判断自己的序号是否最小,如果最小的话,代表加锁成功,如果不是最小的话,就对前一个节点创建监听器。2:使用顺序节点的好处是,可以利用锁释放的事件监听机制,来实现。2:第二步客户端拿到加锁路径下所有创建的节点。

weixin_45125989的博客 2915

XVF3800麦克风阵列实战:从选型到快速原型搭建

本文详细介绍了XVF3800麦克风阵列的选型与快速原型搭建实战经验。从开箱即用的特性到波束成形、回声消除等核心功能拆解,再到硬件设计避坑指南和固件开发技巧,帮助开发者高效实现智能语音设备的开发。特别适合智能音箱、会议终端等需要远场拾音和声源定位的应用场景。

weixin_29161719的博客 274

ZK(ZooKeeper)分布式锁实现

服务注册与订阅(共用节点)分布式通知(监听ZNode)服务命令(ZNode特性)数据订阅、发布(Watcher)分布式锁(临时节点)所有试图来获取当前锁的客户端,最终有且只有一个能够成功得到当前锁的钥匙,通常我们会把ZooKeeper上的节点(ZNode)看做一把锁,通过create临时节点的方式来实现,当多个客户端都去创建一把锁的时候,那么只有成功创建了那个客户端才能拥有这把锁/testLock。

2501_90251017的博客 1531

OGG故障指南:OGG-01163 Bad column length (xxx) specified for column

OGG-01163 Bad column length (xxx) specified for column AAA in table OWNER.TABLE, maximum allowable length is yyy

qqqyyy0422的博客 718

【四足机器人项目实战】MIT四足机器人力控电机优劣分析及解决办法

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、mit力控电机方案二、弊端三、优点四、解决办法设计相关看专栏其他博客 前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对XXX做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章 提示:以下是本篇文章正文内容 一、mit力控电机方案 MITCheetahMini驱动器采用的电机是类似于公版电机T-MotorU8的型号

qq_35635374的博客 6092

ZK和Redis两种分布式锁对比

Redis分布式锁 1. setnx + lua脚本 优点:redis基于内存,读写性能很高,因此基于redis的分布式锁效率比较高 缺点:分布式环境下可能会有节点数据同步问题,可靠性有一定的影响。比如现在有一个3主3丛的Redis集群, 客户端发生的命令写入了机器1的master 节点,数据正准备主丛同步的时候,master 结点挂了,slave 结点没有接收到最新的数据,此时 slave结点竞选为master, 导致之前加的分布式锁失效。 2. Redission 优点:解决了Redis集

summer_fish的专栏 2211

【华为OD机试真题】458、堆内存申请 | 机试真题+思路参考+代码解析(CD卷)(C++、Java、Py)

题目描述 >有一个总空间为100字节的堆,现要从中新申请一块内存,内存分配原则为优先紧接着前一块已使用内存分配空间足够且最接近申请大小的空闲内存。

KJ.JK 1万+

使用 redis 如何设计分布式锁?说一下实现思路?使用 zk 可以吗?如何实现?这两种有什么区别?

redis: 线程 A setnx(上锁的对象,超时时的时间戳 t1),如果返回 true,获得锁。 .线程 B 用 get 获取 t1,与当前时间戳比较,判断是是否超时,没超时 false,若超时执行第 3 步; 计算新的超时时间 t2,使用 getset 命令返回 t3(该值可能其他线程已经修改过),如果 t1==t3,获得锁,如果 t1!=t3 说明锁被其他线程获取了。 获取锁后,处理完业务逻辑,再去判断锁是否超时,如果没超时删除锁,如果已超时, 不用处理(防止删.

qq_20920119的博客 373

ADS基础教程20 - 电磁仿真(EM)参数化仿真

一、引言二、参数化设置1.参数定义2.参数赋值3.创建EM模型和符号四、总结1)在Layout视图,菜单栏中选中EMComponent2)在弹出的参数编辑框中,采用标称/扰动()设计。使用子网(Subnetwork)参数。这些方法是互斥的,在为单个组件定义参数时不能将它们组合起来。标称/扰动(Nominal/Perturbed)参数使用平面化布局场景,并且只包含端口和原始图形形状(如多边形、矩形和圆形)时定义。

XZ_ZC的博客 4032

基于OpenCV实现暗通道先验去雾算法及改进,效果惊人

深度技术文,前方高能

公号:一条coding 2万+

redis和zk实现分布式锁

分布式锁在分布式系统中使用的场景比较多,今天简述下redis和zk实现分布式锁的方式 以下分别冲分布式锁需要考虑的几个问题分析下 互斥(同一时间只能有一方获取锁) 不能死锁 容错 redis 实现分布式锁 setnx 在 redis 里使用SET key value [EX seconds] [PX milliseconds] NX创建一个 key,这样就算加锁。setnx只有k...

290

YOLOv5/v7/v8/v9/v10/v11/v12/13目标检测结果解析,超w字精读,IoU、GIoU、DIoU、CIoU、EIoU详细解释,精确率、召回率、AP、mAP与P-R 曲线图深度解析

YOLOv5/v7/v8/v9/v10/v11/v12/13目标检测结果解析,超w字精读,IoU、GIoU、DIoU、CIoU、EIoU详细解释,精确率、召回率、AP、mAP与P-R 曲线图深度解析

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1417

redis和zk实现分布式锁的优缺点

redis和zk实现分布式锁的优缺点

大道至简 2284

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

一般实现分布式锁都有哪些方式?使用 Redis 如何设计分布式锁?使用 zk 来设计分布式锁可以吗?这两种分布式锁的实现方式哪种效率比较高?

一般实现分布式锁都有哪些方式?使用 Redis 如何设计分布式锁?使用 zk 来设计分布式锁可以吗?这两种分布式锁的实现方式哪种效率比较高?

weixin_55682785的博客 1351

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

一般实现分布式锁都有哪些方式?使用 redis 如何设计分 布式锁?使用 zk 来设计分布式锁可以吗?这两种分布式锁的 实现方式哪种效率比较高?

分布式系统开发中,分布式锁的使用场景还是很常见的 基于redis实现分布式锁 最简单的方式,直接redissetnx 命令创建一个 key,这样就算加锁 执行命令:SET key value NX PX 10000 NX:表示只有 key 不存在的时候才会设置成功。(redis 中存在这个 key,那么设置失 败,返回 nil) PX 10000:意思是 10s 后锁自动释放。并发的时候发现创建锁已经存在,就不能加锁 释放锁就是删除 key ,但是一般可以用 lu...

zhaosensenyy的博客 273

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

分布式锁:redis分布锁多种实现方案的问题与解决方案 及 redis与zk分布式锁的对比

结论前置 a. redis分布式锁并不可靠,但是性能高。 ⅰ. 本质上是因为其追求高性能而牺牲了可靠性 ⅱ. 应用CAP原理解释就是redis是一个AP系统,强调了高可用性而牺牲一部分一致性,导致了redis分布式锁不可靠 b. 追求可靠性应使用zk分布式锁,但是性能不如redis。 redis分布式锁的各种实现方案及优缺点分析 a. 自己实现redis分布式锁 ⅰ. 加锁 只用key加锁。问题:A加的锁,B能解。所以需要key value一起加锁,解锁时判断value是不是自己 先get,若不存在,再s.

aajjw的博客 357

.net下 本地锁、redis分布式锁、zk分布式锁的实现

2018年08月21日 19:02:25生活常识阅读数 170 版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.youkuaiyun.com/qq3401247010/article/details/81912829 为什么要用锁?   大型站点在高并发的情况下,为了保持数据最终一致性就需要用到技术...

cxu123321的博客 155

分布式锁实现方式一般实现分布式锁都有哪些方式?使用 redis 如何设计分布式锁?使用 zk 来设计分布式锁可以吗?这两种分布式锁的实现方式哪种效率比较高?

redis 分布式锁 官方叫做 RedLock 算法,是 redis 官方支持的分布式锁算法。 这个分布式锁有 3 个重要的考量点: 互斥(只能有一个客户端获取锁) 不能死锁 容错(只要大部分 redis 节点创建了这把锁就可以) redis 最普通的分布式锁 第一个最普通的实现方式,就是在 redis 里使用 setnx 命令创建一个 key,这样就算加锁。 SET resource_name my_random_value NX PX 30000 执行这个...

liuerchong的博客 316

注解实现给方法加zk分布式锁或redis分布式锁

/ 锁类型枚举:ZK 或 RedisZK, REDIS// 通用分布式锁注解/*** 锁路径(支持 SpEL 表达式,如 "/lock/stock/#{#productId}")*//*** 锁类型:ZK 或 REDIS*//*** 获取锁的超时时间(默认 30 秒)*//*** 时间单位(默认秒)*//*** 获取锁失败的提示信息*/String failMessage() default "获取分布式锁失败,请稍后重试";

389

分布式锁的多种实现方式(Redis-ZK)

在分布式系统中,协调多个节点对共享资源的访问是一个常见挑战,而分布式锁是解决这一问题的核心工具之一。Redis和ZooKeeper(ZK)作为两种主流实现方案,各自凭借独特的机制满足了高并发、高可用的需求。ZK的写性能受集群规模影响,通常低于Redis,但其强一致性更适合长事务场景,如金融系统的分布式事务协调。ZK需要独立的集群维护,对网络分区敏感。从长期运维看,ZK的稳定性更高,但Redis的生态工具更丰富,社区支持也更广泛。总结来说,Redis适合追求极致性能的场景,而ZK在强一致性系统中更具优势。

oomdrk_808的博客 198

redis以及zk分布式锁的实现

文章目录redis分布式锁zk分布式锁pom中添加依赖properties添加配置信息代码中增加连接信息锁的代码实现测试代码 redis分布式锁 /** * @author yujianjian 2019-08-28 17:28 * redis分布式锁实现 */ @Slf4j @Service public class RedisLock { @Autowired pri...

asdliman0110的博客 300

分布式锁两种实现-redis、zk

分布式锁两种实现-redis、zk 不过目前互联网项目越来越多的项目采用集群部署,也就是分布式情况,这两种锁就有些不够用了。 来两张图举例说明下,本地锁的情况下: 分布式锁情况下: 就其思想来说,就是一种“我全都要”的思想,所有服务都到一个统一的地方来取锁,只有取到锁的才能继续执行下去。 说完思想,下面来说一下具体的实现。 Redis 实现 为实现分布式锁,在 Redis 中存在 SETNX key value 命令,意为 set if not exists(如果不存在该 key,才去 set 值),

小熊的博客 255

Redis和ZK实现分布式锁

一、Redis实现分布式锁 1、使用Redis分布式锁的原因:Redis性能好;命令支持比较好,实现方便。 2、实现方式:直接用int setnx写key,如果成功了,说明获取锁成功,否则拿锁失败。拿锁成功之后对key设置超时时间,操作完成时可通过del key释放锁。 二、Zookeeper实现分布式锁 1、通过创建zk的znode节点进行控制。检查zookeepe...

放羊的大飞 375

17、Redis、Zk分布式锁实现原理

我们在编程有很多场景使用本地锁和分布式锁,但是是否考虑这些锁的原理是什么?本篇讨论下实现分布式锁的常见办法及他们实现原理。

爱欧米 941

redis、redisson、zk、curator实现分布式锁

Redis解决分布式锁 加锁 setNX()上锁+expire锁过期 setnx 不存在才会设置成功,否则失败 expire key的过期时间 解锁 eval()+lua脚本 根据redis eval函数解析lua脚本的特性 实现 pom <parent> <groupId>org.springframework.boot...

专注Java领域与微服务架构,热爱人工智能与深度学习 1295
上一篇: Hadoop HDFS JAVA API 实战
下一篇: IDE快捷键常用
wflovejava
博客等级 码龄11年 23粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值