在本文中,将学习如何使用C#(.NET Core) 和 Redis 创建一个非常简易的聊天应用。将探讨这个应用程序需要考虑的事项,以及后续可能的改进方向。
Redis是一个开源的内存数据结构存储系统,它被用作数据库、缓存和消息代理。Redis是NoSQL数据库之一,本质上是一个键/值存储系统,但它还具有一些其他强大的功能,其中之一就是pub/sub(发布/订阅)功能。
为了跟随本文并开始编码,需要以下条件:
根据维基百科的定义,发布-订阅是一种消息模式,其中消息的发送者(称为发布者)并不直接将消息发送给特定的接收者(称为订阅者),而是将发布的消息分类到类别中,而不知道是否有任何订阅者。同样,订阅者对一个或多个类别表示兴趣,并且只接收感兴趣的消息,而不知道是否有任何发布者。
正如之前提到的,Redis不仅仅是一个键/值服务器,它也是一个消息服务器。使用Redis,可以进行发布-订阅。Redis对其pub/sub(或发布-订阅)功能有良好的文档支持。简单来说,Redis发布-订阅允许在进程之间进行快速的消息传递和通信。
在本节中,将使用C#创建一个非常简易的聊天应用,代码行数仅为55行。本文假设使用的是Visual Studio。
首先,使用.NET Core创建一个控制台应用程序,可以将其命名为"SimpleChatApp"。然后,需要获取/安装这个NuGet包:StackExchange.Redis,这是.NET语言(C#等)的Redis客户端库,建议查看文档。
将逐步进行。首先,需要创建与Redis的连接。
using StackExchange.Redis;
using System;
namespace SimpleChatApp {
class Program {
private const string RedisConnectionString = "localhost";
private static ConnectionMultiplexer connection = ConnectionMultiplexer.Connect(RedisConnectionString);
private const string ChatChannel = "Chat-Simple-Channel";
private static string userName = string.Empty;
static void Main() {
Console.WriteLine("Hello World!");
}
}
}
ConnectionMultiplexer实现了IDisposable接口,通常需要在整个应用程序的生命周期中重用该对象。在上面的代码中,没有使用using块,因为在关闭控制台应用程序后,它将自动被处理。
对于连接字符串配置,可以使用Microsoft Azure缓存或其他云服务的Redis,而不是使用localhost。有关配置文档,可以查看这里。
继续在Main()方法中编写以下代码:
static void Main() {
// 输入名称并将其放入变量userName
Console.Write("Enter your name: ");
userName = Console.ReadLine();
// 创建pub/sub
var pubsub = connection.GetSubscriber();
// 订阅者订阅频道
pubsub.Subscribe(ChatChannel, (channel, message) => MessageAction(message));
// 如果加入,通知订阅者
pubsub.Publish(ChatChannel, $"'{userName}' joined the chat room.");
// 这里进行消息传递
while (true) {
pubsub.Publish(ChatChannel, $"{userName}: {Console.ReadLine()} " +
$"({DateTime.Now.Hour}:{DateTime.Now.Minute})");
}
}
private static void MessageAction(RedisValue message) {
// 将稍后实现它,以显示消息。
throw new NotImplementedException();
}
从上面的代码中,可以看到,为了订阅,需要将频道名称作为第一个参数传递,然后将处理器/回调作为第二个参数传递。对于第二个参数,传递了一个带有两个参数的动作,即频道和消息。对于动作,创建了MessageAction。不需要频道对象,因为只关心消息。对于发布消息,就像之前的PUBLISH命令一样,需要传递频道名称,然后是消息本身。
使用MessageAction来打印消息,让用下面的代码编写方法:
static void MessageAction(string message) {
int initialCursorTop = Console.CursorTop;
int initialCursorLeft = Console.CursorLeft;
Console.MoveBufferArea(0, initialCursorTop, Console.WindowWidth, 1, 0, initialCursorTop + 1);
Console.CursorTop = initialCursorTop;
Console.CursorLeft = 0;
// 在这里打印消息
Console.WriteLine(message);
Console.CursorTop = initialCursorTop + 1;
Console.CursorLeft = initialCursorLeft;
}
让把所有内容放在一起,代码将如下所示:
using StackExchange.Redis;
using System;
namespace SimpleChatApp {
class Program {
private const string RedisConnectionString = "localhost";
private static ConnectionMultiplexer connection = ConnectionMultiplexer.Connect(RedisConnectionString);
private const string ChatChannel = "Chat-Simple-Channel";
private static string userName = string.Empty;
static void Main() {
// 输入名称并将其放入变量userName
Console.Write("Enter your name: ");
userName = Console.ReadLine();
// 创建pub/sub
var pubsub = connection.GetSubscriber();
// 订阅者订阅频道
pubsub.Subscribe(ChatChannel, (channel, message) => MessageAction(message));
// 如果加入,通知订阅者
pubsub.Publish(ChatChannel, $"'{userName}' joined the chat room.");
// 这里进行消息传递
while (true) {
pubsub.Publish(ChatChannel, $"{userName}: {Console.ReadLine()} " +
$"({DateTime.Now.Hour}:{DateTime.Now.Minute})");
}
}
static void MessageAction(string message) {
int initialCursorTop = Console.CursorTop;
int initialCursorLeft = Console.CursorLeft;
Console.MoveBufferArea(0, initialCursorTop, Console.WindowWidth, 1, 0, initialCursorTop + 1);
Console.CursorTop = initialCursorTop;
Console.CursorLeft = 0;
// 在这里打印消息
Console.WriteLine(message);
Console.CursorTop = initialCursorTop + 1;
Console.CursorLeft = initialCursorLeft;
}
}
}
就是这样!构建项目。
请注意,如果使用.NET Core,可以使用此命令(在输出DLL目录,bin/Debug或bin/Release)在命令提示符或终端(如果使用的是Linux)运行应用程序:
dotnet SimpleChatApp.dll
让看看它是如何工作的。
创建了一个聊天应用,只是为了好玩!只要它连接到Redis(或云服务中的Redis),就可以聊天。
需要知道,对于这个应用程序,默认情况下每个应用程序都会打开/创建Redis连接,这并不理想。如果使用Microsoft Azure服务或其他一些云服务的Redis,那里有最大客户端连接数的限制。
还值得一提的是,默认情况下,StackExchange.Redis客户端库会打开两个Redis连接,一个用于交互命令,一个用于pub/sub。因此,这个应用程序创建了两个Redis连接(每个应用程序)。如果安装了Redis,可以使用此命令查看Redis连接的统计信息:
redis-cli --stat
请记住,这只是一个非常简单的聊天应用,但仍然可以使用它来娱乐,了解注意事项。如果使用客户端-服务器应用程序,并且将其托管在某个地方,那会更好。