条件执行
理解 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.Exists
、When.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 |
强制要求指定的流长度大于某个值。 |