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

简介:

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

 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

我们关注结果最后一行:每秒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;
}

程序实现很简单,就不全贴在这里了,完整代码详见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]
相关文章
|
6月前
|
人工智能 自然语言处理 测试技术
从人工到AI驱动:天猫测试全流程自动化变革实践
天猫技术质量团队探索AI在测试全流程的落地应用,覆盖需求解析、用例生成、数据构造、执行验证等核心环节。通过AI+自然语言驱动,实现测试自动化、可溯化与可管理化,在用例生成、数据构造和执行校验中显著提效,推动测试体系从人工迈向AI全流程自动化,提升效率40%以上,用例覆盖超70%,并构建行业级知识资产沉淀平台。
从人工到AI驱动:天猫测试全流程自动化变革实践
|
6月前
|
数据采集 存储 人工智能
从0到1:天猫AI测试用例生成的实践与突破
本文系统阐述了天猫技术团队在AI赋能测试领域的深度实践与探索,讲述了智能测试用例生成的落地路径。
从0到1:天猫AI测试用例生成的实践与突破
|
7月前
|
消息中间件 缓存 NoSQL
Redis各类数据结构详细介绍及其在Go语言Gin框架下实践应用
这只是利用Go语言和Gin框架与Redis交互最基础部分展示;根据具体业务需求可能需要更复杂查询、事务处理或订阅发布功能实现更多高级特性应用场景。
419 86
|
7月前
|
Java 测试技术 API
自动化测试工具集成及实践
自动化测试用例的覆盖度及关键点最佳实践、自动化测试工具、集成方法、自动化脚本编写等(兼容多语言(Java、Python、Go、C++、C#等)、多框架(Spring、React、Vue等))
577 6
|
7月前
|
人工智能 边缘计算 搜索推荐
AI产品测试学习路径全解析:从业务场景到代码实践
本文深入解析AI测试的核心技能与学习路径,涵盖业务理解、模型指标计算与性能测试三大阶段,助力掌握分类、推荐系统、计算机视觉等多场景测试方法,提升AI产品质量保障能力。
|
7月前
|
人工智能 自然语言处理 测试技术
AI测试平台的用例管理实践:写得清晰,管得高效,执行更智能
在测试过程中,用例分散、步骤模糊、回归测试效率低等问题常困扰团队。霍格沃兹测试开发学社推出的AI测试平台,打通“用例编写—集中管理—智能执行”全流程,提升测试效率与覆盖率。平台支持标准化用例编写、统一管理操作及智能执行,助力测试团队高效协作,释放更多精力优化测试策略。目前平台已开放内测,欢迎试用体验!
|
7月前
|
存储 缓存 监控
Redis分区的核心原理与应用实践
Redis分区通过将数据分散存储于多个节点,提升系统处理高并发与大规模数据的能力。本文详解分区原理、策略及应用实践,涵盖哈希、范围、一致性哈希等分片方式,分析其适用场景与性能优势,并探讨电商秒杀、物联网等典型用例,为构建高性能、可扩展的Redis集群提供参考。
372 0
|
8月前
|
人工智能 资源调度 jenkins
精准化回归测试:大厂实践与技术落地解析
在高频迭代时代,全量回归测试成本高、效率低,常导致关键 bug 漏测。精准化测试通过代码变更影响分析,智能筛选高价值用例,显著提升测试效率与缺陷捕获率,实现降本增效。已被阿里、京东、腾讯等大厂成功落地,成为质量保障的新趋势。
|
9月前
|
存储 缓存 NoSQL
Redis 核心知识与项目实践解析
本文围绕 Redis 展开,涵盖其在项目中的应用(热点数据缓存、存储业务数据、实现分布式锁)、基础数据类型(string 等 5 种)、持久化策略(RDB、AOF 及混合持久化)、过期策略(惰性 + 定期删除)、淘汰策略(8 种分类)。 还介绍了集群方案(主从复制、哨兵、Cluster 分片)及主从同步机制,分片集群数据存储的哈希槽算法。对比了 Redis 与 Memcached 的区别,说明了内存用完的情况及与 MySQL 数据一致性的保证方案。 此外,详解了缓存穿透、击穿、雪崩的概念及解决办法,如何保证 Redis 中是热点数据,Redis 分布式锁的实现及问题解决,以及项目中分布式锁
258 1
|
8月前
|
搜索推荐 Devops 测试技术
避免无效回归!基于MCP协议的精准测试影响分析实践
本文揭示传统测试的"孤岛困境",提出MCP(Model Context Protocol)测试新范式,通过模型抽象业务、上下文感知环境和协议规范协作,实现从机械执行到智能测试的转变。剖析MCP如何颠覆测试流程,展示典型应用场景,并提供团队落地实践路径,助力测试工程师把握质量效率革命的新机遇。

热门文章

最新文章

下一篇
开通oss服务