Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >简易Redis锁应用实现(高并发场景优化)

简易Redis锁应用实现(高并发场景优化)

作者头像
Diuut
发布于 2023-03-10 08:56:53
发布于 2023-03-10 08:56:53
33000
代码可运行
举报
文章被收录于专栏:DiuutDiuut
运行总次数:0
代码可运行

需求 发送短信的接口,高并发的情况下,第一条请求进来,判断redis里近一分钟没有发过短信,还在逻辑处理的时候,第二条请求也进来了,这个时候第一个进程还没提交更改redis缓存中的数据,第二条获取的状态近一分钟内依旧没有发送,所以逻辑判断允许,此处需改进。

场景复现:用JMeter模拟请求短信发送,指定30个线程,每个线程循环3次,间隔0秒

短信成功发送了三条,注意当前还只是测试环境中的一个服务器,若生产环境中的多台并发,情况会更加严重

类似场景如购物平台抢购,然后超卖了,不过解决方案还可以用MQ来处理,这里仅处理短信发送校验,又不想引框架,所以通过简易Redis代码方式解决。

实现代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//获取redis锁
        Boolean islock = redisTemplate.opsForValue().setIfAbsent(smsToken + "-lock", "1", 5, TimeUnit.SECONDS);
        if (islock) {
            try {
                /*--业务逻辑---*/
            } catch (Exception e) {
                Trace.logError(Trace.COMPONENT_ACTION, e.getMessage(), e);
                throw e;
            } finally {
                //释放锁
                String lockId = (String) redisTemplate.opsForValue().get(smsToken + "-lock");
                if (lockId != null) {
                    redisTemplate.delete(smsToken + "-lock");
                }
            }
        } else {
            //未获取锁,发送频繁
            throw new Exception("短信发送频繁");
        }

这样处理的前提是多台服务连接的是同一个redis服务器或者同一个redis集群,才能保证获取到的锁的唯一性。

再次通过JMeter测试复现:

仅成功一次

