商品预约抢购实践及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]
时间: 2024-09-24 00:11:06

商品预约抢购实践及redis性能测试的相关文章

乐视TV新年送大礼,提供多个超级电视现货套餐供预约抢购

[IT168厂商动态]12月31日消息,明天就是2014年元旦,新年新气象,乐视TV为回馈广大老用户(乐视网及乐视商城用户)过去一年的大力支持,特别提供多个超级电视现货套餐供预约抢购,并将赠送价值700万元的礼品.从今日上午10点开始,广大用户可以登陆乐视商城(shop.letv.com)进行预约,预约活动截止时间为2014年1月7日上午10点,中午12点准时开放购买.与此同时,天猫商城乐视TV旗舰店(leshitv.tmall.com)也有大规模促销活动.本次活动是2014年乐视TV首波现货预

基于PHP实现假装商品限时抢购繁忙的效果_php技巧

最近要做一个项目,有关商品显示抢购的功能.比如我们的网站很带流量,那么成千上万的用户在几秒内同时点你的商品,确实会出现"抢购人数过多,会提示,系统繁忙.     但是呢,大部分网站然而并没有这么牛叉.为了让用户感受到商品很抢手,动不动就提示"系统繁忙"的效果,我们需要做一个程序来"假装很繁忙". (除了淘宝,大家不要以为其他网站真的很繁忙哦,只不过人家是故意让你觉得不抢就买不到,求懂) 本文来设定一个规则,大家可以根据我的思路扩展即可.     1.商品购

999元酷派大神F2在近期引发了一轮预约抢购潮

999元酷派大神F2在近期引发了一轮预约抢购潮,仅在QQ空间上预约人数就达到了3,784,925人.无独有偶,QQ空间之前就创造出一连串的社会化营销辉煌数字:6月5日酷派大神Note在QQ空间独家首发预约,6月11日中午12:00正式发售,30万台酷派大神Note迅速售罄:8月12日中午12点,红米手机在QQ空间独家首发,开放购买的第一秒内就有超过14.8万用户点击购买,10万台红米手机在1分30秒内抢购一空. 在此次酷派大神F2的预售中,酷派选择了多家社交平台同步进行,结果显示,其在QQ空间的

性价比神器!99元一年的阿里云256MB高性能Redis性能测试及应用介绍

介绍 Redis是一个开源的key-value类型的数据库缓存和存储系统,同时Redis提供了丰富的数据结构用来支持多样的业务chan场景,比如hashes,lists,sets还有ordered sets及其他类型.云数据库Redis提供了兼容Redis协议的数据库服务,提供单机和集群两种模式,提供了全套的容灾切换.故障迁移.在线扩容.性能优化的数据库解决方案. 本文我们将介绍如何使用阿里云Redis服务作为PHP服务的session存储.PHP的session存储作为php会话信息的存储单元

猎豹极速wifi如何预约抢购?猎豹极速wifi怎么抢?

1.如果你不知道官网我们可以在搜索引擎中搜索"猎豹官网" 点击进入. 2.进入到官网之后我们再点击右上角论坛,进入到论坛之后会看到有一个"极速wifi"预约的字样,点击进入.   3.好了现在我们进入到了猎豹极速wifi抢购页面了,我们现在先点击"立即预约"就会弹出一个二维码的图案. 4.好了现在拿起你的手机扫一扫吧,这个可以直接使用微信来扫不一定要二维码软件哦. 5.扫了之后我们点击"关注",然后就收到了一条官方微信的消息,

乐视TV为回馈广大老用户,特别提供多个超级电视现货套餐供预约抢购

并将赠送价值700万元的礼品.从今日上午10点开始,广大用户可以登陆乐视商城(shop.letv.com)进行预约,预约活动截止时间为2014年1月7日上午10点,中午12点准时开放购买.与此同时,天猫商城乐视TV旗舰店(leshitv.tmall.com)也有大规模促销活动.本次活动是2014年乐视TV首波现货预约.其中,购买超级电视S40赠送价值280元的超级遥控器,限量10000台,S40价格现已经调整至1499+490元,是继S50之后又一爆款产品,具有超高的性价比和人气.此外,还有10

Redis高级实践之————Redis短连接性能优化

摘要: 对于Redis服务,通常我们推荐用户使用长连接来访问Redis,但是由于某些用户在连接池失效的时候还是会建立大量的短连接或者用户由于客户端限制还是只能使用短连接来访问Redis,而原生的Redis在频繁建立短连接的时候有一定性能损耗,本文从源码角度对Redis短连接的性能进行了优化. 1. 问题 通过历史监控我们可以发现用户在频繁使用短连接的时候Redis的cpu使用率有显著的上升 2. 排查 通过扁鹊查看但是Redis的cpu运行情况如下 从扁鹊我们可以看到Redis在freeClie

无需预约不用抢购 小米3S或改变发售方式

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 一提起小米手机,相信大多数人的印象就是难抢,这和其互联网营销模式以及产能不无关系,原先消费者购买小米手机时,需先注册账号,然后点击预约才有资格抢购,但往往抢购人数众多,从而导致大多数人都铩羽而归,怨声载道.就在前不久,小米公司转发了雷军的一条微博,并表示小米新品或会以预售排队的形式 开卖,而根据之前的推测,米3S将会出现在此次小米的新品发布会

基于Redis 千万级用户排行榜最佳实践

基于Redis 千万级用户排行榜最佳实践 前言 Redis 是一个开源的,内存中的数据结构存储系统,可以用作数据库.缓存和消息队列中间件.它支持多种类型的数据结构,如 字符串(string), Hash, 列表(List), 集合(Set), 有序集合(Sorted Set) . 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(Transactions) 和不同级别的 磁盘持久化(Persistence), 并