У меня есть этот метод:
public async Task<bool> UpdateIfExist<T>(string cacheKey, IDictionary<string, T> dictionary)
{
ITransaction tran = m_connection.GetDatabase().CreateTransaction();
List<HashEntry> hashEntries = new List<HashEntry>();
foreach (KeyValuePair<string, T> keyValuePair in dictionary)
{
tran.AddCondition(Condition.HashExists(cacheKey, keyValuePair.Key)); // <-- this guy is the problem
HashEntry hashEntry = GetHashEntry(keyValuePair);
hashEntries.Add(hashEntry);
}
bool committed = await tran.ExecuteAsync();
if (committed)
{
await tran.HashSetAsync(cacheKey, hashEntries.ToArray()));
}
return committed;
}
Я намерен выполнить чистое обновление , то есть обновить те ключи в dictionary
, которые также присутствуют в кешированном ha sh. Я не хочу, чтобы новые пары ключ-значение из dictionary
вставлялись в кешированный ha sh. Но вышеупомянутое выполняет обновление «все или ничего», то есть, если какой-либо из ключей из словаря отсутствует в кешированном ha sh, то ничего не обновляется.
Например, у меня есть этот ha sh в моем кеше Redis:
myKey foo bar
goo baz
И скажем, это мой входной словарь:
foo newBar
qoo qux
После вызова моего метода ..
Ожидается в кеше:
myKey foo newBar // updated since the field exists in hash
goo baz
Фактически:
myKey foo bar // no change to cache
goo baz
Примечание: Если сценарий Lua - единственный способ, я попробую это, но в первую очередь ищу собственный подход к API SE.Redis.