记一次Redis和NetMQ的测试

Redis是一个高速缓存K-V数据库,而NetMQ是ZeroMQ的C#实现版本,两者是完全不同的东西。

最近做游戏服务器的时候想到,如果选择一个组件来做服务器间通信的话,ZeroMQ绝对是一个不错的选择,而我们的服务器是用C#的开发的,就这样,找到了NetMQ。

NetMQ上手很简单。总结一下大致如下几个步骤:

  1. NuGet安装类库引用
  2. 创建NetMQContext
  3. 根据需要的通讯模型创建NetMQSocket
  4. 监听socket.Bind()或者连接socket.Connect()
  5. 发送socket.Send()或者接收socket.Receive()
  6. 释放NetMQSocket和NetMQContext

简单的代码如下

using (var context = NetMQContext.Create())
using (var socket = context.CreatePullSocket())
{
    socket.Bind("ipc://111");//socket.Connect("ipc://111");
    string msg = socket.ReceiveFrameString(Encoding.UTF8);
}

测试NetMQ的时候,发现如果开启了VS的异常捕获,在Connect的时候会收到不少异常,不过这些异常NetMQ都捕获处理了,似乎不会导致程序问题,当然强迫症患者就不好办了。

而且当消化队列的服务器吃紧的时候队列中的积压数量的查看、保存等等的确也是需要不少工作量的。

于是想到不如再加个中间件,这个时候Redis就冒出来了。

Redis的list也可以用来做队列,而且配套的工具也多了,感觉不错的样子。那就不如测试下性能吧。

因为手头的Linux机在阿里云上,本地测试的话只有Windows可以用,所以,安装了Redis的Windows版,地址在这里:https://github.com/MSOpenTech/redis

直接下载Release版的就可以了,创建service-redis.exe的快捷方式,右键属性,在目标的路径后面追加配置文件,就像这样:D:\Redis\redis-server.exe redis.windows.conf

(懒汉不愿意操作命令行的简便方式)

然后双击运行,看到漂亮的文字图形之后,Redis就开动了。

接着是C#的对接,创建项目工程之后NuGet安装Redis的Client驱动,流行的是Service.Stack.Redis,但Service.Stack在v4之后商业化了,免费使用有限制,随手测下add1000次就出现了每小时只能add 6000的异常。所以不用它,换NServiceKit.Redis,有介绍是免费分支。

简单的Add示例如下

using (RedisClient redisClient = new RedisClient(host))
{
    redisClient.Add("key1", "hello world!");
}

而我要使用的是list的Enqueue和Dequeue,就是这样:

redisClient.EnqueueItemOnList("testList", "hello");
string msg = redisClient.DequeueItemOnList("testList");

测试是酱紫的:

首先开一个线程专注生产消息,生产的就是当时的时间。然后当前线程专注消费消息,获取到消息生产的时间和消费到的时间,算出时间差,保存。

最后输出消息总数、发送和接收用的平均时间。

我测试了10000个消息,差不多是这样的代码:

int time = 0;
while (true)
{
    redisClient.RemoveAllFromList("list");

    Thread thread = new Thread(() =>
    {
        using (RedisClient redisClient2 = new RedisClient(host))
        {
            for (int i = 0; i < 10000; i++)
            {
                var now = DateTime.Now;
                string v = now.ToString("O");
                redisClient2.EnqueueItemOnList("list", v);
            }
        }
    });
    thread.Start();

    List<TimeSpan> intervalArr = new List<TimeSpan>();
    int index = 0;
    while (index < 10000)
    {
        string item = redisClient.DequeueItemFromList("list");
        if (item != null)
        {
            index++;
            DateTime from = DateTime.Parse(item);
            var interval = DateTime.Now - from;
            intervalArr.Add(interval);
        }
    }
    Console.WriteLine("第{1}次,平均耗时:{0}, 数量:{2}", intervalArr.Average(x => x.TotalMilliseconds), time, intervalArr.Count);
    time++;
    Console.ReadLine();
}

使用NetMQ的代码也差不多这个意思。

                using (var context = NetMQContext.Create())
                using (var socket = context.CreatePullSocket())
                {
                    socket.Bind("ipc://111");
                    Thread t = new Thread(() =>
                    {
                        using (var context2 = NetMQContext.Create())
                        {
                            using (var socket2 = context2.CreatePushSocket())
                            {
                                socket2.Connect("ipc://111");
                                for (int i = 0; i < 10000; i++)
                                {
                                    socket2.Send(DateTime.Now.ToString("O"), Encoding.UTF8);
                                    //socket.Receive();
                                }

                                Thread.Sleep(1);
                            }
                        }
                    });
                    t.Start();

                    List<TimeSpan> intervalArr = new List<TimeSpan>();
                    for (int i = 0; i < 10000; i++)
                    {
                        string word = socket.ReceiveFrameString(Encoding.UTF8);
                        var from = DateTime.Parse(word);
                        var to = DateTime.Now;
                        var interval = to - from;
                        intervalArr.Add(interval);
                    }
                    Console.WriteLine("第{1}次,平均耗时:{0}, 数量:{2}", intervalArr.Average(x => x.TotalMilliseconds), time, intervalArr.Count);
                    time++;
                    Console.ReadLine();

                }

