现有020的系统架构走库存,取券通过Fetch前n条来实现买n张优惠券,但此做法在高并发时有严重的性能问题,性能问题主要体现在数据库。

为了优化此性能,系统改为redis,走队列模式,即生产者消费者。

以下是自己做性能测试一此小杂记。

  1. public static void testEnqueue()
  2. {
  3. Console.WriteLine("开始运行");
  4. var stopWatch = new Stopwatch();
  5. stopWatch.Start();
  6. for (int i = ; i < ; i++)
  7. {
  8. redisClient.EnqueueItemOnList("o2olist", i.ToString().PadLeft(, ''));
  9. }
  10. var time = stopWatch.ElapsedMilliseconds;
  11. stopWatch.Stop();
  12. //125935,每秒可写800笔
  13. Console.WriteLine(string.Format("耗时:{0}毫秒", time));
  14. Console.ReadKey();
  15. }
ps:后台程序定时执行,考虑用java写在守护进程处理,由crontab调度
  1. public static void testDequeue()
  2. {
  3. Console.WriteLine("开始运行");
  4. var stopWatch = new Stopwatch();
  5. stopWatch.Start();
  6. var a = redisClient.GetListCount("o2olist");
  7. //队列操作之出队
  8. for (int i = ; i < a; i++)
  9. {
  10. Console.WriteLine(redisClient.DequeueItemFromList("o2olist"));
  11. }
  12. var time = stopWatch.ElapsedMilliseconds;
  13. stopWatch.Stop();
  14. //141538每秒可取714
  15. Console.WriteLine(string.Format("耗时:{0}毫秒", time));
  16. Console.ReadKey();
  17. }
ps:此情况基本不会出现在我现有o2o项目的场景,仅测试下
  1. public static void testDequeue2()
  2. {
  3. Console.WriteLine("开始运行:" + DateTime.Now.ToString("HH-mm-ss:fff"));
  4. Console.ReadKey();
  5. var stopWatch = new Stopwatch();
  6. stopWatch.Start();
  7. //四台机器买券并发估计10笔/s
  8. for (int i = ; i < * ; i++)
  9. {
  10. new Thread(() =>
  11. {
  12. try
  13. {
  14. RedisClient redisClient1 = new RedisClient(host, port);
  15. while (true)
  16. {
  17. var a = redisClient1.DequeueItemFromList("o2olist");
  18. if (a == null)
  19. {
  20. Console.WriteLine(DateTime.Now.ToString("HH-mm-ss:fff"));
  21. break;
  22. }
  23. else
  24. Console.WriteLine(a);
  25. }
  26. }
  27. catch (Exception ex)
  28. {
  29. Console.WriteLine(ex.Message);
  30. //
  31. //File.AppendAllText("c:\\e.log", DateTime.Now.ToString("HH-mm-ss:fff") + "\r\n" + ex.Message + ex.InnerException);
  32. }
  33. }
  34. ).Start();
  35. }
  36. //耗时38s,2631笔每秒
  37. Console.ReadKey();
  38. }

ps:目前生产是4台机器,按每秒10笔并发计算

结论:

1、入队性能800笔/s

2、单线程出队性能714笔/s

3、40并发2631笔每秒

ps:

环境说明:reids部署在32位suse上,程序是我本地用.net写的

后续:

1、入队要做一个守护进程去定时处理,考虑在linux放个java程序由contab调度。

2、出队没有券时的业务场景考虑

