如何使用Redis缓存来缓存大对象

12

我们目前使用的缓存方案将大量数据缓存在报表对象中(某些情况下高达50MB)。

我们已从内存缓存迁移到文件缓存,并使用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");                              

感谢您提前提供的任何帮助。

附注:我没有在类似问题中找到答案。 缓存大型对象 - LocalCache性能

或者

缓存大型对象,减少检索时间的影响


1
你能把序列化和缓存插入分开,以确定是什么在消耗时间吗?很可能是JSon序列化。尝试使用不同的序列化方法,例如BinaryFormatter - thepirat000
感谢您的快速回复。序列化只占23秒中的1秒。当我们从内存转移到文件存储时,我们最初使用了BinaryFormatter,但它速度较慢,因此我们切换到ProtoBuf。我会试一试。 - Jon
对象序列化后有多大?你尝试过压缩吗?例如:这里 - thepirat000
1个回答

11

Redis实际上并不适合存储大型对象(多MB),因为它是单线程服务器。因此,一个请求的速度足够快,但是几个请求会很慢,因为它们都将由一个线程处理。在最新版本中进行了一些优化。

对于全局性能而言,RAM的速度和内存带宽似乎不那么关键,特别是对于小对象而言。对于大对象(> 10 KB),可能会变得显而易见。通常,购买昂贵的快速内存模块来优化Redis并不划算。https://redis.io/topics/benchmarks

因此,如果可能的话,您可以使用Jumbo帧或购买更快的内存。但实际上这不会有很大帮助。考虑使用Memcached。它是多线程的,可以水平扩展以支持大量数据。Redis只能通过主从复制来扩展。


这个答案已经过时了,因为Redis集群现在提供了扩展选项。 - jocull
@jocull 你应该发表一个更新的答案!我正在寻找一个关于2023年的问题的答案。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接