首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BookSleeve BlockingRemoveLeft只返回一些被推到列表中的项

BookSleeve BlockingRemoveLeft只返回一些被推到列表中的项
EN

Stack Overflow用户
提问于 2014-01-11 06:03:41
回答 1查看 1.2K关注 0票数 4

我正在尝试基于BookSleeve构建一个超级简单的队列示例。

以下是到目前为止队列消费者方面的内容:

代码语言:javascript
复制
using System;
using System.Text;
using BookSleeve;

static class Program
{
    static void Main()
    {
        using (var redis = new RedisConnection("127.0.0.1"))
        {
            redis.Open();
            while (true)
            {
                // BRPOP the queue
                var t = redis.Lists.BlockingRemoveFirst(0, new[] { "test" }, 0);
                t.Wait();
                var val = Encoding.UTF8.GetString(t.Result.Item2);
                Console.WriteLine("Got: {0}", val);
            }
        }
    }
}

我作为制片人在LINQPad中运行了以下内容:

代码语言:javascript
复制
using(var redis = new RedisConnection("localhost")) 
{
    redis.Open();
    foreach(var i in Enumerable.Range(0, 10)) 
    {
        // LPUSH
        redis.Lists.AddFirst(0, "test", "foo" + i)
            // Call wait to keep things in order
            .Wait();
    }   

    Thread.Sleep(500); // Let Redis do it's thing
    Console.WriteLine("queue length: " + redis.Lists.GetLength(0, "test").Result);
}

不过,我得到了一些非常奇怪的结果:

第一轮:

代码语言:javascript
复制
Got: foo2
Got: foo5
Got: foo7
Got: foo9

第二轮:

代码语言:javascript
复制
Got: foo1
Got: foo4
Got: foo7

第三轮:

代码语言:javascript
复制
Got: foo0
Got: foo3
Got: foo6
Got: foo8

而且,每次运行之后,LINQPad输出:queue length: 0,并使用实际的redis客户端运行LLEN test返回(integer) 0

我情不自禁地感觉到我在这里遗漏了一些东西,很可能与异步相关,但我就是看不见。

我的redis版本是2.8.3,BookSleeve版本是1.3.41。

这里的实际问题是:为什么BookSleeve只返回发送到redis列表的消息的子集?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-11 15:34:51

我就是不能让它出错。你绝对肯定你只有一个消费者吗?请注意, order 不可预测的原因是,您使用它作为堆栈而不是队列-为了获得可靠的订单,您应该添加到开始和删除从结束,或添加到结尾和删除从开始。如果您从开始添加和删除它是随机的-ish顺序。

不过,这对我来说很好。控制台输出:

代码语言:javascript
复制
Got: foo0
Got: foo1
Got: foo3
Got: foo5
Got: foo6
Got: foo8
Got: foo9
Got: foo7
Got: foo4
Got: foo2
queue length: 0

我建议在redis-cli模式下使用monitor --对我来说,我得到以下输出:

代码语言:javascript
复制
redis 127.0.0.1:6379> monitor
OK
1389454168.068869 [0 127.0.0.1:4957] "INFO"
1389454168.068869 [0 127.0.0.1:4957] "CONFIG" "GET" "timeout"
1389454168.068869 [0 127.0.0.1:4957] "DEL" "test"
1389454168.129869 [0 127.0.0.1:4958] "INFO"
1389454168.129869 [0 127.0.0.1:4958] "CONFIG" "GET" "timeout"
1389454168.136869 [0 127.0.0.1:4958] "BLPOP" "test" "0"
1389454168.139872 [0 127.0.0.1:4959] "INFO"
1389454168.139872 [0 127.0.0.1:4959] "CONFIG" "GET" "timeout"
1389454168.139872 [0 127.0.0.1:4959] "LPUSH" "test" "foo0"
1389454168.142869 [0 127.0.0.1:4959] "LPUSH" "test" "foo1"
1389454168.142869 [0 127.0.0.1:4958] "BLPOP" "test" "0"
1389454168.142869 [0 127.0.0.1:4959] "LPUSH" "test" "foo2"
1389454168.143871 [0 127.0.0.1:4959] "LPUSH" "test" "foo3"
1389454168.143871 [0 127.0.0.1:4958] "BLPOP" "test" "0"
1389454168.143871 [0 127.0.0.1:4959] "LPUSH" "test" "foo4"
1389454168.143871 [0 127.0.0.1:4959] "LPUSH" "test" "foo5"
1389454168.144870 [0 127.0.0.1:4958] "BLPOP" "test" "0"
1389454168.144870 [0 127.0.0.1:4959] "LPUSH" "test" "foo6"
1389454168.144870 [0 127.0.0.1:4958] "BLPOP" "test" "0"
1389454168.144870 [0 127.0.0.1:4959] "LPUSH" "test" "foo7"
1389454168.145869 [0 127.0.0.1:4959] "LPUSH" "test" "foo8"
1389454168.145869 [0 127.0.0.1:4958] "BLPOP" "test" "0"
1389454168.145869 [0 127.0.0.1:4959] "LPUSH" "test" "foo9"
1389454168.145869 [0 127.0.0.1:4958] "BLPOP" "test" "0"
1389454168.146869 [0 127.0.0.1:4958] "BLPOP" "test" "0"
1389454168.146869 [0 127.0.0.1:4958] "BLPOP" "test" "0"
1389454168.147870 [0 127.0.0.1:4958] "BLPOP" "test" "0"
1389454168.147870 [0 127.0.0.1:4958] "BLPOP" "test" "0"
1389454168.648594 [0 127.0.0.1:4959] "LLEN" "test"

这里,连接4957只是移除键(以确保已知状态);4958是使用者,4959是生产者。

作为参考,我在上面的测试中使用了2.6.12 Windows构建 (因为我在Windows膝上,没有时间设置linux )--但是:我也希望在正式的linux构建上也是如此。

所以再次声明:您确定(通过redis-cli)这里只涉及两个连接吗?

如果我更改为AddLast

代码语言:javascript
复制
Got: foo0
Got: foo1
Got: foo2
Got: foo3
Got: foo4
Got: foo5
Got: foo6
Got: foo7
Got: foo8
Got: foo9
queue length: 0
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21059099

复制
相关文章

相似问题

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