Здравствуйте, у меня следующая проблема:
У меня есть хэш, содержащий строки. Этот хеш будет запрашиваться несколькими пользователями.
Когда пользователь приходит с 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, чтобы установить что-то вроде блокировки двух операций:
- Проверьте, существует ли хеш-код
- Добавить хешенцию