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

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

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

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

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. 【不积跬步,无以致千里】vim复制

    用vim这么久 了,始终也不知道怎么在vim中使用系统粘贴板,通常要在网上复制一段代码都是先gedit打开文件,中键粘贴后关闭,然后再用vim打开编辑,真的不 爽:上次论坛上有人问到了怎么在vim中使 ...

  2. IT项目管理工具总结(转载)

    以前用过一个cs版的忘记叫啥名了,还用个禅道,感觉一般“5. 测试管理: 项目软件缺陷Bug状态跟踪”在公司内部自己测试或者试用期上线后后期维护阶段用的多,有的公司单独做个系统让用户提问题来修改,也是 ...

  3. 【M4】非必要不提供default 构造方法

    1.default 构造方法意味着,没有外来信息的情况下,进行初始化,构造出一个对象.对于有些对象是很合理的,比如数值之类的对象,可以初始化为0:对于指针之类的对象,初始化为null:对于集合如vec ...

  4. 批量导出表数据到CSV文件

    需求:把oracle数据库中符合条件的N多表,导出成csv文本文件,并以表名.csv为文件名存放. 实现:通过存储过程中UTL_FILE函数来实现.导出的csv文件放入提前创建好的directory中 ...

  5. Pimp_my_Z1

    https://github.com/Androguide/Pimp_my_Z1 Pimp_my_Z1-master.zip

  6. python手记(50)

    #!/usr/bin/env python # -*- coding: utf-8 -*- #http://blog.csdn.net/myhaspl #code:myhaspl@qq.com imp ...

  7. Panopticon跨平台的逆向工程反汇编工具

    http://www.freebuf.com/sectool/104045.html Panopticon 使用GPLv3授权许可,其免费. 项目文档:https://panopticon.re. 问 ...

  8. 高并发网络编程之epoll详解

    select.poll和epoll的区别 在linux没有实现epoll事件驱动机制之前,我们一般选择用select或者poll等IO多路复用的方法来实现并发服务程序.在大数据.高并发.集群等一些名词 ...

  9. Java元组类型之javatuples

    转载:Java元组类型之javatuples 关于方法的返回值,经常需要返回2个值或多个值的一个序列,比如数据表的一条记录,文件的一行内容等.除了使用数组Array.集合(List.Set.Map)这 ...

  10. Java_Utils框架

    Spring Utils https://github.com/tangyanbo/springmore