记redis的一个测试

时间:2022-05-22 12:13:48

现有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、出队没有券时的业务场景考虑