diff --git a/NewLife.Redis/FullRedis.cs b/NewLife.Redis/FullRedis.cs index 93c2a28..f5e6676 100644 --- a/NewLife.Redis/FullRedis.cs +++ b/NewLife.Redis/FullRedis.cs @@ -319,10 +319,14 @@ public class FullRedis : Redis InitCluster(); - keys = keys.Select(GetKey).ToArray(); + //keys = keys.Select(GetKey).ToArray(); + for (var i = 0; i < keys.Length; i++) + { + keys[i] = GetKey(keys[i]); + } // 如果不支持集群,或者只有一个key,直接执行 - if (Cluster == null || keys.Length == 1) return [Execute(keys.FirstOrDefault(), (rds, k) => func(rds, keys), write)]; + if (Cluster == null || keys.Length == 1) return [Execute(keys[0], (rds, k) => func(rds, keys), write)]; // 计算每个key所在的节点 var dic = new Dictionary>(); @@ -470,23 +474,16 @@ public class FullRedis : Redis { if (keys == null || keys.Length == 0) return 0; - //keys = keys.Select(GetKey).ToArray(); + if (keys.Length == 1) return base.Remove(keys[0]); + + InitCluster(); + if (Cluster != null) return Execute(keys, (rds, ks) => rds.Execute("DEL", ks), true).Sum(); + for (var i = 0; i < keys.Length; i++) { keys[i] = GetKey(keys[i]); } - if (keys.Length == 1) return base.Remove(keys[0]); - - InitCluster(); - - if (Cluster != null) - { - return Execute(keys, (rds, ks) => rds.Execute("DEL", ks), true).Sum(); - } - else - { - return Execute(keys[0], (rds, k) => rds.Execute("DEL", keys), true); - } + return Execute(keys[0], (rds, k) => rds.Execute("DEL", keys), true); } #endregion @@ -499,12 +496,17 @@ public class FullRedis : Redis { if (keys == null || !keys.Any()) return new Dictionary(); - var keys2 = keys.ToArray(); + var keys2 = keys as String[] ?? keys.ToArray(); + for (var i = 0; i < keys2.Length; i++) + { + keys2[i] = GetKey(keys2[i]); + } + if (keys2.Length == 1) return new Dictionary { [keys2[0]] = Get(keys2[0])! }; - keys2 = keys2.Select(GetKey).ToArray(); - if (keys2.Length == 1 || Cluster == null) return base.GetAll(keys2); + InitCluster(); + + if (Cluster == null) return base.GetAll(keys2); - //Execute(keys.FirstOrDefault(), (rds, k) => rds.GetAll(keys)); var rs = Execute(keys2, (rds, ks) => rds.GetAll(ks), false); var dic = new Dictionary(); @@ -542,9 +544,14 @@ public class FullRedis : Redis return; } - var keys = values.Keys.Select(GetKey).ToArray(); - //Execute(values.FirstOrDefault().Key, (rds, k) => rds.SetAll(values), true); - var rs = Execute(keys, (rds, ks) => rds.SetAll(ks.ToDictionary(e => e, e => values[e])), true); + var keys = values.Keys.ToArray(); + + // 非集群模式 + InitCluster(); + if (Cluster == null) + Execute(keys[0], (rds, ks) => rds.SetAll(values), true); + else + Execute(keys, (rds, ks) => rds.SetAll(ks.ToDictionary(e => e, e => values[e])), true); // 使用管道批量设置过期时间 if (expire > 0) diff --git a/NewLife.Redis/Redis.cs b/NewLife.Redis/Redis.cs index 370cb33..f31c3a1 100644 --- a/NewLife.Redis/Redis.cs +++ b/NewLife.Redis/Redis.cs @@ -809,7 +809,13 @@ public class Redis : Cache, IConfigMapping, ILogFeature /// /// /// - public override IDictionary GetAll(IEnumerable keys) => Execute(keys.FirstOrDefault(), (rds, k) => rds.GetAll(keys)); + public override IDictionary GetAll(IEnumerable keys) + { + var ks = keys as String[] ?? keys.ToArray(); + if (ks.Length == 0) return new Dictionary(); + + return Execute(ks[0], (rds, k) => rds.GetAll(ks)); + } /// 批量设置缓存项 /// diff --git a/NewLife.Redis/RedisClient.cs b/NewLife.Redis/RedisClient.cs index e72596a..a3a54d7 100644 --- a/NewLife.Redis/RedisClient.cs +++ b/NewLife.Redis/RedisClient.cs @@ -1023,20 +1023,18 @@ public class RedisClient : DisposeBase /// /// /// - public IDictionary GetAll(IEnumerable keys) + public IDictionary GetAll(String[] keys) { - if (keys == null || !keys.Any()) throw new ArgumentNullException(nameof(keys)); + if (keys == null || keys.Length == 0) throw new ArgumentNullException(nameof(keys)); - var ks = keys.ToArray(); + var dic = new Dictionary(keys.Length); + if (Execute("MGET", keys) is not Object[] rs) return dic; - var dic = new Dictionary(ks.Length); - if (Execute("MGET", ks) is not Object[] rs) return dic; - - for (var i = 0; i < ks.Length && i < rs.Length; i++) + for (var i = 0; i < keys.Length && i < rs.Length; i++) { if (rs[i] is IPacket pk) { - dic[ks[i]] = (T?)Host.Encoder.Decode(pk, typeof(T)); + dic[keys[i]] = (T?)Host.Encoder.Decode(pk, typeof(T)); } }