条件执行

理解 NRedisStack 如何使用条件执行

大多数 Redis 客户端库使用带有 WATCH 命令的事务作为防止两个客户端同时写入同一键的主要方式(详情请参阅事务)。不幸的是,这种方法在 NRedisStack 中很难显式使用。它的多路复用系统高效便捷,但也可能在不同连接同时使用被监视的事务时导致不良交互。

相反,NRedisStack 更侧重于依赖条件执行。这有两种基本形式:When 条件和事务条件,下文将分别解释这两种形式。

When 条件

有几个命令有变体,仅当它们更改的键已存在(或者,如果它尚不存在)时才会执行。例如,SET 命令有变体 SETEX(键存在时设置)和 SETNX(键不存在时设置)。

NRedisStack 没有为这些命令提供不同的变体,而是允许你向基本命令添加一个 When 条件来访问其变体。以下示例演示了 HashSet() 命令的用法。

bool resp7 = db.HashSet("Details", "SerialNumber", "12345");
Console.WriteLine(resp7); // >>> true

db.HashSet("Details", "SerialNumber", "12345A", When.NotExists);
string resp8 = db.HashGet("Details", "SerialNumber");
Console.WriteLine(resp8); // >>> 12345

db.HashSet("Details", "SerialNumber", "12345A");
string resp9 = db.HashGet("Details", "SerialNumber");
Console.WriteLine(resp9); // >>> 12345A

可用的条件包括 When.ExistsWhen.NotExists 和默认的 When.Always

事务条件

NRedisStack 还支持可以添加到事务中的更广泛的条件集。它们内部使用 WATCH 命令实现,以确保安全,避免不同客户端之间的交互。虽然条件与显式 WATCH 命令的行为不完全相同,但它们使用方便且执行高效。

以下示例展示了如何在事务中使用 AddCondition() 方法,使其仅在指定的哈希键不存在时运行。有关事务的更多信息,请参阅管道和事务

var watchedTrans = new Transaction(db);

watchedTrans.AddCondition(Condition.KeyNotExists("customer:39182"));

watchedTrans.Db.HashSetAsync(
    "customer:39182",
    new HashEntry[]{
        new HashEntry("name", "David"),
        new HashEntry("age", "27")
    }
);

bool succeeded = watchedTrans.Execute();
Console.WriteLine(succeeded); // >>> true

下表描述了可以添加到事务中的完整条件集。请注意,如果需要,可以向同一事务添加多个条件。

条件 描述
HashEqual 强制要求指定的哈希字段必须具有指定的值。
HashExists 强制要求指定的哈希字段必须存在。
HashNotEqual 强制要求指定的哈希字段不得具有指定的值。
HashNotExists 强制要求指定的哈希字段不得存在。
KeyExists 强制要求指定的键必须存在。
KeyNotExists 强制要求指定的键不得存在。
ListIndexEqual 强制要求指定的列表索引必须具有指定的值。
ListIndexExists 强制要求指定的列表索引必须存在。
ListIndexNotEqual 强制要求指定的列表索引不得具有指定的值。
ListIndexNotExists 强制要求指定的列表索引不得存在。
StringEqual 强制要求指定的键必须具有指定的值。
StringNotEqual 强制要求指定的键不得具有指定的值。
HashLengthEqual 强制要求指定的哈希长度等于某个值。
HashLengthLessThan 强制要求指定的哈希长度小于某个值。
HashLengthGreaterThan 强制要求指定的哈希长度大于某个值。
StringLengthEqual 强制要求指定的字符串长度等于某个值。
StringLengthLessThan 强制要求指定的字符串长度小于某个值。
StringLengthGreaterThan 强制要求指定的字符串长度大于某个值。
ListLengthEqual 强制要求指定的列表长度等于某个值。
ListLengthLessThan 强制要求指定的列表长度小于某个值。
ListLengthGreaterThan 强制要求指定的列表长度大于某个值。
SetLengthEqual 强制要求指定的集合基数等于某个值。
SetLengthLessThan 强制要求指定的集合基数小于某个值。
SetLengthGreaterThan 强制要求指定的集合基数大于某个值。
SetContains 强制要求指定的集合包含某个成员。
SetNotContains 强制要求指定的集合不包含某个成员。
SortedSetLengthEqual 强制要求指定的有序集合基数等于某个值。
SortedSetLengthEqual 强制要求指定的有序集合包含在给定分数范围内的特定数量成员。
SortedSetLengthLessThan 强制要求指定的有序集合基数小于某个值。
SortedSetLengthLessThan 强制要求指定的有序集合包含在给定分数范围内的成员数量小于特定数量。
SortedSetLengthGreaterThan 强制要求指定的有序集合基数大于某个值。
SortedSetLengthGreaterThan 强制要求指定的有序集合包含在给定分数范围内的成员数量大于特定数量。
SortedSetContains 强制要求指定的有序集合包含某个成员。
SortedSetNotContains 强制要求指定的有序集合不包含某个成员。
SortedSetEqual 强制要求指定的有序集合成员必须具有指定的分数。
SortedSetNotEqual 强制要求指定的有序集合成员不得具有指定的分数。
SortedSetScoreExists 强制要求指定的有序集合必须包含指定的分数。
SortedSetScoreNotExists 强制要求指定的有序集合不得包含指定的分数。
SortedSetScoreExists 强制要求指定的有序集合必须包含指定数量的指定分数。
SortedSetScoreNotExists 强制要求指定的有序集合不得包含指定数量的指定分数。
StreamLengthEqual 强制要求指定的流长度等于某个值。
StreamLengthLessThan 强制要求指定的流长度小于某个值。
StreamLengthGreaterThan 强制要求指定的流长度大于某个值。
评价此页
返回顶部 ↑