Browse Source

Use pipeline instead of lua script

pull/4500/head
liangshiwei 6 years ago
parent
commit
096f8f0750
  1. 39
      framework/src/Volo.Abp.Caching.StackExchangeRedis/Volo/Abp/Caching/StackExchangeRedis/AbpRedisExtensions.cs

39
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 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( public static RedisValue[][] HashMemberGetMany(
this IDatabase cache, this IDatabase cache,
string[] keys, string[] keys,
params string[] members) params string[] members)
{ {
var results = cache.ScriptEvaluate( var tasks = new Task<RedisValue[]>[keys.Length];
HmGetManyScript, var fields = members.Select(member => (RedisValue) member).ToArray();
keys.Select(key => (RedisKey) key).ToArray(), var results = new RedisValue[keys.Length][];
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(); for (var i = 0; i < tasks.Length; i++)
{
results[i] = cache.Wait(tasks[i]);
}
return results;
} }
public static async Task<RedisValue[][]> HashMemberGetManyAsync( public static async Task<RedisValue[][]> HashMemberGetManyAsync(
@ -31,12 +33,15 @@ namespace Volo.Abp.Caching.StackExchangeRedis
string[] keys, string[] keys,
params string[] members) params string[] members)
{ {
var results = await cache.ScriptEvaluateAsync( var tasks = new Task<RedisValue[]>[keys.Length];
HmGetManyScript, var fields = members.Select(member => (RedisValue) member).ToArray();
keys.Select(key => (RedisKey) key).ToArray(),
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);
} }
} }
} }

Loading…
Cancel
Save