【数据存储】【Redis】高并发下实现分布式锁

2021-08-08 22:31:04 来源:网络整理 作者:管理员

原标题:【数据存储】【Redis】高并发下实现分布式锁

【数据存储】【Redis】高并发下实现分布式锁

大部分互联网公司实现分布式锁原理

/**

* 分布式锁底层实现原理

* @return

*/

@GetMapping("distributedLock")

public Object distributedLock(){

String lockKey = "distributedLockKey";

//给每个线程都设置一个唯一标识,避免出现程序执行的时间超过设置的过期时间,导致其他线程删除了自己的锁

String clientId = UUID.randomUUID().toString();

try {

//添加过期时间保证线程运行到一半的时候,程序崩了,导致缓存中的key一直存在

Boolean result = redisTemplate.opsForValue().setIfAbsent(lockKey, clientId, 30, TimeUnit.SECONDS);

if (!result) {

return "error_code";

}

// Todo 实现业务逻辑

redisTemplate.opsForValue().set(TestConstant.KEY_TEST,String.valueOf(System.currentTimeMillis()));

} finally {

//判断是不是自己的线程删除自己的锁

if (clientId.equals(redisTemplate.opsForValue().get(lockKey))) {

redisTemplate.delete(lockKey);

}

}

//Todo 当前代码未实现锁续命功能,锁续命功能:由于程序执行时间可能超过设置缓存中锁的过期时间,导致后续一部分业务未执行,一直被其他线程抢占,需要对锁进行续命,但是由于续命的时间不好确定,这个时候就需要单独开启子线程,定时任务不断的去判断当前锁,还在不在,如果不在了,说明业务已经执行完成了,如果还在,重新设置过期时间,一般而言,定时任务的时间为缓存设置的过期时间三分之一就可以了。

return "end";

}

/**

* 分布式锁底层实现原理

* @return

*/

@GetMapping("distributedLock")

public Object distributedLock(){

String lockKey = "distributedLockKey";

//给每个线程都设置一个唯一标识,避免出现程序执行的时间超过设置的过期时间,导致其他线程删除了自己的锁

String clientId = UUID.randomUUID().toString();

try {

//添加过期时间保证线程运行到一半的时候,程序崩了,导致缓存中的key一直存在

Boolean result = redisTemplate.opsForValue().setIfAbsent(lockKey, clientId, 30, TimeUnit.SECONDS);

if (!result) {

return "error_code";

}

// Todo 实现业务逻辑

redisTemplate.opsForValue().set(TestConstant.KEY_TEST,String.valueOf(System.currentTimeMillis()));

} finally {

//判断是不是自己的线程删除自己的锁

if (clientId.equals(redisTemplate.opsForValue().get(lockKey))) {

redisTemplate.delete(lockKey);

}

}

//Todo 当前代码未实现锁续命功能,锁续命功能:由于程序执行时间可能超过设置缓存中锁的过期时间,导致后续一部分业务未执行,一直被其他线程抢占,需要对锁进行续命,但是由于续命的时间不好确定,这个时候就需要单独开启子线程,定时任务不断的去判断当前锁,还在不在,如果不在了,说明业务已经执行完成了,如果还在,重新设置过期时间,一般而言,定时任务的时间为缓存设置的过期时间三分之一就可以了。

return "end";

}

【数据存储】【Redis】高并发下实现分布式锁

基于redisson实现高并发分布式锁

引入依赖:

org.redisson

redisson

3.6.5

org.redisson

redisson

3.6.5

启动类中注入bean对象:

@Bean

public Redisson redisson() {

// 此为单机模式

Config config = new Config();

config.useSingleServer().setAddress("redis://localhost:6379").setDatabase(0);

return (Redisson) Redisson.create(config);

}

@Bean

public Redisson redisson() {

// 此为单机模式

Config config = new Config();

config.useSingleServer().setAddress("redis://localhost:6379").setDatabase(0);

return (Redisson) Redisson.create(config);

}

