博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
商品预约抢购实践及redis性能测试
阅读量:7083 次
发布时间:2019-06-28

本文共 2790 字,大约阅读时间需要 9 分钟。

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

 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: 14.66% <= 1 milliseconds14.15% <= 2 milliseconds23.87% <= 3 milliseconds33.59% <= 4 milliseconds43.13% <= 5 milliseconds52.69% <= 6 milliseconds62.08% <= 7 milliseconds71.43% <= 8 milliseconds80.66% <= 9 milliseconds89.10% <= 10 milliseconds95.23% <= 11 milliseconds98.76% <= 12 milliseconds99.59% <= 13 milliseconds99.78% <= 14 milliseconds99.87% <= 15 milliseconds99.95% <= 16 milliseconds99.99% <= 17 milliseconds100.00% <= 17 milliseconds44150.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
mpVal; parserInfo(strVal,mpVal); map
::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:

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

/opt/app/redisTPS#./redisTPS Time:  1  Process:40962  TPS:40839.48Time:  1  Process:43741  TPS:43610.17Time:  1  Process:38935  TPS:38779.88Time:  1  Process:31724  TPS:31597.61Time:  1  Process:32169  TPS:32008.96Time:  1  Process:31634  TPS:31476.62Time:  1  Process:46007  TPS:45823.71Time:  1  Process:50460  TPS:50258.96Time:  1  Process:47309  TPS:47167.50Time:  1  Process:50511  TPS:50359.92...原文链接:[http://wely.iteye.com/blog/2361500]

转载地址:http://kkqml.baihongyu.com/

你可能感兴趣的文章
how to backup and restore database of SQL Server
查看>>
Hibernate- QBC查询方式
查看>>
【Linux】linux查看日志文件内容命令tail、cat、tac、head、echo
查看>>
php中的或运算
查看>>
位图(BitMap)索引
查看>>
CSS3伪类和伪元素的特性和区别
查看>>
vue实现文章内容过长点击阅读全文功能
查看>>
记一次elementUI Icon 加载无效的问题。并且提示错误 Failed to decode downloaded font:
查看>>
OpenGL之位图的绘制和gluOrtho2D等函数详解
查看>>
Linux磁盘概念及其管理工具fdisk
查看>>
Linux epoll版定时器
查看>>
objective C中数据持久化方式1--对象归档
查看>>
Python面向对象编程 - 一个记事本程序范例(一)
查看>>
马桶餐厅
查看>>
我对程序员技能的一些认识
查看>>
在linux下如何修改oracle的sys和system的密码
查看>>
【C语言】01-C语言概述
查看>>
mysql FullText全文索引的问题
查看>>
空格&nbsp在不同浏览器中显示距离不一致问题解决方法
查看>>
Dynamic CRM 2013学习笔记(八)过滤查找控件 (类似省市联动)
查看>>