【发布时间】:2020-01-29 13:39:42
【问题描述】:
您好,我有以下问题:
我有一个包含字符串的散列。这个散列将被多个用户查询。
当用户自带Key 时,首先检查它是否存在于此哈希中,如果不存在,则添加它。
如何使操作“检查哈希是否存在”、“如果不存在则添加”原子操作?
阅读redis文档似乎Watch是我需要的。基本上开始一个事务,如果变量发生变化就结束它。
我尝试使用Condition.HashNotExists 无济于事:
class Program {
public static async Task<bool> LockFileForEditAsync(int fileId) {
var database = ConnectionMultiplexer.Connect(CON).GetDatabase();
var exists = await database.HashExistsAsync("files", fileId); //this line is for shorting the transaction if hash exists
if (exists) {
return false;
}
var tran = database.CreateTransaction();
tran.AddCondition(Condition.HashNotExists("files", fileId));
var setKey = tran.HashSetAsync("files", new HashEntry[] { new HashEntry(fileId, 1) });
var existsTsc = tran.HashExistsAsync("files", fileId);
if (!await tran.ExecuteAsync()) {
return false;
}
var rezult = await existsTsc;
return rezult;
}
public const string CON = "127.0.0.1:6379,ssl=False,allowAdmin=True,abortConnect=False,defaultDatabase=0";
static async Task Main(string[] args) {
int fid = 1;
var locked = await LockFileForEditAsync(fid);
}
}
如果我通过redis-cli 连接并在cli 中发出:hset files {fileId} 1,对之前我发出ExecuteAsync(在调试器中)我预计此事务将失败,因为我放置了Condition。然而事实并非如此。
我怎样才能基本上使用redis命令在两个操作上放置类似锁的东西:
- 检查hashentry是否存在
- 添加哈希条目
【问题讨论】:
标签: .net-core redis transactions locking stackexchange.redis