预想的毫无疑问应该是ZeroMQ系的NetMQ更快,点对点的通讯和本地缓存比使用Redis少了和第三方(Redis)的交互,但实际测试下来,发现在数量级上没有多大的区别,而且隐隐还是使用Redis比较快。

测试做到这里,虽然不是很精确,也不知道NetMQ缺了啥,总之这样的比较结果坚定了我使用Redis的心,何况游戏数据也有很多地方需要仰仗Redis来存储的呢。

时间: 2024-11-11 11:50:25

记一次Redis和NetMQ的测试的相关文章

Redis安装及简单测试

题目链接:11645 - Bits 题意:给定一个数字n,要求0-n的二进制形式下,连续11的个数. 思路:和 UVA 11038 这题类似,枚举中间,然后处理两边的情况. 不过本题最大的答案会超过longlong,要用高精度,不过借鉴http://www.cnblogs.com/TO-Asia/p/3214706.html这个人的方法,直接用两个数字来保存一个数字,这样能保存到2个longlong的长度,就足够存放这题的答案了. 代码: #include <stdio.h> #include

redis实现主从复制-单机测试

一.redis实现主从复制-单机测试1.安装redis tar -zxvf redis-2.8.4.tar.gzcd redis-2.8.4make && make install2.配置主从关系需要在slave服务器的redis.conf中配置slaveof 192.168.1.1 6379 #指定master的ip和端口具体配置见下:cp redis.conf redis-master-6379.confvi2 redis-master-6379.conflogfile "/

Redis介绍及Jedis测试

1.Redis简介 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询. Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱

Ubuntu 14.04下Redis安装及简单测试

摘要: Redis是目前业界非常受到欢迎的一个内存数据库,一般用作系统的中间缓存系统,用以提升整体商业系统的吞吐量和响应速度.本文将简要介绍安装的主要过程以及给出一个简要的测试代码. 1.  系统环境和版本说明 Linux操作系统选用Ubuntu 14.04, Redis的版本选取目前的最新稳定版本redis-3.07. 客户端选用了Redis的Java版本jedis 2.4.2. 2.  Redis的安装步骤 a. 下载Redis的安装包 wget http://download.redis.

Redis主从复制配置及测试

1. redis配置文件常用选项说明 daemonize no 说明:是否把redis-server启动在后台,默认是"否".若改成yes,会生成一个pid文件. pidfile /var/run/redis.pid 说明:redis-server的pid文件. port 6379 说明:redis-server的端口号 dbfilename dump.rdb 说明:数据库文件的位置,最好添加绝对路径,若不添加时在启动用户的home目录下. slaveof 说明:设置主从服务器的主服务

redis安装;配置;启动;测试

Redis官方是不支持windows的,只是 Microsoft Open Tech group 在 GitHub上开发了一个Win64的版本,项目地址是:https://github.com/MSOpenTech/redis/releases 下载后直接解压,然后用redis-server  redis.windows.conf 启动,可以将其保存为文件 startup.bat ; 下次就可以直接启动了. 然后可以使用自带的客户端工具进行测试,双击打开 redis-cli.exe , 如果不报

REDIS的几个测试结果

场景一:对单一键大并发量增加(INC)操作,模拟对热点产品的库存修改 测试点:   原子性,保证最后的键值等于所有键值增加操作的总和性能,   保证在大并发量下写操作的性能没有大的降低 线程数 100次INC操作的平均时间 服务端数据 10 140 instantaneous_ops_per_sec(每秒处理指令数):342instantaneous_input_kbps(每秒读字节数):10.70instantaneous_output_kbps(每秒写字节数):1.90used_cpu_sy

redis安装配置与测试

phpredis: https://github.com/nicolasff/phpredis http://www.cnblogs.com/ikodota/archive/2012/03/05/php_redis_cn.html http://redisdoc.com/ window安装:http://windows.php.net/downloads/pecl/snaps/redis/2.2.5/ extension=php_igbinary.dllextension=php_redis.d

Redis Master-Slave 读写分离测试

1 master/slave server 启动 利用默认redis.conf配置文件启动master server,端口6379 . [7304] 29 Aug 09:57:26 - 0 clients connected (0 slaves), 673996 bytes in use [7304] 29 Aug 09:57:31 - DB 0: 15 keys (0 volatile) in 16 slots HT. [7304] 29 Aug 09:57:31 - 0 clients co