From 096f8f075034945963c004a73572edb9d8257ba4 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Fri, 26 Jun 2020 20:19:02 +0800 Subject: [PATCH] Use pipeline instead of lua script --- .../StackExchangeRedis/AbpRedisExtensions.cs | 39 +++++++++++-------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisExtensions.cs b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisExtensions.cs index d3466d2222..ad077a7440 100644 --- a/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisExtensions.cs +++ b/framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisExtensions.cs @@ -6,24 +6,26 @@ namespace Volo.Abp.Caching.StackExchangeRedis { public static class AbpRedisExtensions { - private const string HmGetManyScript = (@" - local res = {}; - for i , key in ipairs(KEYS) do - res[#res+1] = redis.call('HMGET', key,unpack(ARGV)) - end - return res"); - public static RedisValue[][] HashMemberGetMany( this IDatabase cache, string[] keys, params string[] members) { - var results = cache.ScriptEvaluate( - HmGetManyScript, - keys.Select(key => (RedisKey) key).ToArray(), - members.Select(member => (RedisValue) member).ToArray()); + var tasks = new Task[keys.Length]; + var fields = members.Select(member => (RedisValue) member).ToArray(); + var results = new RedisValue[keys.Length][]; + + for (var i = 0; i < keys.Length; i++) + { + tasks[i] = cache.HashGetAsync((RedisKey) keys[i], fields); + } - return ((RedisResult[]) results).Select(result => (RedisValue[]) result).ToArray(); + for (var i = 0; i < tasks.Length; i++) + { + results[i] = cache.Wait(tasks[i]); + } + + return results; } public static async Task HashMemberGetManyAsync( @@ -31,12 +33,15 @@ namespace Volo.Abp.Caching.StackExchangeRedis string[] keys, params string[] members) { - var results = await cache.ScriptEvaluateAsync( - HmGetManyScript, - keys.Select(key => (RedisKey) key).ToArray(), - members.Select(member => (RedisValue) member).ToArray()); + var tasks = new Task[keys.Length]; + var fields = members.Select(member => (RedisValue) member).ToArray(); + + for (var i = 0; i < keys.Length; i++) + { + tasks[i] = cache.HashGetAsync((RedisKey) keys[i], fields); + } - return ((RedisResult[]) results).Select(result => (RedisValue[]) result).ToArray(); + return await Task.WhenAll(tasks); } } }