我们当前的缓存实现会在报表对象中缓存大量数据(在某些情况下为50 MB)。
我们已从内存缓存迁移到文件缓存,并使用ProtoBuf进行序列化和反序列化。这很好用,但我们现在正在试验Redis缓存。 下面是Redis比使用文件系统需要多长时间的示例。 (注意:在设置字节数组时,使用protobuf代替JsonConvert可将设置时间提高到15秒,并在下面的示例中获得4秒的时间。)
// Extremely SLOW – caching using Redis (JsonConvert to serialize/de-serialize)
IDatabase cache = Connection.GetDatabase();
// 23 seconds!
cache.StringSet("myKey", JsonConvert.SerializeObject(bigObject));
// 5 seconds!
BigObject redisResult = JsonConvert.DeserializeObject<BigObject>(cache.StringGet("myKey"));
// FAST - caching using file system (protobuf to serialize/de-serialize)
IDataAccessCache fileCache = new DataAccessFileCache();
// .5 seconds
fileCache.SetCache("myKey",bigObject);
// .5 seconds
BigObject fileResult = fileCache.GetCache<BigObject>("myKey");
提前感谢您的帮助。
PS。我没有找到类似问题的答案。 Caching large objects - LocalCache performance
或
答案 0 :(得分:7)
Redis实际上并不是为存储大型对象(多MB)而设计的,因为它是一个单线程服务器。因此,一个请求将足够快,但一些请求将会很慢,因为它们都将由一个线程处理。在最后的版本中,进行了一些优化。
RAM和内存带宽的速度似乎对全局性能不太重要,特别是对于小型对象。对于大型对象(> 10 KB),它可能会变得明显。通常,购买昂贵的快速内存模块以优化Redis并不具有成本效益。 https://redis.io/topics/benchmarks
因此,如果可能,您可以使用巨型帧或购买更快的内存。但实际上它无济于事。 请考虑使用Memcached。它是多线程的,可以横向扩展以支持大量数据。 Redis只能通过主从复制进行扩展。