如何使用couchbase作为fifo队列

时间:2014-02-26 04:59:31

标签: queue couchbase fifo

使用Java客户端,如何使用couchbase实现FIFO队列,线程安全?可以有许多线程从队列中弹出并推入队列。队列中的每个对象都是一个字符串[]。

2 个答案:

答案 0 :(得分:4)

Couchbase没有任何内置的创建队列功能,但你可以自己做。

我将在下面的简短示例中解释如何做到这一点。 即我们有一个名为queue的队列,它将包含名称为item:<index>的项目。要实现队列,您需要使用以下键来存储您的值:<queue_name>:item:<index>,其中index将是单独的键queue:index,您需要在推送到队列时递增,并在弹出时递减。

在couchbase中,你可以使用递增和递减操作来实现队列,因为这些操作是原子的和线程安全的。

所以你的推送和弹出功能的代码就像:

void push(string queue, string[] value){
  int index = couchbase.increment(queue + ':index');
  couchbase.set(queue + ':item:' + index, value);
}
string[] pop(string queue){
  int index = couchbase.get(queue + ':index');
  string[] result = couchbase.get(queue + ':item:' + index);
  couchbase.decrement(queue + ':index');
  return result;
}

很抱歉代码,很久以前我使用过java和couchbase java客户端。如果现在java客户端有回调,比如nodejs客户端,则可以重写该代码以使用回调。我认为会更好。

此外,您可以在set操作中添加额外的检查 - 使用add(在C#客户端中称为StoreMode.Add)操作,如果已存在具有给定键的项,则将抛出异常。并且您可以捕获该异常并再次针对相同的参数调用push函数。

UPD:对不起,早上太早了,所以我无法想清楚。 对于fifo,正如@avsej所说,你需要两个计数器:queue:headqueue:tail。所以对于fifo:

void push(string queue, string[] value){
  int index = couchbase.increment(queue + ':tail');
  couchbase.set(queue + ':item:' + index, value);
}
string[] pop(string queue){
  int index = couchbase.increment(queue + ':head') - 1;
  string[] result = couchbase.get(queue + ':item:' + index);
  return result;
}

注意:代码可能会略有不同,具体取决于queue:tailqueue:head的起始值(将为零或一个或其他内容)。

此外,您可以为计数器设置一些max值,到达后,queue:tailqueue:head将重置为0(仅限于文档数量)。如果您确实需要,也可以为每个文档设置expire值。

答案 1 :(得分:0)

Couchbase 已经有了 CouchbaseQueue 数据结构。

示例用法:取自以下 SDK 文档

inline-block

Java SDK 3.1 CouchbaseQueue Doc