首页 > 解决方案 > 在 StackExchange.Redis 中满足所有条件时事务失败

问题描述

我在集群 ASP.Net Core 服务器上使用 Stackexchange.Redis,并且在事务方面遇到了一些问题。

以下代码应该从两个散列“HashA”和“HashB”中删除键为“hashItemID”的字段,但前提是它同时存在于两者中:

var hashAKey = "HashA";
var hashBKey = "HashB";
var id = "hashItemID";

var tran = redis.Database.CreateTransaction();

// Only delete the item if it exists in both hashes
var hashBCondition = tran.AddCondition(Condition.HashExists(hashBKey, id));
var hashACondition = tran.AddCondition(Condition.HashExists(hashAKey, id));

tran.HashDeleteAsync(hashBKey, id);
tran.HashDeleteAsync(hashAKey, id);

var deleted = await tran.ExecuteAsync();

if (!deleted)
{
    logger.LogWarning("Failed to delete '{ID}'. HashAResult: {A}, HashBResult: {B}", id, hashACondition.WasSatisfied, hashBCondition.WasSatisfied);
}

有时,此代码会因日志而失败:

Failed to delete 'hashItemID'. HashAResult: True, HashBResult: True

我的印象是交易只有在不满足条件时才会失败,这是真的吗?

查看网络和性能指标,没有超时或高内存使用可能导致此问题。

标签: c#.netredisstackexchange.redis

解决方案


编辑:不幸的是,在更高的负载下,这种方法开始分崩离析。有时一个事务需要 50 次尝试,这会损害性能并花费很长时间。仍在寻找更好的解决方案。

我实施了一个足够好的解决方法。

!deleted && hashACondition.WasSatisfied && hashBCondition.WasSatisfied我只是立即重试删除的情况下,最多 4 次。

根据测试,这基本上已经修复了它。在 6000 次尝试中,430 次需要重试一次,62 次需要重试两次,以此类推。

不过,这对我来说似乎仍然是 redis 或 stackexchange.redis 中的错误。很高兴听到比我更了解的人的消息!


推荐阅读