Redis Pop列表项,按项数

我有一个分布式系统,在一个地方,我在Redis列表中插入大约10000个项目,然后调用我的多个应用程序钩子来处理项目。我需要的是具有一些项目的ListLeftPop类型的方法。它应该从redis列表中删除项目并返回到我的调用应用程序。

我正在使用Stackexchange.Resis.extension

我目前用于获取(不弹出)的方法是

 public static List<T> GetListItemRange<T>(string key, int start, int chunksize) where T : class

{

List<T> obj = default(List<T>);

try

{

if (Muxer != null && Muxer.IsConnected && Muxer.GetDatabase() != null)

{

var cacheClient = new StackExchangeRedisCacheClient(Muxer, new NewtonsoftSerializer());

var redisValues = cacheClient.Database.ListRange(key, start, (start + chunksize - 1));

if (redisValues.Length > 0)

{

obj = Array.ConvertAll(redisValues, value => JsonConvert.DeserializeObject<T>(value)).ToList();

}

}

}

catch (Exception ex)

{

Logger.Fatal(ex.Message, ex);

}

return obj;

}

对于流行音乐,我有一个摘录

 var cacheClient = new StackExchangeRedisCacheClient(Muxer, new NewtonsoftSerializer());

var redisValues = cacheClient.ListGetFromRight<T>(key);

但这仅适用于单个项目

回答:

我假设您正在一个 ,在此 ,您可以在一个位置插入1000个项目,然后 多个位置检索它们。

您无法通过单个命令来实现,但是可以通过2个命令来实现。您可以编写一个lua脚本使它们原子化。

兰奇:http:

//redis.io/commands/lrange

Lrange list -100 -1

这将在列表中列出您的前100个元素。这里的偏移量是-100。请注意,这将以插入时的相反顺序返回项目。因此,您需要反转循环以确保队列机制。

Ltrim:http:

//redis.io/commands/ltrim

ltrim list 0 -101

这将修剪列表中的前100个元素。这里101是n + 1,所以它必须是101。这里offset是101

将它们写在lua块中将确保您的原子性。

让我举一个简单的例子。

您在一个地方插入100个元素。

lpush list 1 2 3 .. 100

您有多个客户端,每个客户端都试图访问此lua块。假设您的n值为5。第一个客户端进入并获取插入的前5个元素。

127.0.0.1:6379> lrange list -5 -1

1) "5"

2) "4"

3) "3"

4) "2"

5) "1"

您将它们保留在lua对象中并删除它们。

127.0.0.1:6379> LTRIM list 0 -6

OK

将它们返回到您的代码,现在您想要的结果是1 2 3 4 5,但是您得到的是5 4 3 21。因此,您需要反转循环并执行操作。

当下一个客户端进入时,它将获得下一组值。

127.0.0.1:6379> lrange list -5 -1

1) "10"

2) "9"

3) "8"

4) "7"

5) "6"

这样您就可以实现您的要求。希望这可以帮助。

Lua脚本:

local result = redis.call('lrange', 'list','-5','-1')

redis.call('ltrim','list','0','-6')

return result

以上是 Redis Pop列表项,按项数 的全部内容, 来源链接: utcz.com/qa/422975.html

回到顶部