我已经实现了servicestack.net核心redis库的以下版本:
servicestack.redis.core 5.9.2版本
我正在使用该库访问我创建的redis缓存,以便使用.NETCore3.1为我的aws无服务器应用程序持久化值。我已经为servicestack redis支付了商业许可。
在尝试创建redis客户端时,我的应用程序会周期性地、毫无警告地捕获以下错误:
Exception: System.Exception: No master found in: redis-cluster-api-prd-lcs.in-xxxxxxxx:6379
at ServiceStack.Redis.RedisResolver.CreateRedisClient(RedisEndpoint config, Boolean master) in C:\BuildAgent\work\b2a0bfe2b1c9a118\src\ServiceStack.Redis\RedisResolver.cs:line 116
at ServiceStack.Redis.RedisResolver.CreateMasterClient(Int32 desiredIndex) in C:\BuildAgent\work\b2a0bfe2b1c9a118\src\ServiceStack.Redis\RedisResolver.cs:line 142
at ServiceStack.Redis.RedisManagerPool.GetClient() in C:\BuildAgent\work\b2a0bfe2b1c9a118\src\ServiceStack.Redis\RedisManagerPool.cs:line 174
at LCSApi.UtilityCommand.Cache.IsCacheValueExists(String cacheKey, RedisManagerPool pool) in D:\a\1\s\testapi\Utility.cs:line 167
at LCSApi.Functions.LcsConfigurationSweeper(ILambdaContext context) in D:\a\1\s\testapi\Function.cs:line 2028
Exception: System.Exception: No master found in: redis-cluster-api-prd-lcs.in
其他时候,同样的代码也可以正常工作。我的实现非常简单:
private readonly RedisManagerPool _redisClient;
_redisClient = new RedisManagerPool(Environment.GetEnvironmentVariable("CACHE_URL") + ":" +
Environment.GetEnvironmentVariable("CACHE_PORT"));
public static T GetCacheValue<T>(string cacheKey, RedisManagerPool pool)
{
T cacheValue;
try
{
//StackExchange.Redis.IDatabase cache = Functions._redisConnect.GetDatabase();
//string value = cache.StringGet(cacheKey);
//cacheValue = (T)Convert.ChangeType(value, typeof(T));
using (var client = pool.GetClient())
{
client.RetryCount = Convert.ToInt32(Environment.GetEnvironmentVariable("CACHE_RETRY_COUNT"));
client.RetryTimeout = Convert.ToInt32(Environment.GetEnvironmentVariable("CACHE_RETRY_TIMEOUT"));
cacheValue = client.Get<T>(cacheKey);
}
}
catch (Exception ex)
{
//Console.WriteLine($"[CACHE_EXCEPTION] {ex.ToString()}");
cacheValue = GetParameterSSMFallback<T>(cacheKey);
//Console.WriteLine($"[CACHE_EXCEPTION] Fallback SSM parameter --> {cacheValue}");
}
return cacheValue;
}
我不得不编写一个“fallback”例程,从aws参数存储中获取值。不太理想。redis配置如下:
我几乎找不到任何关于这个错误的网上任何地方。我尝试注册servicestack论坛但没有成功,因为某种原因它不允许我注册,即使我有商业许可证。有人能帮忙吗?
1条答案
按热度按时间pcrecxhr1#
错误是由于网络示例未连接到redis role命令标识的主示例。这可能发生在elasticache故障转移期间,最终主示例将以原始dns名称返回:
amazon elasticache for redis将通过获取新的服务资源来修复节点,然后重定向节点的现有dns名称以指向新的服务资源。因此,redis节点的dns名称保持不变,但是redis节点的ip地址可以随时间而改变。
servicestack.redis将尝试使用所有指定的主连接(通常只有1个)连接到主示例。如果它无法连接到主示例,它必须放弃,因为客户端希望对读/写主示例执行操作。
如果预期主示例将以相同的dns名称返回,我们可以使用自定义的
IRedisResolver
要在指定的时间段内连续重试连接主示例的同一连接,例如:使用redis客户机管理器配置,例如:
注意:您应该只使用一个redis客户机管理器的共享示例,比如
RedisManagerPool
所以它们共享同一个连接池。如果包含redisManager
不是单例,应将其分配给静态字段,以确保使用相同的单例示例检索客户端。