首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何准备一个推入和弹出到redis队列的控制台应用程序?

如何准备一个推入和弹出到redis队列的控制台应用程序?
EN

Stack Overflow用户
提问于 2019-06-18 13:07:36
回答 1查看 53关注 0票数 1

我需要准备一个带有3个按钮的控制台应用程序,一个用于向Redis队列添加元素,一个用于从队列中弹出元素,另一个用于显示队列中的元素。我是C#和Redis的新手。有没有人可以帮我,或者给我提供一些资源。

我已经编写了连接到Redis DB的代码,并且能够设置和获取变量。

代码语言:javascript
复制
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(); 
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2019-06-18 16:26:08

像这样编写一个通道订阅者

代码语言:javascript
复制
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;
    }
}

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

代码语言:javascript
复制
    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");
    }

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

代码语言:javascript
复制
    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));
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56642072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档