public interface RedisDistributionLock { /** * 加锁成功,返回加锁时间 * @param lockKey * @param threadName * @return */ public long lock(String lockKey, String threadName); /** * 解锁, 需要更新加锁时间,判断是否有权限 * @param lockKey * @param lockValue * @param threadName */ pu…
使用方式 try { if(PublicLock.getLock(lockKey)){ //这里写代码逻辑,执行完后需要释放锁 PublicLock.freeLock(lockKey); } } catch (Exception e) { //产生异常也需要释放锁 PublicLock.freeLock(lockKey); LOGGER.error(e); } redis的分布式锁工具类的基础类 package com.qlchat.redis.cache; import java.util.*…
1.引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.redisson&…
/** * 基于redis的分布式锁工具 * * @author yuyufeng * */ public class LockUtil { // 获取redis static JedisPool jedisPool; static { JedisPoolConfig config = new JedisPoolConfig(); config.setMaxTotal(100); config.setMaxIdle(5); config.setMaxWaitMillis(1000); confi…
目录 (1)需要导入的包 (2)JedisUtil类 (3)jedisPool配置 (4)使用举例 (1)需要导入的包 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.8.0</version> </dependency> (2)JedisUtil类 import redis.clie…
1.分布式锁介绍 在计算机系统中,锁作为一种控制并发的机制无处不在. 单机环境下,操作系统能够在进程或线程之间通过本地的锁来控制并发程序的行为.而在如今的大型复杂系统中,通常采用的是分布式架构提供服务. 分布式环境下,基于本地单机的锁无法控制分布式系统中分开部署客户端的并发行为,此时分布式锁就应运而生了. 一个可靠的分布式锁应该具备以下特性: 1.互斥性:作为锁,需要保证任何时刻只能有一个客户端(用户)持有锁 2.可重入: 同一个客户端在获得锁后,可以再次进行加锁 3.高可用:获取锁和释放锁的效…
原文:https://my.oschina.net/wangnian/blog/668830 前言:分布式环境有很多问题,比如你前一个请求访问的是服务器A,第二个请求访问到了服务器B,就会发生并发重复插入问题,这个时候需要依赖单点来实现分布锁,而redis就是. 先导入maven依赖  redission <dependency>     <groupId>org.redisson</groupId>     <artifactId>redisson<…
​ 前言:在分布式环境中,我们经常使用锁来进行并发控制,锁可分为乐观锁和悲观锁,基于数据库版本戳的实现是乐观锁,基于redis或zookeeper的实现可认为是悲观锁了.乐观锁和悲观锁最根本的区别在于线程之间是否相互阻塞. 那么,本文主要来讨论基于redis的分布式锁算法问题. 从2.6.12版本开始,redis为SET命令增加了一系列选项(set [key] NX/XX EX/PX [expiration]): EX seconds – 设置键key的过期时间,单位时秒 PX millisec…
“分布式锁”是用来解决分布式应用中“并发冲突”的一种常用手段,实现方式一般有基于zookeeper及基于redis二种.具体到业务场景中,我们要考虑二种情况: 一.抢不到锁的请求,允许丢弃(即:忽略) 比如:一些不是很重要的场景,比如“监控数据持续上报”,某一篇文章的“已读/未读”标识位更新,对于同一个id,如果并发的请求同时到达,只要有一个请求处理成功,就算成功. 用活动图表示如下: 二.并发请求,不论哪一条都必须要处理的场景(即:不允许丢数据) 比如:一个订单,客户正在前台修改地址,管理员在…
一.锁的作用 当多线程执行某一业务时(特别是对数据的更新.新增)等操作,可能就会出现多个线程对同一条数据进行修改.其最终的结果一定与你期望的结果“不太一样”,这就与需要一把锁来控制线程排排队了 - java内部为我们提供了解决方案,可以使用synchronized或Lock等方式来实现. 但是在生产过程中,因为性能的关系,多数公司都会采用多台服务器来搭建”分布式”.一条请求过来之后,不一定会打到哪台服务器上,这就保证不了多台服务器的某一”关键业务”同一时间只会有一条线程进行执行.这时就需要一个“…