202205-07 Redis如何实现分布式锁 目录一、前言二、正文今天我们来聊一聊分布式锁的那些事。相信大家对锁已经不陌生了,我们在多线程环境中,如果需要对同一个资源进行操作,为了避免数据不一致,我们需要在操作共享资源之前进行加锁操作。在计算机科学中,锁(lock)或互斥(mutex)是一种同步机制,用于在有许多执行线程的环境中强制对资源的访问限制。比如你去相亲,发现你和一大哥同时和一个女的相亲,那怎么行呢...,搞不好还要被揍一顿。那什么是分布式锁呢。当多... 继续阅读 >
202201-12 Redisson实现Redis分布式锁的几种方式 目录Redis几种架构普通分布式锁单机模式哨兵模式集群模式总结Redlock分布式锁实现原理问题合集前几天发的一篇文章《Redlock:Redis分布式锁最牛逼的实现》,引起了一些同学的讨论,也有一些同学提出了一些疑问,这是好事儿。本文在讲解如何使用Redisson实现Redis普通分布式锁,以及Redlock算法分布式锁的几种方式的同时,也附带解答这些同学的一些疑问。Redis几种架构Redis发展到现在,几种常见的部署架构有:单机模式;主... 继续阅读 >
202201-06 C#实现Redis的分布式锁 目录Redis实现分布式锁(悲观锁/乐观锁)Redis连接池使用Redis的SetNX命令实现加锁,调用方式Redis实现分布式锁(悲观锁/乐观锁)对锁的概念和应用场景在此就不阐述了,网上搜索有很多解释,只是我搜索到的使用C#利用Redis的SetNX命令实现的锁虽然能用,但是都不太适合我需要的场景。Redis有三个最基本属性来保证分布式锁的有效实现:安全性:互斥,在任何时候,只有一个客户端能持有锁。活跃性A:没有死锁,即使客户端在... 继续阅读 >
202112-13 java基于mongodb实现分布式锁的示例代码 目录原理实现使用 原理通过线程安全findAndModify实现锁实现定义锁存储对象:/***mongodb分布式锁*/@Data@NoArgsConstructor@AllArgsConstructor@Document(collection="distributed-lock-doc")publicclassLockDocument{@IdprivateStringid;privatelongexpireAt;privateStringtoken;}定义LockAPI:publicinterfaceLockService{Stringacquire(Stringkey,longexpiration)... 继续阅读 >
202110-01 分析ZooKeeper分布式锁的实现 目录一、分布式锁方案比较二、ZooKeeper实现分布式锁2.1、方案一2.2、方案二一、分布式锁方案比较方案实现思路优点缺点利用MySQL的实现方案利用数据库自身提供的锁机制实现,要求数据库支持行级锁实现简单性能差,无法适应高并发场景;容易出现死锁的情况;无法优雅的实现阻塞式锁... 继续阅读 >
202109-22 Go 语言下基于Redis分布式锁的实现方式 分布式锁一般有三种实现方式:1.数据库乐观锁;2.基于Redis的分布式锁;3.基于ZooKeeper的分布式锁。本篇博客将介绍第二种方式,基于Redis实现分布式锁。虽然网上已经有各种介绍Redis分布式锁实现的博客,然而他们的实现却有着各种各样的问题,为了避免误人子弟,本篇博客将详细介绍如何正确地实现Redis分布式锁。项目地址:https://github.com/Spongecaptain/redisLock1.Go原生的互斥锁Go原生的互斥锁即sync包下的Mutex... 继续阅读 >
202109-09 redis分布式锁RedissonLock的实现细节解析 redis分布式锁RedissonLock简单使用Stringkey="key-lock";RLocklock=redisson.getLock(key);lock.lock();try{//TODO}catch(Exceptione){log.error(e.getMessage(),e);}finally{lock.unlock();}Stringkey="key-tryLock";longmaxWaitTime=3_000;RLocklock=redisson.getLock(key);if(lock.tryLock(maxWaitTime,TimeUnit.MILLISECONDS)){try{//TODO}catch(Exceptione){... 继续阅读 >
202108-10 详解基于redis实现分布式锁 目录前言原理剖析实现编写注解拦截器拦截上述提及工具问题分析前言为了保证一个在高并发存场景下只能被同一个线程操作,java并发处理提供ReentrantLock或Synchronized进行互斥控制。但是这仅仅对单机环境有效。我们实现分布式锁大概通过三种方式。redis实现分布式锁数据库实现分布式锁zk实现分布式锁原理剖析上述三种分布式锁都是通过各自为依据对各个请求进行上锁,解锁从而控制放行还是拒绝。redis锁是基于其提供的s... 继续阅读 >
202107-09 分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了 在分布式的应用中,为了防止单点故障,保障高可用,通常会采用主从结构,当主节点挂掉后,从节点可以代替主节点提供服务。Redis通过复制+sentinel哨兵来实现主从模式。Zookeeper通过replicatedmode复制模式来实现主从模式。单从结构上看,Redis和Zookeeper都是主从架构,那Zookeeper的优势是什么?为什么要选择Zookeeper?难道只是因为Zookeeper是目录结构,Redis是K-V结构吗?同步机制的不同RedisRedis在给从节点同步数据时,... 继续阅读 >
202107-01 Java基于redis实现分布式锁 目录原理剖析实现编写注解拦截器拦截上述提及工具问题分析业务处理时间>上锁过期时间为了保证一个在高并发存场景下只能被同一个线程操作,java并发处理提供ReentrantLock或Synchronized进行互斥控制。但是这仅仅对单机环境有效。我们实现分布式锁大概通过三种方式。redis实现分布式锁数据库实现分布式锁zk实现分布式锁实际上这三种和java对比看属于一类。都是属于程序外部锁。原理剖析上述三种分布式锁都是通过各自为... 继续阅读 >
202103-30 详解Redis 分布式锁遇到的序列化问题 场景描述最近使用Redis遇到了一个类似分布式锁的场景,跟Redis实现分布式锁类比一下,就是释放锁失败,也就是缓存删不掉。又踩了一个Redis的坑……这是什么个情况、又是怎样排查的呢?本文主要对此做个复盘。问题排查既然是释放锁有问题,那就先看看释放锁的代码吧。释放锁释放锁使用了Lua脚本,代码逻辑和Lua脚本如下:释放锁示例代码publicObjectrelease(Stringkey,Stringvalue){ObjectexistedValue=stringR... 继续阅读 >
202103-29 详解RedisTemplate下Redis分布式锁引发的系列问题 自己的项目因为会一直抓取某些信息,但是本地会和线上经常一起跑,造成冲突。这其实就是我们常说的分布式集群的问题了,本地和线上的服务器构成了集群以及QPS为2的小并发(其实也不叫并发,不知道拿什么词形容?)。 首先,分布式集群的问题大家都知道,会造成数据库的插入重复问题,会造成一系列的并发性问题。 解决的方式呢也大概如下几点,百度以及谷歌... 继续阅读 >
202101-26 利用redis实现分布式锁,快速解决高并发时的线程安全问题 实际工作中,经常会遇到多线程并发时的类似抢购的功能,本篇描述一个简单的redis分布式锁实现的多线程抢票功能。直接上代码。首先按照?T例,给出一个错误的示范:我们可以看看,当20个线程一起来抢10张票的时候,会发生什么事。packagecom.tiger.utils;publicclassTestMutilThread{//总票量publicstaticintcount=10;publicstaticvoidmain(String[]args){statrtMulti();}publicstaticvoidstatrtMulti(... 继续阅读 >
202101-24 SpringBoot集成redis实现分布式锁的示例代码 1、准备使用redis实现分布式锁,需要用的setnx(),所以需要集成Jedis需要引入jar,jar最好和redis的jar版本对应上,不然会出现版本冲突,使用的时候会报异常redis.clients.jedis.Jedis.set(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;我使用的redis版本是2.3.0,Jedis使用的是3.3.0<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactI... 继续阅读 >
202101-08 mysql居然还能实现分布式锁的方法 前言之前的文章中通过电商场景中秒杀的例子和大家分享了单体架构中锁的使用方式,但是现在很多应用系统都是相当庞大的,很多应用系统都是微服务的架构体系,那么在这种跨jvm的场景下,我们又该如何去解决并发。单体应用锁的局限性在进入实战之前简单和大家粗略聊一下互联网系统中的架构演进。在互联网系统发展之初,消耗资源比较小,用户量也比较小,我们只部署一个tomcat应用就可以满足需求。一个tomcat我们可以看做是一个jvm的进... 继续阅读 >
202011-29 基于springboot实现redis分布式锁的方法 在公司的项目中用到了分布式锁,但只会用却不明白其中的规则所以写一篇文章来记录使用场景:交易服务,使用redis分布式锁,防止重复提交订单,出现超卖问题分布式锁的实现方式基于数据库乐观锁/悲观锁Redis分布式锁(本文)Zookeeper分布式锁redis是如何实现加锁的?在redis中,有一条命令,实现锁SETNXkeyvalue该命令的作用是将key的值设为value,当且仅当key不存在。若给定的key已经存在,则SETNX不做任何动作... 继续阅读 >