前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >简易Redis锁应用实现(高并发场景优化)

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

作者头像
Diuut
发布2023-03-10 16:56:53
3040
发布2023-03-10 16:56:53
举报
文章被收录于专栏:DiuutDiuut

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

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

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

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

实现代码:

代码语言:javascript
复制
//获取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 删除。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
短信
腾讯云短信(Short Message Service,SMS)可为广大企业级用户提供稳定可靠,安全合规的短信触达服务。用户可快速接入,调用 API / SDK 或者通过控制台即可发送,支持发送验证码、通知类短信和营销短信。国内验证短信秒级触达,99%到达率;国际/港澳台短信覆盖全球200+国家/地区,全球多服务站点,稳定可靠。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档