Browse Source

Compatible with old versions of redis server

pull/13711/head
liangshiwei 4 years ago
parent
commit
fa4a082a4b
  1. 36
      framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache.cs

36
framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisCache.cs

@ -15,18 +15,19 @@ namespace Volo.Abp.Caching.StackExchangeRedis;
[DisableConventionalRegistration] [DisableConventionalRegistration]
public class AbpRedisCache : RedisCache, ICacheSupportsMultipleItems public class AbpRedisCache : RedisCache, ICacheSupportsMultipleItems
{ {
protected static readonly string SetScript; protected static string SetScript;
protected static readonly string AbsoluteExpirationKey; protected static readonly string AbsoluteExpirationKey;
protected static readonly string SlidingExpirationKey; protected static readonly string SlidingExpirationKey;
protected static readonly string DataKey; protected static readonly string DataKey;
protected static readonly long NotPresent; protected static readonly long NotPresent;
private static readonly FieldInfo RedisDatabaseField; private readonly static FieldInfo SetScriptField;
private static readonly MethodInfo ConnectMethod; private readonly static FieldInfo RedisDatabaseField;
private static readonly MethodInfo ConnectAsyncMethod; private readonly static MethodInfo ConnectMethod;
private static readonly MethodInfo MapMetadataMethod; private readonly static MethodInfo ConnectAsyncMethod;
private static readonly MethodInfo GetAbsoluteExpirationMethod; private readonly static MethodInfo MapMetadataMethod;
private static readonly MethodInfo GetExpirationInSecondsMethod; private readonly static MethodInfo GetAbsoluteExpirationMethod;
private readonly static MethodInfo GetExpirationInSecondsMethod;
protected IDatabase RedisDatabase => GetRedisDatabase(); protected IDatabase RedisDatabase => GetRedisDatabase();
private IDatabase _redisDatabase; private IDatabase _redisDatabase;
@ -36,9 +37,11 @@ public class AbpRedisCache : RedisCache, ICacheSupportsMultipleItems
static AbpRedisCache() static AbpRedisCache()
{ {
var type = typeof(RedisCache); var type = typeof(RedisCache);
RedisDatabaseField = type.GetField("_cache", BindingFlags.Instance | BindingFlags.NonPublic); RedisDatabaseField = type.GetField("_cache", BindingFlags.Instance | BindingFlags.NonPublic);
SetScriptField = type.GetField("_setScript", BindingFlags.Instance | BindingFlags.NonPublic);
ConnectMethod = type.GetMethod("Connect", BindingFlags.Instance | BindingFlags.NonPublic); ConnectMethod = type.GetMethod("Connect", BindingFlags.Instance | BindingFlags.NonPublic);
ConnectAsyncMethod = type.GetMethod("ConnectAsync", BindingFlags.Instance | BindingFlags.NonPublic); ConnectAsyncMethod = type.GetMethod("ConnectAsync", BindingFlags.Instance | BindingFlags.NonPublic);
@ -51,9 +54,6 @@ public class AbpRedisCache : RedisCache, ICacheSupportsMultipleItems
GetExpirationInSecondsMethod = GetExpirationInSecondsMethod =
type.GetMethod("GetExpirationInSeconds", BindingFlags.Static | BindingFlags.NonPublic); type.GetMethod("GetExpirationInSeconds", BindingFlags.Static | BindingFlags.NonPublic);
SetScript = type.GetField("SetScript", BindingFlags.Static | BindingFlags.NonPublic)?.GetValue(null)
.ToString();
AbsoluteExpirationKey = type.GetField("AbsoluteExpirationKey", BindingFlags.Static | BindingFlags.NonPublic) AbsoluteExpirationKey = type.GetField("AbsoluteExpirationKey", BindingFlags.Static | BindingFlags.NonPublic)
?.GetValue(null).ToString(); ?.GetValue(null).ToString();
@ -71,6 +71,7 @@ public class AbpRedisCache : RedisCache, ICacheSupportsMultipleItems
: base(optionsAccessor) : base(optionsAccessor)
{ {
Instance = optionsAccessor.Value.InstanceName ?? string.Empty; Instance = optionsAccessor.Value.InstanceName ?? string.Empty;
Connect();
} }
protected virtual void Connect() protected virtual void Connect()
@ -81,16 +82,18 @@ public class AbpRedisCache : RedisCache, ICacheSupportsMultipleItems
} }
ConnectMethod.Invoke(this, Array.Empty<object>()); ConnectMethod.Invoke(this, Array.Empty<object>());
SetSetScript();
} }
protected virtual Task ConnectAsync(CancellationToken token = default) protected virtual async Task ConnectAsync(CancellationToken token = default)
{ {
if (GetRedisDatabase() != null) if (GetRedisDatabase() != null)
{ {
return Task.CompletedTask; return;
} }
return (Task)ConnectAsyncMethod.Invoke(this, new object[] { token }); await (Task)ConnectAsyncMethod.Invoke(this, new object[] { token });
SetSetScript();
} }
public byte[][] GetMany( public byte[][] GetMany(
@ -333,4 +336,9 @@ public class AbpRedisCache : RedisCache, ICacheSupportsMultipleItems
return _redisDatabase; return _redisDatabase;
} }
private void SetSetScript()
{
SetScript = SetScriptField?.GetValue(this).ToString();
}
} }

Loading…
Cancel
Save