Как получить значение по ключу с помощью StackExchange.Redis - PullRequest
0 голосов
/ 23 марта 2020

У меня есть удаленный компьютер с 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}");            
    }
}

Я получаю вывод, подобный этому:

enter image description here

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);
    }
}
...