实现分布式:

@Autowired

RedisTemplate redisTemplate;

@Autowired

private Redisson redisson;

/**

* 基于redisson实现高并发分布式锁

* @return

*/

@GetMapping("highConcurrencyDistributedLock")

public Object highConcurrencyDistributedLock(){

RLock redissonLock = redisson.getLock(TestConstant.HIGH_CONCURRENCY_DISTRIBUTED_LOCK);

try {

//加锁,实现了key设置,过期时间,锁续命功能

redissonLock.lock(); //redisTemplate.opsForValue().setIfAbsent(lockKey, clientId, 30, TimeUnit.SECONDS);

// Todo 实现业务逻辑

redisTemplate.opsForValue().set(TestConstant.KEY_TEST,String.valueOf(System.currentTimeMillis()));

} finally {

//释放锁

redissonLock.unlock();

}

return redisTemplate.opsForValue().get(TestConstant.KEY_TEST);

}

@Autowired

RedisTemplate redisTemplate;

@Autowired

private Redisson redisson;

/**

* 基于redisson实现高并发分布式锁

* @return

*/

@GetMapping("highConcurrencyDistributedLock")

public Object highConcurrencyDistributedLock(){

RLock redissonLock = redisson.getLock(TestConstant.HIGH_CONCURRENCY_DISTRIBUTED_LOCK);

try {

//加锁,实现了key设置,过期时间,锁续命功能

redissonLock.lock(); //redisTemplate.opsForValue().setIfAbsent(lockKey, clientId, 30, TimeUnit.SECONDS);

// Todo 实现业务逻辑

redisTemplate.opsForValue().set(TestConstant.KEY_TEST,String.valueOf(System.currentTimeMillis()));

} finally {

//释放锁

redissonLock.unlock();

}

return redisTemplate.opsForValue().get(TestConstant.KEY_TEST);

}

显示全文
为您推荐
演员罗京民去世 曾出演《士兵突击》
演员罗京民去世 曾出演《士兵突击》

今(26)日,中视协演员工作委员会官方微博发布消息,著名演员罗京民因病于今日凌晨逝世,享年67岁。张译发文悼念,“心疼你啊,老爷子”。演员刘天佐发文悼念,“兽医,走好!”导演制片李文龙也写道:“罗京民.........

发布时间:2023-06-08 04:04:30

空调的水干净吗能喝吗
空调的水干净吗能喝吗

【导读】 空调的水干净吗能喝吗,下面是小编为你收集整理的,希望对你有帮助!空调排出的水是干净的,但是不能直接饮用。氟利昂在工作时蒸发吸热,蒸发器的表面温度大大低于室温,于是空气中的水蒸气凝结成水。空调蒸发器上不断产生的冷凝水,虽然有滤网,但是也有很多漏网的纤维、烟尘、细菌通......

发布时间:2023-06-08 04:01:08

赵丽颖提名白玉兰最佳女主角
赵丽颖提名白玉兰最佳女主角

今(26)日,上海电视剧官方微博公布了第28届上海电视节白玉兰奖入围名单(以片名/人名拼音首字母排序)。在“中国电视剧单元”,《风吹半夏》《警察荣誉》《开端》《狂飙》《梦华录》《乔家的儿女》《人世间》.........

发布时间:2023-06-08 03:03:25

两个电瓶串联怎么充电
两个电瓶串联怎么充电

【导读】 两个电瓶串联怎么充电,下面是小编为你收集整理的,希望对你有帮助!两个电瓶串联充电器充电要输出正极接电池正极,充电器输出负极接电池负极就可以充电了。几个电路元件沿着单一路径互相连接,每个节点最多只连接两个元件,此种连接方式称为串联。以串联方式连接的电路称为串联电路。......

发布时间:2023-06-08 03:01:06

怎么炒墨鱼
怎么炒墨鱼

