c# - 如何准备一个推送和弹出到 redis 队列的控制台应用程序?

标签 c# asp.net redis queue stackexchange.redis

我需要准备一个包含 3 个按钮的控制台应用程序,一个用于将元素添加到 Redis 队列,一个用于从队列中弹出元素,一个用于显示队列中的元素。我是 C# 和 Redis 的新手。谁能帮我解决这个问题,或者给我一些资源。

我已经编写了与 Redis 数据库的连接,并且能够设置和获取变量。

using System;
using StackExchange.Redis;
namespace RedisConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            ConnectionMultiplexer redisCon = ConnectionMultiplexer.Connect("localhost");
            IDatabase db = redisCon.GetDatabase();
            //db.Lis
            db.StringSet("foo", "dog");
            string val = db.StringGet("foo");
            Console.WriteLine("output is {0}", val);
            Console.ReadKey(); 
        }
    }
}

最佳答案

像那样写一个 channel 订阅者

public class RedisHostingRunner : HostedService
{
    private readonly IServiceProvider _serviceProvider;
    IRedisSubscriber _subscriber;

    public RedisHostingRunner(IServiceProvider serviceProvider)
    {
        _serviceProvider = serviceProvider;
        _subscriber = _serviceProvider.GetRequiredService<RedisSubscriber>();
    }

    protected override async Task ExecuteAsync(CancellationToken cancellationToken)
    {
        //while (!cancellationToken.IsCancellationRequested)
        //{
            _subscriber.SubScribeChannel();
            //await Task.Delay(TimeSpan.FromSeconds(60), cancellationToken);
        //}
    }

    public Task ShutdownAsync(CancellationToken cancellationToken = default)
    {
        return Task.CompletedTask;
    }
}

然后在您的订阅者中设置一个消息处理程序

    public void SubScribeChannel()
    {
        _logger.LogInformation("!SubScribeChannel started!!");

        string channelName = _config.ActiveChannelName;
        var pubSub = _connectionMultiplexer.GetSubscriber();
        try
        {
            pubSub.Subscribe(channelName, async (channel, message) => await MessageActionAsync(message, channel));
        }
        catch(Exception ex)
        {
            _logger.LogInformation(String.Format("!error: {0}", ex.Message));
        }
        Debug.WriteLine("EOF");
    }

在你的处理程序中做你的工作

    private async Task MessageActionAsync(RedisValue message, string channel)
    {
        try
        {
            Transformer t = new Transformer(_logger);
            _logger.LogInformation(String.Format("!SubScribeChannel message received on message!! channel: {0}, message: {1}", channel, message));
            string transformedMessage = Transformer.TransformJsonStringData2Message(message);
            List<Document> documents = Transformer.Deserialize<List<Document>>(transformedMessage);

            await MergeToMongoDb(documents, channel);
            _logger.LogInformation("!Merged");
        }
        catch (Exception ex)
        {
            _logger.LogInformation(String.Format("!error: {0}", ex.Message));
        }
    }

关于c# - 如何准备一个推送和弹出到 redis 队列的控制台应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56642072/

相关文章:

asp.net - 将参数传递给 BeginGetRequestStream

asp.net - 在 VB.NET 中获取 CheckBoxList 的所有选中值

redis - 导入 SignalR.Redis 包导致 SignalR 错误

node.js - 在 Node.js 中从 Redis 中检索各种哈希值

c# - 使用 Fluent API 为没有导航属性的实体定​​义外键

c# - WebAPI 不发送数据

c# - 数据表填充对象

asp.net - 连接到防火墙后面的 MSSQL 服务器

node.js - 如何使用 hashmap( HSET ) 在 redis 中存储 Json

c# - 为什么在 MVC 1 中工作的 ajax 在 MVC3 中不能工作?