如果业务流程可能会很长,而且超时时间不好确认,又担心锁过期或被其他的线程错误解锁,这里可以做一个优化,将锁的value设置成自定义随机值,然后解锁的时候在判断一次仅解锁自己上的锁,这样就不会被其他线程异常解锁。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023年3月9日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java基于redis实现分布式锁(SpringBoot)
分布式锁,其实原理是就是多台机器,去争抢一个资源,谁争抢成功,那么谁就持有了这把锁,然后去执行后续的业务逻辑,执行完毕后,把锁释放掉。
Happyjava
2024/02/02
6750
Java基于redis实现分布式锁(SpringBoot)
Java基于redis实现分布式锁(SpringBoot)
分布式锁,其实原理是就是多台机器,去争抢一个资源,谁争抢成功,那么谁就持有了这把锁,然后去执行后续的业务逻辑,执行完毕后,把锁释放掉。
Happyjava
2019/07/17
5870
Java基于redis实现分布式锁(SpringBoot)
大厂的Redis锁竟然是这么用的,难怪不会超卖!
常用的即 synchronize 或 Lock 等 JDK 自带的锁,只能锁住当前进程,仅适用于单体架构服务。 而在分布式多服务实例场景下必须使用分布式锁
Java程序猿
2021/01/29
1.2K0
加锁了,还有并发问题?Redis分布式锁你真的了解?
新接手的项目,偶尔会出现账不平的问题。之前的技术老大临走时给的解释是:排查了,没找到原因,之后太忙就没再解决,可能是框架的原因……
程序新视界
2021/12/07
2.5K0
Redis使用场景一(活动秒杀)
redis的互斥锁可以解决这个问题,redis的setnx命令在指定的 key 不存在时,为 key 设置指定的值。当存在时,则无法插入值
憨批程序员
2020/04/30
1.9K0
我们所了解的Redis分布式锁真的就万无一失吗?
在单体架构中,我们处理并发的手段有多种,例如synchronized或使用ReentrantLock等常用手段,但是在分布式架构中,上述所说的就不能解决某些业务的并发问题了,那么接下来我们就开始聊聊分布式锁。
黎明大大
2021/03/09
4190
深入浅出 超详细 从 线程锁 到 redis 实现分布式锁(篇节 2)「建议收藏」
上节 我们讲了 线程锁 在单体项目中的作用,和 放在 分布式 项目里产生的问题,那接下来我们就来解决 分布式 架构上怎么 保证 数据的一直性
全栈程序员站长
2022/08/31
4450
深入浅出 超详细 从 线程锁 到 redis 实现分布式锁(篇节 2)「建议收藏」
redis 锁
oktokeep
2024/10/09
930
Redis分布式锁存在的问题
假设有这样一个场景,在一个购票软件上买一张票,但是此时剩余票数只有一张或几张,这个时候有几十个人都在同时使用这个软件购票。在不考虑任何影响下,正常的逻辑是首先判断当前是否还有剩余的票,如果有,那么就进行购买并扣减库存数,否则就会提示票数不足,购买失败。伪代码如下:
闻说社
2022/12/28
4100
Redis分布式锁存在的问题
原来大厂的Redis分布式锁都这么设计的!
常用的即 synchronize 或 Lock 等 JDK 自带的锁,只能锁住当前进程,仅适用于单体架构服务。
JavaEdge
2021/01/27
7930
原来大厂的Redis分布式锁都这么设计的!
大厂的Redis分布式锁是如何设计的
常用的即 synchronize 或 Lock 等 JDK 自带的锁,只能锁住当前进程,仅适用于单体架构服务。 而在分布式多服务实例场景下必须使用分布式锁
JavaEdge
2021/02/22
2510
大厂的Redis分布式锁是如何设计的
基于redis的分布式锁二种应用场景
“分布式锁”是用来解决分布式应用中“并发冲突”的一种常用手段,实现方式一般有基于zookeeper及基于redis二种。具体到业务场景中,我们要考虑二种情况:
菩提树下的杨过
2019/06/17
1.1K0
基于redis的分布式锁二种应用场景
Redis分布式锁的几种演进方案
需要一种支持分布式集群环境下的锁:查询 DB 时,只有一个线程能访问,其他线程都需要等待第一个线程释放锁资源后,才能继续执行。
Ant丶
2022/03/01
6720
Redis分布式锁的几种演进方案
Redis实现并发阻塞锁方案
由于用户同时访问线上的下订单接口,导致在扣减库存时出现了异常,这是一个很典型的并发问题,本篇文章为解决并发问题而生,采用的技术为Redis锁机制+多线程的阻塞唤醒方法。
程序员田同学
2022/04/28
8320
Redis实现并发阻塞锁方案
【高并发】高并发分布式锁架构解密,不是所有的锁都是分布式锁!!
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:
冰河
2020/10/29
7430
【高并发】高并发分布式锁架构解密,不是所有的锁都是分布式锁!!
【高并发】高并发分布式锁架构解密,不是所有的锁都是分布式锁(升级版)!!
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:
冰河
2020/10/29
6580
【高并发】高并发分布式锁架构解密,不是所有的锁都是分布式锁(升级版)!!
redis分布式锁(2)
index1执行删除前,lock刚好过期时间已到,被redis自动释放,在redis中没有了lock,没有了锁。
一个风轻云淡
2022/11/13
3710
redis分布式锁(2)
继续项目实战,集成Redis分布式锁(大神勿进)
本文是我们小项目的第三篇文了,本次我们来把分布式锁应用到我们的项目中,使用Redis实现的分布式锁功能,这一切都是为我们往后的工作做铺垫,希望大家能get到分布式锁这项新技能。
田维常
2021/03/16
3580
一文读懂Springboot+RocketMQ+Redis抢单实现10W级QPS
synchronized (this):同步方法支持一种简单的策略来防止线程受到干扰和内存一致性错误;如果一个对象对多个线程可见,则对该对象变量的所有读取或写入都是通过同步方法完成。通俗点来说就是程序中用于保护线程安全的一种机制。
QGS
2024/04/11
6690
浅谈缓存与分布式锁
对于一个大型网站而言,每天的访问量是巨大的,尤其遇到某些特定的时间点,比如电商平台的购物节、教育平台开学季。当在某个时间点遇到过量的并发时,往往会压垮服务器导致网站崩溃,因此,网站对于高并发的处理是至关重要的,其中缓存起着举足轻重的作用。对于一些不经常变化,或者热度很高的数据,可以将其存入缓存,此时当用户访问时将直接读取缓存而不查询数据库,从而大大提高了网站的吞吐量。
wangweijun
2022/01/10
2040
推荐阅读
相关推荐
Java基于redis实现分布式锁(SpringBoot)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验