【发布时间】:2014-01-11 23:34:51
【问题描述】:
我正在尝试根据 BookSleeve 组合一个 super 简单的排队示例。
这是我目前为止队列消费者方面的内容:
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 中运行以下命令:
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);
}
我得到了一些非常奇怪的结果:
第一次运行:
Got: foo2
Got: foo5
Got: foo7
Got: foo9
第二次运行:
Got: foo1
Got: foo4
Got: foo7
第三次运行:
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 列表的消息的子集?
【问题讨论】:
-
今晚会看。作为旁注:我通常会说“避免阻塞呼叫(更喜欢发布/订阅通知)” - 它对多路复用器造成了疯狂的伤害。但是,它应该可以工作。稍后再说。
-
随机想法:你不可能有第二个消费者 exe 副本在某处运行并拿走一些项目?
-
实际上,这是我检查的第一件事。它是当时唯一连接到redis的进程。
-
k - 目前忙于家庭事务,但稍后再看
标签: c# redis booksleeve