我有2台服务器用于负载均衡器,每台都有8 worker processors
。我希望有一个值在每台服务器中的工作进程之间共享。我的代码如下:
static string _token;
public async Task<string> GetokenAsync()
{
if (token.isExpire() || string.IsNullOrWhiteSpace(token))
{
await _semaphoreSlim.WaitAsync();
if (token.isExpire() || string.IsNullOrWhiteSpace(token))
{
try
{
token = await GetTokenFromAPIServiceAsync();
}
finally
{
_semaphoreSlim.Release();
}
}
else
_semaphoreSlim.Release();
}
return token;
}
但我猜静态变量不能正常工作时,有许多工人,因为我认为他们manipulate
静态字段。所以我决定使用redis
而不是static field
,如下所示:
public async Task<string> GetokenAsync()
{
var token = await GetFromRedisAsync();
if (string.IsNullOrWhiteSpace(token))
{
await _semaphoreSlim.WaitAsync();
if (token.isExpire() || string.IsNullOrWhiteSpace(token))
{
try
{
token = await GetFromServiceAndSetToRedisAsync();
}
finally
{
_semaphoreSlim.Release();
}
}
else
_semaphoreSlim.Release();
}
return token;
}
使用redis和semaphorSlim锁线程是一个好的解决方案吗?信号量是否在worker中工作,或者某些worker可能会改变redis中的值?
1条答案
按热度按时间gzjq41n41#
信号量是否在worker中工作,或者某些worker可能会改变redis中的值?
如果目标是在同一服务器上的不同进程之间共享信息,那么
SemaphoreSlim
不是一个解决方案-它只适用于单个应用程序示例。对于跨进程同步(在同一服务器上),您需要使用命名的Semaphore
或Mutex
。或者,你可以查看Redis提供的机制来执行同步(例如,参见this或this,如果需要,它还将启用在不同服务器之间共享令牌的选项)。