Caching Redis StackExchange存储500k类
我正试图用redis取代现有的缓存系统,该系统基本上由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 =
字典
组成。我有大约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();
}