Browse Source

feat(caching-management): abp缓存管理版本兼容

pull/1013/head
colin 1 year ago
parent
commit
d8a3a0372c
  1. 51
      aspnet-core/modules/caching-management/LINGYUN.Abp.CachingManagement.StackExchangeRedis/LINGYUN/Abp/CachingManagement/StackExchangeRedis/StackExchangeRedisCacheManager.cs

51
aspnet-core/modules/caching-management/LINGYUN.Abp.CachingManagement.StackExchangeRedis/LINGYUN/Abp/CachingManagement/StackExchangeRedis/StackExchangeRedisCacheManager.cs

@ -19,7 +19,6 @@ namespace LINGYUN.Abp.CachingManagement.StackExchangeRedis;
[Dependency(ReplaceServices = true)] [Dependency(ReplaceServices = true)]
public class StackExchangeRedisCacheManager : ICacheManager, ISingletonDependency public class StackExchangeRedisCacheManager : ICacheManager, ISingletonDependency
{ {
private readonly static MethodInfo GetRedisDatabaseMethod;
private readonly static MethodInfo ConnectAsyncMethod; private readonly static MethodInfo ConnectAsyncMethod;
protected RedisCacheOptions RedisCacheOptions { get; } protected RedisCacheOptions RedisCacheOptions { get; }
@ -28,15 +27,11 @@ public class StackExchangeRedisCacheManager : ICacheManager, ISingletonDependenc
protected IDistributedCache DistributedCache { get; } protected IDistributedCache DistributedCache { get; }
protected AbpRedisCache RedisCache => DistributedCache.As<AbpRedisCache>(); protected AbpRedisCache RedisCache => DistributedCache.As<AbpRedisCache>();
protected IDatabase RedisDatabase => GetRedisDatabase();
private IDatabase _redisDatabase;
static StackExchangeRedisCacheManager() static StackExchangeRedisCacheManager()
{ {
var type = typeof(AbpRedisCache); var type = typeof(AbpRedisCache);
ConnectAsyncMethod = type.GetMethod("ConnectAsync", BindingFlags.Instance | BindingFlags.NonPublic); ConnectAsyncMethod = type.GetMethod("ConnectAsync", BindingFlags.Instance | BindingFlags.NonPublic);
GetRedisDatabaseMethod = type.GetMethod("GetRedisDatabase", BindingFlags.Instance | BindingFlags.NonPublic);
} }
public StackExchangeRedisCacheManager( public StackExchangeRedisCacheManager(
@ -53,7 +48,7 @@ public class StackExchangeRedisCacheManager : ICacheManager, ISingletonDependenc
public async virtual Task<CackeKeysResponse> GetKeysAsync(GetCacheKeysRequest request, CancellationToken cancellationToken = default) public async virtual Task<CackeKeysResponse> GetKeysAsync(GetCacheKeysRequest request, CancellationToken cancellationToken = default)
{ {
await ConnectAsync(cancellationToken); var cache = await ConnectAsync(cancellationToken);
// 缓存键名规则: InstanceName + (t + TenantId)(CurrentTenant.IsAvailable) + CacheItemName + KeyPrefix + Key // 缓存键名规则: InstanceName + (t + TenantId)(CurrentTenant.IsAvailable) + CacheItemName + KeyPrefix + Key
// 缓存键名规则: InstanceName + (c:)(!CurrentTenant.IsAvailable) + CacheItemName + KeyPrefix + Key // 缓存键名规则: InstanceName + (c:)(!CurrentTenant.IsAvailable) + CacheItemName + KeyPrefix + Key
@ -75,17 +70,17 @@ public class StackExchangeRedisCacheManager : ICacheManager, ISingletonDependenc
match += "c:*"; match += "c:*";
} }
// abp*t:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx*application* // abp*t:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx*application*
// abp*c:*application* // abp*c:application*
if (!CacheOptions.KeyPrefix.IsNullOrWhiteSpace()) if (!CacheOptions.KeyPrefix.IsNullOrWhiteSpace())
{ {
match += CacheOptions.KeyPrefix + "*"; match += CacheOptions.KeyPrefix.EnsureEndsWith('*');
} }
// app*abp*t:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx*application* // app*abp*t:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx*application*
// app*abp*c:*application* // app*abp*c:*application*
if (!request.Prefix.IsNullOrWhiteSpace()) if (!request.Prefix.IsNullOrWhiteSpace())
{ {
match = request.Prefix + "*" + match; match += request.Prefix.EnsureEndsWith('*') + match;
} }
// if filter is Mailing: // if filter is Mailing:
@ -93,14 +88,14 @@ public class StackExchangeRedisCacheManager : ICacheManager, ISingletonDependenc
// app*abp*c:*application*Mailing* // app*abp*c:*application*Mailing*
if (!request.Filter.IsNullOrWhiteSpace()) if (!request.Filter.IsNullOrWhiteSpace())
{ {
match += request.Filter + "*"; match += request.Filter.EnsureStartsWith('*').EnsureEndsWith('*');
} }
// scan 0 match * count 50000 // scan 0 match * count 50000
// redis有自定义的key排序,由传递的marker来确定下一次检索起始位 // redis有自定义的key排序,由传递的marker来确定下一次检索起始位
var args = new object[] { request.Marker ?? "0", "match", match, "count", 50000 }; var args = new object[] { request.Marker ?? "0", "match", match, "count", 50000 };
var result = await RedisDatabase.ExecuteAsync("scan", args); var result = await cache.ExecuteAsync("scan", args);
var results = (RedisResult[])result; var results = (RedisResult[])result;
@ -119,19 +114,20 @@ public class StackExchangeRedisCacheManager : ICacheManager, ISingletonDependenc
long size = 0; long size = 0;
var values = new Dictionary<string, object>(); var values = new Dictionary<string, object>();
var cache = await ConnectAsync(cancellationToken);
// type RedisKey // type RedisKey
var type = await RedisDatabase.KeyTypeAsync(key); var type = await cache.KeyTypeAsync(key);
// ttl RedisKey // ttl RedisKey
var ttl = await RedisDatabase.KeyTimeToLiveAsync(key); var ttl = await cache.KeyTimeToLiveAsync(key);
switch (type) switch (type)
{ {
case RedisType.Hash: case RedisType.Hash:
// hlen RedisKey // hlen RedisKey
size = await RedisDatabase.HashLengthAsync(key); size = await cache.HashLengthAsync(key);
// hscan RedisKey // hscan RedisKey
var hvalues = RedisDatabase.HashScan(key); await foreach (var hvalue in cache.HashScanAsync(key))
foreach (var hvalue in hvalues)
{ {
if (!hvalue.Name.IsNullOrEmpty) if (!hvalue.Name.IsNullOrEmpty)
{ {
@ -141,16 +137,16 @@ public class StackExchangeRedisCacheManager : ICacheManager, ISingletonDependenc
break; break;
case RedisType.String: case RedisType.String:
// strlen RedisKey // strlen RedisKey
size = await RedisDatabase.StringLengthAsync(key); size = await cache.StringLengthAsync(key);
// get RedisKey // get RedisKey
var svalue = RedisDatabase.StringGet(key); var svalue = await cache.StringGetAsync(key);
values.Add("value", svalue.IsNullOrEmpty ? "" : svalue.ToString()); values.Add("value", svalue.IsNullOrEmpty ? "" : svalue.ToString());
break; break;
case RedisType.List: case RedisType.List:
// llen RedisKey // llen RedisKey
size = await RedisDatabase.ListLengthAsync(key); size = await cache.ListLengthAsync(key);
// lrange RedisKey // lrange RedisKey
var lvalues = RedisDatabase.ListRange(key); var lvalues = await cache.ListRangeAsync(key);
for (var lindex = 0; lindex < lvalues.Length; lindex++) for (var lindex = 0; lindex < lvalues.Length; lindex++)
{ {
if (!lvalues[lindex].IsNullOrEmpty) if (!lvalues[lindex].IsNullOrEmpty)
@ -228,21 +224,6 @@ public class StackExchangeRedisCacheManager : ICacheManager, ISingletonDependenc
protected virtual ValueTask<IDatabase> ConnectAsync(CancellationToken token = default) protected virtual ValueTask<IDatabase> ConnectAsync(CancellationToken token = default)
{ {
if (_redisDatabase != null)
{
return default;
}
return (ValueTask<IDatabase>)ConnectAsyncMethod.Invoke(RedisCache, new object[] { token }); return (ValueTask<IDatabase>)ConnectAsyncMethod.Invoke(RedisCache, new object[] { token });
} }
private IDatabase GetRedisDatabase()
{
if (_redisDatabase == null)
{
_redisDatabase = GetRedisDatabaseMethod.Invoke(RedisCache, null) as IDatabase;
}
return _redisDatabase;
}
} }

Loading…
Cancel
Save