c# - StackExchange.Redis 支持 ZPOP?

标签 c# redis stackexchange.redis

我想使用 StackExchange.Redis 为我的应用程序实现 ZPOP。根据Redis documentation在WATCH部分,ZPOP可以通过以下命令实现:

WATCH zset
element = ZRANGE zset 0 0
MULTI
ZREM zset element
EXEC

在 StackExchange Redis 中,这看起来像:

var connection = GetMultiplexer();
var db = connection.GetDatabase();
var trans = db.CreateTransaction();

var elements = await trans.SortedSetRangeByScoreAsync(key, 0, 0);  // THIS WILL BLOCK INDEFINITELY
var element = elemenets.FirstOrDefault();
trans.SortedSetRemoveAsync(key, element);
await trans.ExecuteAsync();

我的问题是,您如何从事务中获取和使用结果?如何实现 ZPOP

最佳答案

考虑为此使用 LUA 脚本。 Redis 保证 lua 脚本是事务性的,因为当一个 eval 脚本运行时,其他任何东西都不能同时运行。所以你可以使用 EVAL .

Here是如何使用 LUA 脚本执行 ZPOP 的示例:

local val = redis.call('zrange', KEYS[1], 0, 0)
if val then redis.call('zremrangebyrank', KEYS[1], 0, 0) end
return val

还有一个 ZREVPOP提供。

借助 StackExchange.Redis,您可以使用 IServer.ScriptLoadIDatabase.ScriptEvaluate 加载和执行 LUA 脚本。

https://github.com/StackExchange/StackExchange.Redis/blob/master/Docs/Transactions.md

注意这不是阻塞。在 ConnectionMultiplexer 中包含阻塞代码并不是一个好主意。

来自 Stackexchange.Redis documentation :

...the only redis features that StackExchange.Redis does not offer (and will not ever offer) are the "blocking pops" (BLPOP, BRPOP and BRPOPLPUSH) - because this would allow a single caller to stall the entire multiplexer

关于c# - StackExchange.Redis 支持 ZPOP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33787676/

相关文章:

redis - 使用 set 或只是在 redis 中创建键来检查是否存在?

amazon-web-services - Elasticache Redis 自动备份到 S3

azure - 如何使用 StackExchange.Redis 为 Azure Redis 缓存的所有 key 全局设置 key 过期值?

redis - StackExchange.Redis - 等待锁的最佳方式

c# - 自动属性在 c# 中不起作用

c# - 虚拟方法逻辑不工作 C# .NET 4.0

c# - 从 ASP.NET 应用程序中删除 ASP.NET_SessionId

node.js - 在 socket.io 中使用 RedisStore 的示例

redis - 在集群中选举出新的 master 时恢复连接

c# - 从 ASPX 到 WCF