我应该在 ICacheManager 中缓存 json、Bson 还是 JObject?

Should I cache json, Bson or JObject in the ICacheManager?

我有一些需要缓存的 JObject,我想知道在 CacheManager 中缓存此类数据时的最佳做法是什么?

我很担心

  1. 在缓存中使用相当少量的内存。
  2. 不要进行不必要的序列化以避免无用的处理。

如果我缓存 json string 我需要在每次读取缓存时解析它。

如果我缓存 JObject 我不知道它将如何序列化到缓存中。可能是一个非紧凑型二进制数组。但是在取回它之后我不需要对它做任何事情。

这就是为什么我在考虑它可能会更好地序列化 Bson,或者只是添加另一层序列化?毕竟,我必须在读取缓存时将 Bson 转换为 JObject,就像我要缓存 json string.

一样

pursued this on github 其中,长话短说,我最终在检索时缓存了 json stringJObject.Parse

要问的相关问题是 "are you using a distributed cache?" 我是,而且我也在使用本地缓存。

如果我只使用本地缓存,我可以将 JObject 直接放入缓存中,因为不涉及序列化。

然而,当使用分布式缓存时,您实际上不能将 JObject 放入其中,因为该类型不可序列化(没有 SerializableAttribute)。

同时使用两者时,您会受到两者要求的限制,这意味着您只能缓存 json string 并在检索时解析它们。

有可能使用 CacheManager.Serialization.Json 包来替换序列化机制。但我宁愿在我的场景中保留二进制序列化器,因为我主要缓存 POCO,而二进制序列化器通常应该更高效。我不认为使用它会给我带来任何性能提升,因为内置序列化程序无论如何都必须在内部将 JObjects 转换为 json。

结论:通过保留二进制序列化程序并将 json 缓存为 string,我不会损失性能,但我必须添加一些 JObject.Parse(..)从缓存中读取时在这里和那里。通过良好的封装,这不是问题。