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
{
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<RedisValue[]>[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<RedisValue[][]> 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<RedisValue[]>[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);
}
}
}

Loading…
Cancel
Save