商品预约抢购实践及redis性能测试

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介:

类似于小米手机预约抢购,但这里预约是需要资格的,难点是高并发的处理。

 1.后台管理系统添加商品,字段包括sku、库存,抢购开始时间、抢购所需白条订单数,同时写入redis缓存

 2.前端系统直接从缓存查询展示商品及预约抢购信息

 3.订单累计系统接收消息累计用户订单数和金额,预约资格要用

 4.用户在前端系统预约商品,数据库记下预约记录,同时写入redis集群,按用户分片,写入成功后扣减预约资格

 5.开抢前一个小时给用户发送抢购提醒通知

 6.抢购开始,前端系统从redis集群(或本地缓存如BitSet)检查用户是否有预约,有则调用抢购系统的抢购服务,并进行防刷和已抢购检查。

 7.抢购服务从redis检查商品库存b,若b<=0,提示已抢光,否则执行b--,判断和减库存作为原子操作一次性提交给redis。redis成功返回后,发送MQ(可降级为RPC调用),由抢购结果系统进行后续处理,若发送MQ成功,则提示抢购成功或已抢光,若失败,则回滚之前的redis操作,提示抢购失败请重试。

 8.抢购结果系统记录抢购结果,领优惠券

注:redis回滚失败表示少卖,是允许的。

考虑问题:单个商品的库存用一个redis?在这种应用场景下,系统必须限流。抢购做成服务便于水平扩展, 便于需求变化。

 

lua:

local b = redis.call(‘get’, KEYS[1]);

if b <= 0 then

  return 0

else

  redis.call(‘INCRBY’, KEYS[1], -1);

 

  return 1

 

java:

String script = "...";

String key = "..."; // 商品库存缓存key

String sha = jedis.scriptLoad(script);

int result = (Integer) jedis.evalsha(sha, 1, key);

 

 

redis发布版本中自带了redis-benchmark性能测试工具;

示例:

使用50个并发连接,发出100000个请求,每个请求的数据为2kb,

测试host为127.0.0.1 端口为6379的redis服务器性能:

./redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 100000 -d 2

...

====== SADD ======
  100000 requests completed in 2.27 seconds
  500 parallel clients
  3 bytes payload
  keep alive: 1

4.66% <= 1 milliseconds
14.15% <= 2 milliseconds
23.87% <= 3 milliseconds
33.59% <= 4 milliseconds
43.13% <= 5 milliseconds
52.69% <= 6 milliseconds
62.08% <= 7 milliseconds
71.43% <= 8 milliseconds
80.66% <= 9 milliseconds
89.10% <= 10 milliseconds
95.23% <= 11 milliseconds
98.76% <= 12 milliseconds
99.59% <= 13 milliseconds
99.78% <= 14 milliseconds
99.87% <= 15 milliseconds
99.95% <= 16 milliseconds
99.99% <= 17 milliseconds
100.00% <= 17 milliseconds
44150.11 requests per second
AI 代码解读

我们关注结果最后一行:每秒44150.11个请求,既QPS4.4万;但这里的数据都只是测试数据,测出来的QPS不能代表实际生产的处理能力;

测算redis处理实际生产请求的QPS/TPS

在实际生产中,我们需要关心这个指标,在我们的应用场景中,redis能够处理的最大的(QPS/TPS)是多少?

测量redis QPS的方式有两种:

  1. 估计生产的报文大小,使用benchmark工具指定-d数据块大小来模拟;

  2. 使用redis-cli中info统计信息计算差值;redis-cli的info命令中有一项total_commands_processed表示:从启动到现在处理的所有命令总数,可以通过统计两次info指令间的差值来计算QPS:

//返回redis-cli info中total_commands_processed的结果 
long getCmdProcessNum(redisContext *c)
{
	string strVal;
	getInfo(c,strVal);
	map<string,string> mpVal;
	parserInfo(strVal,mpVal);
	map<string,string>::iterator  iter = mpVal.find("total_commands_processed");
	if(iter != mpVal.end())
	{
		return atol(iter->second.c_str());
	}
	cout << "[err] not found total_commands_processed" << endl;
	return 0;
}
AI 代码解读

程序实现很简单,就不全贴在这里了,完整代码详见github:

https://github.com/me115/cppset/tree/master/redisTPS

在实际生产中,运行这个程序来统计实际的QPS。运行示例:

/opt/app/redisTPS#./redisTPS 
Time:  1  Process:40962  TPS:40839.48
Time:  1  Process:43741  TPS:43610.17
Time:  1  Process:38935  TPS:38779.88
Time:  1  Process:31724  TPS:31597.61
Time:  1  Process:32169  TPS:32008.96
Time:  1  Process:31634  TPS:31476.62
Time:  1  Process:46007  TPS:45823.71
Time:  1  Process:50460  TPS:50258.96
Time:  1  Process:47309  TPS:47167.50
Time:  1  Process:50511  TPS:50359.92
...

