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. 调整Win7中TCP/IP半开连接数限制

    调整Win7中TCP/IP半开连接数限制      相信大家都有过这样的经历,普通的ADSL宽带下,打开下载工具下载资源时,再想浏览网页就会变得非常困难了,Windows7中也未能幸免.   究其原因 ...

  2. Getting Started With Hazelcast 读书笔记(第一章)

    第一章:数据集群的演化与 早期的服务器架构 显然,应用是可扩展的,但是由于是集中式服务器,随着数据库性能达到极限,再想扩展就变得极端困难,于是出现了缓存.    缓存显然再次提升了可扩展性,减轻了数据 ...

  3. C#时间戳转成php的time()

    DateTime timeStamp = new DateTime(1970,1,1);  //得到1970年的时间戳 long a = (DateTime.UtcNow.Ticks - timeSt ...

  4. PoEduo - C++阶段班【Po学校】-Lesson03-5_运算符重载- 第7天

    PoEduo - Lesson03-5_运算符重载- 第7天 复习前面的知识点 空类会自动生成哪些默认函数 6个默认函数    1  构造  2  析构   3  赋值  4 拷贝构造  5 oper ...

  5. 《笨办法学C》笔记之基础语法

    这篇笔记不怎么系统,只记录自己比较生疏的知识 变量定义 类型 定义 格式化符号 备注 整数 int %d 长整型 long %ld 单精度浮点 float %f 双精度浮点 double %f 字符 ...

  6. SQL 列转行的实现

    --列转行,逗号拼接指定列的值Oracle中写法:select wmsys.wm_concat(Field1) from TableASQL Server中写法:SELECT STUFF(( SELE ...

  7. X-UA-Compatible失效问题

    有时候发现页面中写了<meta http-equiv="X-UA-Compatible" content="IE=8" />,但是文档模式依旧没改变 ...

  8. Spring知识点总结大全(2)

    3.Spring的AOP 一.AOP(Aspect-oriented programming,面向切面编程): 什么是AOP? 定义:将程序中的交叉业务逻辑提取出来,称之为切面.将这些切面动态织入到目 ...

  9. I/O知识

    1.jdk1.4之前(jdk1.4开始提供了nio)的早起版本,java对I/O的支持并不完善,开发人员开发高性能I/O程序时,面临的问题主要有:     没有缓冲区,I/O性能存在问题     没有 ...

  10. winform初学

    一.建立winform工程项目