记redis的一个测试的更多相关文章

  1. 为redis分配一个新的端口

    为redis分配一个8888端口,操作步骤如下:1.$REDIS_HOME/redis.conf重新复制一份,重命名为redis8888.conf.2.打开redis8888.conf配置文件,找到p ...

  2. 使用redis设计一个简单的分布式锁

    最近看了有关redis的一些东西,了解了redis的一下命令,就记录一下: redis中的setnx命令: 关于redis的操作命令,我们一般会使用set,get等一系列操作,数据结构也有很多,这里我 ...

  3. 基于 Vue + Koa2 + MongoDB + Redis 实现一个完整的登录注册

    项目地址:https://github.com/caochangkui/vue-element-responsive-demo/tree/login-register 通过 vue-cli3.0 + ...

  4. [日常] Redis基本使用测试

    Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(list ...

  5. 什么鬼,面试官竟然让我用Redis实现一个消息队列!!?

    GitHub 9.4k Star 的Java工程师成神之路 ,不来了解一下吗? GitHub 9.4k Star 的Java工程师成神之路 ,真的不来了解一下吗? GitHub 9.4k Star 的 ...

  6. 手把手教你用redis实现一个简单的mq消息队列(java)

    众所周知,消息队列是应用系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构.目前使用较多的消息队列有 ActiveMQ,RabbitMQ,Zero ...

  7. Java基础-继承-编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight。小车类Car是Vehicle的子类,其中包含的属性有载人数 loader。卡车类Truck是Car类的子类,其中包含的属性有载重量payload。每个 类都有构造方法和输出相关数据的方法。最后,写一个测试类来测试这些类的功 能。

    #29.编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight.小车类Car是Vehicle的子类,其中包含的属性有载人数 loader.卡车类T ...

  8. soapui中文操作手册(二)----通过您的WSDL请求创建一个测试

      1.通过您的WSDL请求创建一个测试 点击加号旁边的导航拓展项目树的Web服务,并选择请求: 在SoapUI Pro中,所述请求编辑出现在右边.SoapUI Pro有一个编辑器,它简化了XML的层 ...

  9. PHP + Redis 实现一个简单的twitter

    原文位于Redis官网http://redis.io/topics/twitter-clone Redis是NoSQL数据库中一个知名数据库,在新浪微博中亦有部署,适合固定数据量的热数据的访问. 作为 ...

随机推荐

  1. C++ 中复杂的声明

    1.方法也是有类型的,方法的类型由返回类型和形参表决定.比如int F (int)的类型就是去掉方法名,int (int). 2.对于方法类型,在返回类型和形参表之间,加上一个名称F,就表示一个特定的 ...

  2. CDOJ 481 Apparent Magnitude 水题

    Apparent Magnitude Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/sh ...

  3. leetcode || 53、Maximum Subarray

    problem: Find the contiguous subarray within an array (containing at least one number) which has the ...

  4. NDK环境配置

    1.下载安装插件:com.android.ide.eclipse.ndk_23.0.2.1259578.jar      copy到E:\eclipse\adt-bundle-windows-x86- ...

  5. ASP.NET 去除所有HTML标记的方法

    using System.Text.RegularExpressions /// <summary> /// 去除HTML标记 /// </summary> /// <p ...

  6. 基于 Jenkins 快速搭建持续集成环境--转

    源地址:http://www.ibm.com/developerworks/cn/java/j-lo-jenkins/ 持续集成是一种软件开发实践,对于提高软件开发效率并保障软件开发质量提供了理论基础 ...

  7. MDI/MDIX接口

    转载:http://blog.chinaunix.net/uid-24148050-id-137067.html MDI/MDIX is a type of Ethernet port connect ...

  8. 在 CentOS 中编译安装 VIM 7.3

    转载:http://blog.csdn.net/zhanglyung/article/details/6204574 默认安装的 Vim 不带有多字符支持,所以不支持中文.无论是将 CentOS 本来 ...

  9. 炼数成金hadoop视频干货06-10

    视频地址:http://pan.baidu.com/s/1dDEgKwD 第六课统讲了hadoop几个子项目和HBase,第七课还是讲的HBase 第八课讲了PIG 第九课讲了Hive和Zookeep ...

  10. ASP.NET弹出模态对话框【转】

    主页面 PageBase.aspx.cs 中的代码 protected void Page_Load(object sender, EventArgs e) {    if (!this.IsPost ...