首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StackExchange.Redis API: ListLeftPopAsync占用无限的时间或超时时间。

StackExchange.Redis API: ListLeftPopAsync占用无限的时间或超时时间。
EN

Stack Overflow用户
提问于 2016-09-08 09:44:29
回答 1查看 673关注 0票数 0

我们使用Redis列表来维护要由我们的C#应用程序处理的项目队列。应用程序使用StackExchange.Redis 1.0.488 (也称为SER)连接到Redis,并通过调用ListRightPushAsync和ListLeftPopAsync SER来处理列表。

我们主要是在验证一个场景,即当redis服务器不可用时,我们的应用程序将如何运行。

在应用程序忙于处理队列时重新启动Redis服务器后,我们注意到了一个问题。应用程序恢复处理一定数量的项目之后,我们看到一个问题,在这个问题上,ListLeftPopAsync花费无限的时间,应用程序挂起,没有任何例外。请注意,加载应用程序处理的数量很高,比如100000 items.Below是代码片段。

消费者层:

代码语言:javascript
复制
    public async Task<byte[]> DiscardProcessedItem()
    {
        var result = await ListLeftPopAsync(2, "2:l:queue1");
        return result;
    }

SER API包装器:

代码语言:javascript
复制
    public Task<byte[]> ListLeftPopAsync(int redisDb, string key)
    {
        var task = conn.GetDatabase(redisDb).ListLeftPopAsync(key);
        return Task.FromResult<byte[]>(task.Result);
    }

注意,syncTimeout是5000。

然后,我们尝试通过修改包装函数来使用同步SER,如下所示

代码语言:javascript
复制
    public byte[] ListLeftPopAsync(int redisDb, string key)
    {
        return conn.GetDatabase(redisDb).ListLeftPop(key);
    }

在进行此更改后,应用程序不会挂起,整个队列将被处理。但是,StackExchange.Redis在对少数项目执行ListLeftPop时抛出超时异常。异常粘贴在下面。

执行LPOP 2:l:队列1,inst: 1,ar: ProcessReadQueue,错误:从不,队列: 6,qs: 0,qc: 0,wr: 0,wq: 0,in: 260,ar:1,IOCP:(Busy=0,Free=1000,Min=4,Max=1000),WORKER:(Busy=0,Free=2047,Min=4,Max=2047),clientName: qc

任何线索都会很感激的。

EN

回答 1

Stack Overflow用户

发布于 2016-11-06 20:19:38

增加同步超时或使用堆栈交换库提供的某种异步机制。

代码语言:javascript
复制
 ConfigurationOptions co = new ConfigurationOptions()
    {
        SyncTimeout = 500000,
        EndPoints =
        {
            {url,portNumber }
        },
        AbortOnConnectFail = false // this prevents that error
    };

    seClient = ConnectionMultiplexer.Connect(co);

当您使用旧版本的客户端时,这种情况也可能发生

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39387637

复制
相关文章

相似问题

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