记一次Redis和NetMQ的测试

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis是一个高速缓存K-V数据库,而NetMQ是ZeroMQ的C#实现版本,两者是完全不同的东西。 最近做游戏服务器的时候想到,如果选择一个组件来做服务器间通信的话,ZeroMQ绝对是一个不错的选择,而我们的服务器是用C#的开发的,就这样,找到了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();

                }
View Code

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

 

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

 

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
3月前
|
NoSQL 测试技术 Redis
Redis 性能测试
10月更文挑战第21天
61 2
|
3月前
|
存储 NoSQL 大数据
大数据-51 Redis 高可用方案CAP-AP 主从复制 一主一从 全量和增量同步 哨兵模式 docker-compose测试
大数据-51 Redis 高可用方案CAP-AP 主从复制 一主一从 全量和增量同步 哨兵模式 docker-compose测试
46 3
|
3月前
|
存储 Prometheus NoSQL
大数据-44 Redis 慢查询日志 监视器 慢查询测试学习
大数据-44 Redis 慢查询日志 监视器 慢查询测试学习
35 3
|
3月前
|
缓存 NoSQL Ubuntu
大数据-39 Redis 高并发分布式缓存 Ubuntu源码编译安装 云服务器 启动并测试 redis-server redis-cli
大数据-39 Redis 高并发分布式缓存 Ubuntu源码编译安装 云服务器 启动并测试 redis-server redis-cli
66 3
|
5月前
|
NoSQL Java Linux
Redis6入门到实战------ 六、Redis_Jedis_测试
这篇文章介绍了如何使用Jedis客户端连接Redis,并进行基本的数据类型操作测试,包括字符串、列表、集合、哈希和有序集合的相关API使用示例。
Redis6入门到实战------ 六、Redis_Jedis_测试
|
5月前
|
缓存 NoSQL 测试技术
【Azure Redis 缓存 Azure Cache For Redis】使用Redis自带redis-benchmark.exe命令测试Azure Redis的性能
【Azure Redis 缓存 Azure Cache For Redis】使用Redis自带redis-benchmark.exe命令测试Azure Redis的性能
|
5月前
|
缓存 NoSQL 网络协议
【Azure Redis 缓存 Azure Cache For Redis】在创建高级层Redis(P1)集成虚拟网络(VNET)后,如何测试VNET中资源如何成功访问及配置白名单的效果
【Azure Redis 缓存 Azure Cache For Redis】在创建高级层Redis(P1)集成虚拟网络(VNET)后,如何测试VNET中资源如何成功访问及配置白名单的效果
|
16天前
|
监控 JavaScript 测试技术
postman接口测试工具详解
Postman是一个功能强大且易于使用的API测试工具。通过详细的介绍和实际示例,本文展示了Postman在API测试中的各种应用。无论是简单的请求发送,还是复杂的自动化测试和持续集成,Postman都提供了丰富的功能来满足用户的需求。希望本文能帮助您更好地理解和使用Postman,提高API测试的效率和质量。
66 11
|
2月前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
69 3
|
3月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
82 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)