Caching Redis StackExchange存储500k类

Caching Redis StackExchange存储500k类,caching,redis,stackexchange.redis,Caching,Redis,Stackexchange.redis,我正试图用redis取代现有的缓存系统,该系统基本上由字典组成。我有大约500k个对象,正在使用MsgPackObjectSerializer。我在尝试检索整个数据集时遇到性能问题 拿到所有钥匙需要几秒钟 var keys = cacheClient.SearchKeys("ID:*").ToList(); 并以这种方式使用GetAll方法: cacheClient.GetAll<class>(keys).Values; 我得到结果的唯一方法是: var fromRedis =

我正试图用redis取代现有的缓存系统,该系统基本上由
字典
组成。我有大约500k个对象,正在使用MsgPackObjectSerializer。我在尝试检索整个数据集时遇到性能问题

拿到所有钥匙需要几秒钟

var keys = cacheClient.SearchKeys("ID:*").ToList();
并以这种方式使用GetAll方法:

cacheClient.GetAll<class>(keys).Values;
我得到结果的唯一方法是:

var fromRedis = new ConcurrentDictionary<id, class>();
keys.AsParallel().ForAll(k =>
{
    var div = cacheClient.Get<class>(k);
    if (div != null)
    {
        fromRedis.TryAdd(k, div)
    }
});
var fromRedis=新的ConcurrentDictionary();
keys.AsParallel().ForAll(k=>
{
var div=cacheClient.Get(k);
如果(div!=null)
{
fromRedis.TryAdd(k,div)
}
});
这对我来说是不对的,而且速度很慢

一定有更好的方法来做到这一点,我没有看到

更新: 这比keys.aspallel调用稍微快一点。仍然需要6秒

     var insListScan = new List<Task<RedisValue[]>>();

     foreach (var batch in server.Keys(0, "InstrumentSK:*").Batch(1000))
     {
        var tran = cacheClient.Database.CreateTransaction();
        insListScan.Add(tran.StringGetAsync(batch.ToArray()));
        tran.Execute();
     }
var insListScan=new List();
foreach(server.key(0,“InstrumentSK:*).batch(1000))中的var批处理)
{
var tran=cacheClient.Database.CreateTransaction();
insListScan.Add(tran.StringGetAsync(batch.ToArray());
trans.Execute();
}

现在您正在查找命令

由于StackExchange.Redis的目标是集群等场景,因此了解哪些命令针对数据库(可以分布在多个节点上的逻辑数据库)以及哪些命令针对服务器非常重要。SCAN命令以单个服务器为目标


您可以从StackExchange.Redis文档和使用扫描的解决方法中找到详细的解释。

使用扫描获取密钥使其更快,但我没有看到任何关于扫描的内容,除了用于实际对象检索的哈希值?@Shawn它应该与您获得的每个密钥的get值相结合。为了加快速度,你应该手动批量生产。如果您需要答案中的示例,请写下。我在问题中添加了一个我正在做的示例。@Shawn在示例中,您缺少在循环中使用事务(MULTY/EXEC)。现在,您使用keys/batch语句获得了一批1000个键,接下来在Redis ony中逐个迭代并执行每个命令。所以您向服务器发出500k请求。您应该对事务进行批处理。选择(k=>k.ToString())。值。请看这里的例子更新了我的例子。现在稍微快一点。我还有什么可以改进的吗?
     var insListScan = new List<Task<RedisValue[]>>();

     foreach (var batch in server.Keys(0, "InstrumentSK:*").Batch(1000))
     {
        var tran = cacheClient.Database.CreateTransaction();
        insListScan.Add(tran.StringGetAsync(batch.ToArray()));
        tran.Execute();
     }