原文链接:[http://wely.iteye.com/blog/2361500]
AI 代码解读
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
打赏
0
0
1
1
16488
分享
相关文章
RESTful接口设计与测试实践
通过理解和实践上述原则和步骤,你就可以设计和测试你的RESTful接口了。最后,它可能会变成你为优化系统性能和用户体验所使用的重要工具,因为好的接口设计可以使得从服务器端到客户端的通信更加直接和有效,同时提升产品的使用体验和满意度。如此一来,写一个好的RESTful接口就变成一种享受。
121 18
|
2月前
|
Redis:现代服务端开发的缓存基石与电商实践-优雅草卓伊凡
Redis:现代服务端开发的缓存基石与电商实践-优雅草卓伊凡
69 5
Redis:现代服务端开发的缓存基石与电商实践-优雅草卓伊凡
利用 RunnerGo 深度探索 API 性能测试:从理论到实践
API性能测试是保障应用稳定性和用户体验的关键环节。本文详细探讨了如何使用RunnerGo全栈测试平台进行高效API性能测试,涵盖测试计划创建、场景设计、参数配置到执行与分析全过程。通过电商平台促销活动案例,展示了高并发下的测试策略与优化措施,如代码与数据库查询优化、数据库连接池扩容、服务器资源配置调整及缓存策略实施等。最终显著提升系统性能,满足高并发需求。API性能测试需持续关注与优化,以适应业务发展和用户需求变化。
136 33
Redis压测脚本及持久化机制
Redis压测脚本及持久化机制简介: Redis性能压测通过`redis-benchmark`工具进行,可评估读写性能。持久化机制包括无持久化、RDB(定期快照)和AOF(操作日志),以及两者的结合。RDB适合快速备份与恢复,但可能丢失数据;AOF更安全,记录每次写操作,适合高数据安全性需求。两者结合能兼顾性能与安全性,建议同时开启并定期备份RDB文件以确保数据安全。
89 9
Redis应用—6.热key探测设计与实践
热key问题在高并发系统中可能导致数据层和服务层的严重瓶颈,如Redis集群瘫痪和用户体验下降。为解决此问题,京东开发了JdHotkey热key探测框架,具备实时性、准确性、集群一致性和高性能等特点。该框架由etcd集群、Client端jar包、Worker端集群和Dashboard控制台组成,通过分布式计算快速识别热key并推送至应用内存,有效减轻数据层负载,提升服务性能。JdHotkey适用于多种场景,安装部署简便,支持毫秒级热key探测和集群一致性维护。
219 61
Redis应用—6.热key探测设计与实践
Python测试淘宝店铺所有商品接口的详细指南
本文详细介绍如何使用Python测试淘宝店铺商品接口,涵盖环境搭建、API接入、签名生成、请求发送、数据解析与存储、异常处理等步骤。通过具体代码示例,帮助开发者轻松获取和分析淘宝店铺商品数据,适用于电商运营、市场分析等场景。遵守法规、注意调用频率限制及数据安全,确保应用的稳定性和合法性。
利用Postman和Apipost进行API测试的实践与优化-动态参数
在API测试中,Postman和Apipost是常用的工具。Postman内置变量功能有限,面对复杂场景时需编写JavaScript脚本,增加了维护成本。而Apipost提供丰富的内置变量、可视化动态值配置和低代码操作,支持生成真实随机数据,如邮箱、手机号等,显著提升测试效率和灵活性。对于复杂测试场景,Apipost是更好的选择,能有效降低开发与维护成本,提高测试工作的便捷性和可维护性。
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
182 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
Redis哈希结构在提升数据检索速度中的实践应用
本文详细介绍了 Redis 哈希结构的特点、常见使用场景以及如何在实际应用中利用哈希结构提升数据检索速度。通过合理使用 Redis 哈希结构,可以显著提高系统的性能和响应速度。在实际开发中,结合具体业务需求,灵活运用 Redis 提供的多种数据结构,构建高效的缓存和数据存储解决方案。希望本文能帮助您更好地理解和应用 Redis 哈希结构,提升数据检索速度。
125 18
Vue.js应用结合Redis数据库:实践与优化
将Vue.js应用与Redis结合,可以实现高效的数据管理和快速响应的用户体验。通过合理的实践步骤和优化策略,可以充分发挥两者的优势,提高应用的性能和可靠性。希望本文能为您在实际开发中提供有价值的参考。
131 11
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问