Azure托管Redis使用StackExchange.Redis查询键时数据返回不稳定的问题求助
Azure托管Redis使用StackExchange.Redis查询键时数据返回不稳定的问题求助
我最近在使用StackExchange.Redis从Azure托管的Redis中按模式查询键的时候遇到了头疼的问题:在Redis CLI里用完全一样的模式查询完全正常,但在我的C#应用里用StackExchange.Redis库,有时候查不到任何数据,重新连接后又能查到,感觉像是有时候连到了一个空的服务器上。
我怀疑这和Azure Redis的集群配置有关,先说说我的Redis配置:目前用的是“Balanced B0”主从模式,节点信息是:
1 10.119.42.20:8500 myself,master - 0 0 0 connected 0-16383 2 10.119.42.20:8501 slave 1 0 0 0 connected
我本来觉得主从模式下不需要连接单个节点,因为数据都会同步到从节点,但问题还是出现了。后来我试过改用主主模式,结果键被分散到了两台服务器上,按模式查询只能返回一部分预期的键。
针对这些问题我试过不少办法:
- 尝试设置
CommandFlags.PreferMaster或者CommandFlags.DemandMaster,让查询优先连主节点,但完全没效果 - 想过能不能让StackExchange.Redis跨所有节点查询键,或者连接集群里的其他节点,但Azure托管Redis好像不允许直接连单个节点——单个节点不支持TLS,但我的客户端一开始是配置了TLS的
相关的代码片段在这里:
public async ValueTask<IReadOnlyCollection<Measurement>> GetLatestMeasurementsAsync( LatestMeasurementQuery query, CancellationToken cancellationToken = default) { var pattern = RedisKeyBuilder.GenerateForLatestMeasurementQuery(query); var masterEndpoint = RedisDb.Multiplexer.GetEndPoints().First(); var server = RedisDb.Multiplexer.GetServer(masterEndpoint); var keys = server.Keys(pattern: pattern, pageSize: int.MaxValue).ToArray(); var values = await RedisDb.StringGetAsync(keys.ToArray()); var cachedMeasurements = values .Where(v => v.HasValue) .Select(v => JsonSerializer.Deserialize<CachedMeasurementEntity>(v!, JsonOptions)!) .ToList(); return mapper.Map<IReadOnlyCollection<Measurement>>(cachedMeasurements); }
我用的是StackExchange.Redis v2.9.11版本的NuGet包,这么基础的功能却卡了好久,有没有大佬能给点思路?感激不尽!
更新1:
在主从模式下,我发现应用有时候会连到从节点,这时候就查不到结果。但我理解里不管连主还是从,读键的话应该都能拿到数据啊?还是我哪里理解错了?
更新2:
补充一下,上面提到的各种尝试(改主主模式、设置CommandFlags)都是我已经试过的操作,但都没解决问题。
内容来源于stack exchange
相关产品推荐
相关产品推荐

