c# - 在 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
我的印象是交易只有在不满足条件时才会失败,这是真的吗?
查看网络和性能指标,没有超时或高内存使用可能导致此问题。
解决方案
编辑:不幸的是,在更高的负载下,这种方法开始分崩离析。有时一个事务需要 50 次尝试,这会损害性能并花费很长时间。仍在寻找更好的解决方案。
我实施了一个足够好的解决方法。
在!deleted && hashACondition.WasSatisfied && hashBCondition.WasSatisfied
我只是立即重试删除的情况下,最多 4 次。
根据测试,这基本上已经修复了它。在 6000 次尝试中,430 次需要重试一次,62 次需要重试两次,以此类推。
不过,这对我来说似乎仍然是 redis 或 stackexchange.redis 中的错误。很高兴听到比我更了解的人的消息!
推荐阅读
- c# - 如何从 linq 选择查询中初始化字符串列表?
- html - 在 Wordpress 中将特色图片居中
- java - hadoop分布式复制覆盖不起作用
- compiler-errors - 当我更换计算机时 MPLABX 项目停止编译
- java - 如何将多种不同类型的信息分配给一个名称?
- wso2 - 在调用已发布的 API 时更改 wso2 api 管理器上的管理员密码会导致错误
- javascript - 从 for 循环中删除嵌套的 api 调用
- angular - 组件输入参数被接收为“未定义”,但已指定一个值
- imagemagick - ImageMagick:如何进行简单的裁剪?
- python - 将列表的每三个元素乘以 2