У меня есть удаленный компьютер с Redis. Я слушаю события из него, используя простой C# клиент:
public partial class VerificationResultsService : ServiceBase
{
private const string ChatChannel = "__keyevent@0__:hset";
public void Start()
{
using (ConnectionMultiplexer muxer =
ConnectionMultiplexer.Connect(ConfigurationManager.AppSettings["ModuleControlRedisConnection"]))
{
muxer.GetServer(muxer.GetEndPoints().Single())
.ConfigSet("notify-keyspace-events", "KEA");
muxer.GetSubscriber().Subscribe(ChatChannel,
(channel, message) => MessageAction(message, channel, muxer));
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}
}
private static void MessageAction(RedisValue message, RedisChannel channel, ConnectionMultiplexer muxer)
{
Console.WriteLine($"received {message} on {channel}");
}
}
Я получаю вывод, подобный этому:
Guid-подобная часть (сообщение) вывода - это ключ в Redis. Как получить значение, связанное с этим ключом? Метод KeyType возвращает «Ha sh» для этого ключа.
Мне удалось достичь своей цели с помощью. Net Ядро с Microsoft.Extensions.Caching.StackExchangeRedis 3.1.2, но мне нужно. Net Framework Framework, потому что эта библиотека не для. Net Framework:
class Program
{
private const string ChatChannel = "__keyevent@0__:hset";
static void Main()
{
var serviceProvider = new ServiceCollection()
.AddStackExchangeRedisCache(options =>
{
options.ConfigurationOptions = new ConfigurationOptions()
{
Password = "",
EndPoints = { $"" },
};
})
.BuildServiceProvider();
var bar = serviceProvider.GetService<IDistributedCache>();
using var muxer = ConnectionMultiplexer.Connect("172.20.62.5:6379,allowAdmin=true");
muxer.GetServer(muxer.GetEndPoints().Single())
.ConfigSet("notify-keyspace-events", "KEA");
muxer.GetSubscriber().Subscribe(ChatChannel,
(channel, message) => MessageAction(message, channel, muxer, bar));
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}
private static async void MessageAction(RedisValue message, RedisChannel channel, ConnectionMultiplexer muxer, IDistributedCache bar)
{
MemoryStream resultMessage = new MemoryStream();
var info = bar.Get(message.ToString());
if (info != default(byte[]) && info.Length != 0)
await Decompess(info, resultMessage);
var value1 = Encoding.UTF8.GetString(resultMessage.ToArray());
Console.WriteLine(value1);
Console.WriteLine($"received {message} on {channel}");
}
private static async Task Decompess(byte[] loadedData, MemoryStream result)
{
await using var input = new MemoryStream(loadedData);
await using var zipStream = new GZipStream(input, CompressionMode.Decompress);
await zipStream.CopyToAsync(result);
}
}