#object #redis #stackexchange.redis
#объект #redis #stackexchange.redis
Вопрос:
Здравствуйте, я получил redis в качестве объединительной платы для моего приложения SignalR, и я хочу, чтобы redis отправлял сообщение определенным группам, независимо от того, в каком экземпляре SignalR они находятся. Я получил настройку SignalR и redis проблема, с которой я сейчас сталкиваюсь, заключается в том, что я хочу отправить данные объектного типа, которые будут использоваться методом SignalR, который отправляет их клиенту. итак, сначала рассмотрим метод, который публикует
public async Task RedisBroadcast(string group, string message, object data)
{
var pub = Connection.GetSubscriber();
Program.WriteConsole($"> Broadcasting to Group: {group} Message: {message}");
await pub.PublishAsync(group, message);
}
мне нужно, чтобы данные параметра были отправлены с сообщением публикации, потому что позже были в методе, который получает сообщение, я хочу сделать что-то похожее на это
await sub.SubscribeAsync(group, (channel, message) =>
{
Program.WriteConsole("Got notification: " (string)message);
switch (message)
{
case "TopPlayers":
TopPlayersbroadcast(group, message, data);
break;
}
});
поэтому в зависимости от сообщения я вызываю разные методы, которые затем передают сообщение с данными всем дочерним клиентам. Возможно ли это каким-либо образом?
Ответ №1:
Это возможно, но вам нужно будет закодировать эти данные внутри вашей полезной нагрузки, то есть внутри message
тех RedisValue
данных, которые вы получаете в (channel, message)
паре. Библиотека SE.Redis намеренно не придерживается мнения о том, как должны выглядеть полезные нагрузки, поэтому она не предполагает, что вы хотите закодировать что-то подобное. Обратите внимание, что, поскольку это RedisValue
, а не a string
, вы можете выполнять некоторые более тонкие действия, чем просто передавать свой оригинал string message
.
Если бы это был я, я бы, вероятно, рассмотрел что-то вроде protobuf-net и наследования объектов в этом сценарии — поскольку a: это хорошо работает с SE.Redis, поскольку SE.Redis поддерживает двоичные полезные нагрузки, и b: наследование позволяет вам довольно легко представлять данные — предположительно, внедряя message
и data
в то же основное сообщение, что и базовый тип, но для похожих схем существует множество разных макетов.