我想在 ASP.NET Core 项目中实现分布式缓存(Redis)。经过一番研究,我发现有两种方法可以使用 Startup.cs 和 ConnectionMultiplexer 中的 AddStackExchangeRedisCache 创建 Redis 连接
创建连接是线程安全的方式吗?
通过使用 ConnectionMultiplexer,我们可以初始化数据库实例。根据几篇文章,延迟初始化也会照顾到线程安全
疑问: 1. 从以上方法来看,哪种方法更好?
我在我的本地机器上尝试了两种方法都工作正常。但我找不到上述方法的优缺点。
请帮忙。提前致谢
BR, 安吉特
我正在使用 stackexchange redis 提供程序,并且尝试删除以某个键开头的所有键。
private readonly Lazy<IEnumerable<IServer>> allServers = new Lazy<IEnumerable<IServer>>(() => Connection.GetEndPoints().Select(s => Connection.GetServer(s)));
private const int DbId = 1;
private const int ScanPageSize = 1 << 14;
public void RemoveByPattern(string pattern)
{
var keys = this.AllServers.Value.SelectMany(x => x.Keys(DbId, pattern + "*", ScanPageSize)).Distinct().ToArray();
if (!keys.Any())
return;
this.Database.KeyDelete(keys);
}
Run Code Online (Sandbox Code Playgroud)
^^ 这是我想出的方法,大多数情况下效果很好。但是,一旦我在系统上施加一些负载,我就会收到如下错误:
System.TimeoutException: Timeout performing SCAN, inst: 0, mgr: Inactive, queue: 11, qu=11, qs=0, qc=0, wr=0/1, in=0/0
at StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl (StackExchange.Redis.StrongName, Version=1.0.316.0, Culture=neutral, PublicKeyToken=c219ff1ca8c2ce46)
at StackExchange.Redis.RedisServer.ExecuteSync (StackExchange.Redis.StrongName, Version=1.0.316.0, Culture=neutral, PublicKeyToken=c219ff1ca8c2ce46)
at StackExchange.Redis.RedisBase+CursorEnumerable`1.GetNextPageSync …Run Code Online (Sandbox Code Playgroud)