现有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. linux重启oracle 各种方法

    在linux下重启oracle数据库及监听器总结: 方法1: 用root以ssh登录到linux,打开终端输入以下命令: cd $ORACLE_HOME   #进入到oracle的安装目录 dbsta ...

  2. redis list 使用

    参考:http://redis.cn/commands.html#list BLPOP key [key ...] timeout删除,并获得该列表中的第一元素,或阻塞,直到有一个可用 BRPOP k ...

  3. CentOS 6.5安装MySQL中文乱码问题解决

    不管是Linux还是Windows都有新手遇到MySQL服务安装好了之后写入中文发现乱码,今天我装了个CentOS 6.5也遇到了这个问题,现在解决了,分享一下经验. 1.首先安装mysql,我很怕麻 ...

  4. Java网页数据采集器[续篇-远程操作]【转载】

    本期概述 上期我们学习了html页面采集后的数据查询, 但这仅仅是在本地查询数据库,如果我们想通过远程操作来进行数据的采集,存储和查询,那又该怎么做呢? 今天我们一起来学习下:如何通过本地客户端远程访 ...

  5. Android开发之初识Camera图像采集

    /* * Android开发之初识camera图像采集 * 北京Android俱乐部群:167839253 * Created on: 2011-8-24 * Author: blueeagle * ...

  6. [MEAN Stack] First API -- 4. Organize app structure

    The app structure: Front-end: app.js /** * Created by Answer1215 on 12/9/2014. */ 'use strict'; func ...

  7. 分享php中四种webservice实现的简单架构方法及实例(转)

    本人所了解的webservice有以下几种:PHP本身的SOAP,开源的NUSOAP,商业版的PHPRPC,以及使用二进制传输数据流的 HessianPHP,那么一下就简单的介绍下这几种webserv ...

  8. starling 笔记

    ------------------------------------------------------------------ 这里的舞台是flash原生舞台,不是starling舞台 // r ...

  9. divide-conquer-combine(4.1 from the introduction to algorithm)

    this example is from chapter 4 in <the introduction to algorithm> the main idea is all showed ...

  10. How to Setup Replicated LevelDB Persistence in Apache ActiveMQ 5.9--转载

    原文地址:https://simplesassim.wordpress.com/2013/11/03/how-to-setup-replicated-leveldb-persistence-in-ap ...