【导读】 怎么炒墨鱼,下面是小编为你收集整理的,希望对你有帮助!材料:墨鱼(洗净后)200g、彩椒200g、生姜5g、大蒜5g、绍兴黄酒1小勺(5ml)、鲜酱油1小勺(5ml)、老抽1/2小勺(2.5ml)、食盐适量、花生油(底油)适量。1、墨鱼清洗干净之后,开始......

发布时间:2023-06-08 02:01:07

冯巩当选中国曲艺家协会主席
冯巩当选中国曲艺家协会主席

5月9日,我国曲艺家协会(曲协)第九次全国代表大会在北京拉开帷幕,来自全国各地的文艺工作者纷纷建言献策,表达老百姓的心声。今次曲协代表大会的召开,主要任务之一便是举办换届推举工作,以姜昆主席为首的第八.........

发布时间:2023-06-08 01:03:41

长江断流事件是否真实?揭秘长江断流两小时真相
长江断流事件是否真实?揭秘长江断流两小时真相

【导读】 长江断流事件是否真实?揭秘长江断流两小时真相,下面是小编为你收集整理的,希望对你有帮助!长江是亚洲第一长河,世界第三长河,是我国水量最丰富的河流,给沿途城市和北方提供着日常用水。千百年来长江滔滔不绝的养育了一代又一代炎黄子孙,然而在1954年却发生了长江断流事件,断流持续了两个小时。长江......

发布时间:2023-06-08 01:01:29

什么是闰年
什么是闰年

【导读】 什么是闰年,下面是小编为你收集整理的,希望对你有帮助!1、闰年是公历中的名词。闰年分为普通闰年和世纪闰年。普通闰年:公历年份是4的倍数的,且不是100的倍数,为普通闰年。世纪闰年:公历年份是整百数的,必须是400的倍数才是世纪闰年。2、闰年是为了弥补因人......

发布时间:2023-06-08 00:01:06

贾乃亮张含韵《声临其境》宝藏声音藏不住
贾乃亮张含韵《声临其境》宝藏声音藏不住

由湖南卫视倾力打造的原创声音魅力竞演秀《声临其境》第三季第三期已于1月11日周六晚22:00准时播出。节目从第一季到第三季,创造出独一无二的声音竞演舞台,给观众带来了豪华听觉盛宴的同时,也发掘了一大批.........

发布时间:2023-06-07 23:03:42

水银温度计打碎了怎么处理:开窗通风(可能会导致中毒)
水银温度计打碎了怎么处理:开窗通风(可能会导致中毒)

【导读】 水银温度计打碎了怎么处理:开窗通风(可能会导致中毒),下面是小编为你收集整理的,希望对你有帮助!现在疫情状况还没有完全好转,因此大家时不时就会测一下体温,所以有些人家中就会备上一个温度计,而现在温度计中最多的就是水银温度计了,但是水银又是一个比较危险的东西,那么如果把水银温度计打碎了怎么处理比较......

发布时间:2023-06-07 23:01:13

出发,海陆空 《海底小纵队:洞穴大冒险》发海报
出发,海陆空 《海底小纵队:洞穴大冒险》发海报

知名动画IP《海底小纵队》系列大电影的第二部《海底小纵队:洞穴大冒险》将在6月1日儿童节,6月3日-5日端午节假期全国惊喜点映,在7月9日正式上映。伴随点映发布的出发!海陆空!全新预告及海报中,小纵队.........

发布时间:2023-06-07 22:03:40

无天佛祖扮演者是谁:张永刚(上戏毕业演员)
无天佛祖扮演者是谁:张永刚(上戏毕业演员)

【导读】 无天佛祖扮演者是谁:张永刚(上戏毕业演员),下面是小编为你收集整理的,希望对你有帮助!无天佛祖的扮演者叫张永刚,其艺名叫黑子,张永刚出生在1971年是辽宁人,在中国内地也是比较有名的演员,张永刚曾经是上戏的学生。在毕业之后参演很多电视剧以及电影,在1995年的时候曾经演过生死千里,在1......

发布时间:2023-06-07 22:01:08