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 = ;
while (true)
{
redisClient.RemoveAllFromList("list"); Thread thread = new Thread(() =>
{
using (RedisClient redisClient2 = new RedisClient(host))
{
for (int i = ; i < ; i++)
{
var now = DateTime.Now;
string v = now.ToString("O");
redisClient2.EnqueueItemOnList("list", v);
}
}
});
thread.Start(); List<TimeSpan> intervalArr = new List<TimeSpan>();
int index = ;
while (index < )
{
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 = ; i < ; i++)
{
socket2.Send(DateTime.Now.ToString("O"), Encoding.UTF8);
//socket.Receive();
} Thread.Sleep();
}
}
});
t.Start(); List<TimeSpan> intervalArr = new List<TimeSpan>();
for (int i = ; i < ; 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来存储的呢。

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

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

    一.redis实现主从复制-单机测试1.安装redis tar -zxvf redis-2.8.4.tar.gzcd redis-2.8.4make && make install2. ...

  2. Redis介绍及Jedis测试

    1.Redis简介 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes ...

  3. Redis 集群缓存测试要点--关于 线上 token 失效 BUG 的总结

    在测试账户系统过程中遇到了线上大面积用户登录态失效的严重问题,事后对于其原因及测试盲点做了一些总结记录以便以后查阅,总结分为以下7点,其中原理性的解释有些摘自网络. 1.账户系统token失效问题复盘 ...

  4. <正则吃饺子> :关于redis集群的测试demo

    redis集群的测试demo,来自网络,具体不详. 1.下载地址,如下:http://download.csdn.net/detail/u012543819/9729291 2.项目是java项目,结 ...

  5. 记一次织梦cms渗透测试

    记一次织梦cms渗透测试 0x01 前言 本次测试的整个流程:枚举用户名-针对性暴破-登录后台-后台编辑php文件getshell. 0x02 过程 1.登录功能模块存在用户名枚举缺陷,利用此权限先枚 ...

  6. 大数据学习day34---spark14------1 redis的事务(pipeline)测试 ,2. 利用redis的pipeline实现数据统计的exactlyonce ,3 SparkStreaming中数据写入Hbase实现ExactlyOnce, 4.Spark StandAlone的执行模式,5 spark on yarn

    1 redis的事务(pipeline)测试 Redis本身对数据进行操作,单条命令是原子性的,但事务不保证原子性,且没有回滚.事务中任何命令执行失败,其余的命令仍会被执行,将Redis的多个操作放到 ...

  7. redis的安装和测试

    redis一直都是调用别人部署好的,近日想要自己从灵开始搭建一次.其中也生出不少枝节,与各位猿友共同分享,望少走些弯路! 1.提前准备的资源 redis安装包(本人上传到csdn不需积分即可下载): ...

  8. 记一次Redis被攻击的事件

    最近几个月非常忙,所以很少有时间写博客,这几天终于闲了一些,于是就在整理平时的一些笔记.恰好这几天Redis服务器发生了问题,就记录一下. 我司有两款分别是2B和2C的App,类似于阿里旺旺的卖家版和 ...

  9. redis迁移工具-redis-migrate-tool使用测试

    https://github.com/vipshop/redis-migrate-tool一.安装redis-migrate-tool a.下载redis-migrate-tool软件包 https: ...

随机推荐

  1. nginx.conf详解

    ##定义nginx运行的用户各用户组user nginx nginx; ##nginx进程数,建议设置与cpu核心数一致worker_processes 1; #为每个进程分配CPU的工作内核 wor ...

  2. 深入理解Java虚拟机(二)、Java对象的创建,内存布局和访问定位

    对象的创建: Object obj = new Object(); 常量池中是否有Ljava.lang.Object

  3. 简单一键CENTOS6 安装PPTP VPN方法记录

    申明:我们使用PPTP VPN仅仅只能用在查阅资料等正规渠道,不要用在不良用途上.方法收集于网上,这里我用在搬瓦工VPS(VPS方案直达),采用的是CENTOS6 64位系统.我们需要预先将VPS服务 ...

  4. 安装CocoaPods碰到的问题

    1.安装完Pods后第一次使用pod install命令提示"Setting up CocoaPods master repo" 解决办法: 第一次使用pod命令时,先执行以下po ...

  5. [python] os.path说明

    os.path - Common pathname manipulations操作 This module implements some useful functions on pathnames. ...

  6. PMI列子1

    遍历得到PMI中,是注释类型的,你可以参考一下.int num_text, thetype, thesubtype;tag_t  draft_aid_tag = NULL_TAG;UF_UI_open ...

  7. 设置secureCRT支持中文

    将options菜单下面的session options 中的 appearance 标签页里面的 character encoding 选择UTF-8就可以.

  8. SVN使用总结

    ## 常用命令 建立分支 --- svn copy/cp svn cp http://example.com/repos/myproject/trunk http://example.com/repo ...

  9. Asp.net Mvc 身份验证、异常处理、权限验证(拦截器)实现代码

    本问主要介绍asp.net的身份验证机制及asp.net MVC拦截器在项目中的运用.现在让我们来模拟一个简单的流程:用户登录>权限验证>异常处理 1.用户登录 验证用户是否登录成功步骤直 ...

  10. Log

    Public Shared Sub WriteLog(ByVal FormID As String, ByVal ex1 As Exception) 'log信息 Dim loginfo As Str ...