使用Redis计数器防止并发请求

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介:

使用Redis计数器防止并发请求


需求描述

最近项目中有个需求,短信发送的并发请求问题:业务需求是需要限制一个号码一分钟内只能获取一次随机码,之前的实现是短信发送请求过来后,先去数据库查询发送记录,根据上一次的短信发送时间和当前时间比较,如果时间差小于一分钟,则提示短信获取频繁,如果超过一分钟,则发送短信,并记录短信发送日志。

问题分析

短信发送是一个很敏感的业务,上面的实现存在一个并发请求的问题,当同一时间有很多请求过来时,同时去查库,同时获取到上一次发送时间没有,或者已超过一分钟,这时候就会重复发送短信了。

使用Redis incr解决问题

      Redis incr 可以实现原子性的递增,可应用于高并发的秒杀活动、分布式序列号生成等场景。这里我使用它来计数实现一分钟内只接受一次请求。

实现逻辑也很简单:我们在接到短信发送请求后,使用Redis的incr设置一个递增KEY(KEY由固定字符串+手机号码组成),并判断该KEY的数值,如果等于1,说明是第一个请求,我们将该KEY值有效期设置为一分钟;如果该KEY的数值大于1,说明是1分钟内的多次请求,这时我们直接返回短信获取频繁,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
String redisKey = "SMS_LIMIT_" + smsPhone;
long count = redisTemplate.opsForValue().increment(redisKey, 1);
if (count == 1) {
//设置有效期一分钟
redisTemplate.expire(redisKey, 60, TimeUnit.SECONDS);
}
if (count > 1) {
resultMap.put( "retCode", "-1");
resultMap.put( "retMsg", "每分钟只能发送一次短信");
outPrintJson(resultMap);
return;
}
/** 发送短信 */
......
/** 记录发送日志 */
......

测试

使用Jmeter进行并发测试,同时发送200个线程请求,通过测试发现可避免并发请求问题 :
测试图1
查看结果,只有第一个请求发送了短信,剩余199个请求均返回失败:
测试图2
可以看出性能还是很不错的:
测试图3

原文地址http://www.bieryun.com/1855.html

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
8月前
|
缓存 NoSQL 中间件
redis如何通过读写分离来承载读请求高并发
redis如何通过读写分离来承载读请求高并发
67 0
|
5天前
|
缓存 NoSQL Redis
Redis经典问题:数据并发竞争
在大流量系统中,数据并发竞争可能导致系统性能下降和崩溃。为解决此问题,可以采取加写回操作和互斥锁,确保数据一致性并减少写操作对缓存的影响。另外,保持缓存数据多个备份能降低并发竞争概率。通过实例展示了如何在电商网站中应用这些策略,从而提高系统稳定性和性能。关注微信公众号“软件求生”获取更多技术分享。
234 1
|
5天前
|
缓存 NoSQL Java
Java项目:支持并发的秒杀项目(基于Redis)
Java项目:支持并发的秒杀项目(基于Redis)
45 0
|
5天前
|
存储 NoSQL 关系型数据库
图解 Redis String 底层数据结构 SDS 与计数器实战
图解 Redis String 底层数据结构 SDS 与计数器实战
60 0
|
5天前
|
存储 缓存 NoSQL
《吊打面试官》系列-Redis双写一致性、并发竞争、线程模型
《吊打面试官》系列-Redis双写一致性、并发竞争、线程模型
42 0
|
5天前
|
存储 NoSQL 关系型数据库
redis与mysql的数据一致性问题(并发更新)
redis与mysql的数据一致性问题(并发更新)
31 0
|
5天前
|
NoSQL Java Redis
Redis如何处理并发访问和竞态条件?
Redis如何处理并发访问和竞态条件?
38 0
|
5天前
|
消息中间件 算法 NoSQL
45k以上突击面试必备,redis+mysql+并发+spring+算法+导图等
今天小编给大家带来的一篇关于Java面试相关的电子文档资源,介绍了关于Java、面试题方面的内容,本书是由Java官网出版,格式为DOC,资源大小62.5 MB,目前豆瓣、亚马逊、当当、京东等电子书综合评分为:8.7。
|
10月前
|
NoSQL Redis 数据安全/隐私保护
Redis单线程处理IO请求性能瓶颈有哪些?
Redis单线程处理IO请求性能瓶颈有哪些?
|
缓存 NoSQL 关系型数据库
【JavaP6大纲】Redis篇:Redis 的并发竞争问题是什么?如何解决这个问题?
【JavaP6大纲】Redis篇:Redis 的并发竞争问题是什么?如何解决这个问题?