2019独角兽企业重金招聘Python工程师标准>>>

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

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 seconds500 parallel clients3 bytes payloadkeep alive: 14.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
...

转载于:https://my.oschina.net/javahongxi/blog/1523790

商品预约抢购实践及redis性能测试相关推荐

  1. Day269.口罩预约抢购系统关注的问题、瞬时高流量Mysql查询缓慢原因 -Redis的高并发预约抢购系统

    一.口罩预约抢购系统关注的问题 1.瞬时高流量sku缺乏监控会出现的问题 流量监控问题 如果不是值班人员细心,自己肉眼发现了这个预约SKU的涨幅不正常. 万一稍有疏忽没有观察到流量的异常,一旦到了抢购 ...

  2. python京东预约抢购流程_[Python] 京东秒杀商品抢购-茅台抢购自动获取抢购时间【修改】...

    这是咋回事 2021-01-12 08:36:03,201 - 14344-MainThread - jd_spider_requests.py[line:462] - INFO: 商品名称:[茅台白 ...

  3. 9.如何抗住双11预约抢购活动

    案例背景 在大促活动期间,"预约抢购"已经是各大电商平台的主要促销手段,京东自然也会和一些大的供应商合作,推出一些低价的爆款产品,比如 2019 年的 "1499 元抢购 ...

  4. 如何让系统抗住双十一的预约抢购活动?

    案例背景 在大促活动期间,"预约抢购"已经是各大电商平台的主要促销手段,京东自然也会和一些大的供应商合作,推出一些低价的爆款产品,比如 2020 年的 "1499 元抢购 ...

  5. java redis实现抢购_【抢购/秒杀】redis实现高并发下的抢购/秒杀功能

    问题: 抢购/秒杀是如今很常见的一个应用场景,那么高并发竞争下如何解决超抢(或超卖库存不足为负数的问题)呢? 常规写法: 查询出对应商品的库存,看是否大于0,然后执行生成订单等操作,但是在判断库存是否 ...

  6. Java商品秒杀抢购模拟双十一基础版

    Java秒杀抢购 需要用到的技术 java多线程 Redis mysql数据库 Quartz定时器 用到的框架: SSM 整体项目结构: 前端页面不用我们写,我这里提源码项目自己下载 链接:https ...

  7. 10.Redis 性能测试

    转自:http://www.runoob.com/redis/redis-tutorial.html Redis 性能测试是通过同时执行多个命令实现的. 语法 redis 性能测试的基本命令如下: r ...

  8. redis php 性能测试工具,redis性能测试与客户端连接详解

    Redis 性能测试(推荐:redis入门教程) 语法redis-benchmark [option] [option value] 实例 实例一 以下实例同时执行 1000 个请求来检测性能:$ r ...

  9. 供应链商品域DDD实践

    简介: DDD是一套方法论,实践能否成功,不仅仅是个技术问题,更是执行贯彻实施的问题.本文将就DDD的基本概念和DDD的实施进行分享. 作者 | 侧帽 来源 | 阿里技术公众号 前言 供应链商品域DD ...

  10. 数据迁移-商品数据迁移实践

    数据迁移扩展-商品数据迁移实践 一.背景描述: 双11前对原商品数据重新做了分库分表和数据迁移,称双11空闲做下复盘. ​ 原来我们商品主数据在2个公共库,每个库有100张商品主数据表,大概有3亿左右 ...

最新文章

  1. 以下哪一个不属于python语言的特点-以下不属于python语言特点的是( )_学小易找答案...
  2. mysql创建表的时候对字段和表添加COMMENT
  3. Academic English Reading Notes
  4. SpringMVC的视图解析器
  5. Theano 中文文档 0.9 - 7.1.1 Python教程
  6. Spring-Data-Redis存储对象(redisTemplate)
  7. SQL报错信息(3001-6999)
  8. nodejs实现定时爬取微博热搜
  9. 开发国信股票自动交易软件
  10. shal+php,PHP微信开发——第二弹
  11. MySql中的minus用法
  12. 怎样把pdf格式转换成jpg
  13. ✨❤️CSDN标题党❤️,创意无极限,那不直接全网站都花的飞起?
  14. MySQL阶段二_模块6
  15. 战双帕弥什登入显示服务器错误,战双帕弥什游戏进不去怎么办 卡在初始界面解决方法...
  16. 沃柑文案,水果店沃柑促销文案
  17. pandownload,TuTDown网盘不限速下载
  18. TCRT5000红外反射传感器(循迹模块)
  19. python监视电脑桌面_Python爬虫练习:爬取高清壁纸,让你电脑桌面一天一换
  20. 用sqlyog导入mysql中文数据乱码问题

热门文章

  1. 阿里巴巴公司内部资料:交互设计全档案
  2. 第1节 kafka消息队列:5、javaAPI操作
  3. SQL*Loader 和 Data Pump
  4. Android------Button 添加声音效果(两种方式)
  5. 数据库,规则库和知识库的比较
  6. hdu 1875(最小生成树kruskal)
  7. Blender插件之Panel
  8. Stack of js
  9. 数组元素的填充与替换、排序和复制
  10. Java--工厂模式