Java 100M+ 键的缓存设计?
Java caching design for 100M+ keys?
需要为 Java 独立应用程序缓存超过 100+ 百万个字符串密钥(~100 个字符长度)。
标准缓存属性要求:
- 坚持不懈。
- 在 10 毫秒范围内从缓存中获取密钥的 TPS。
- 允许失效和过期。
- 独立的缓存服务器,允许多线程访问。
最好不要使用企业数据库,因为这个 100M 的密钥可以扩展到 500M,这会占用大量内存和系统资源,吞吐量低下。
尝试Guava Cache
。它满足您的所有要求。
链接:
- Guava Cache Explained
- guava-cache
- Persistence: Guava cache
编辑:另一个。我还没有使用它。 eh-cache
对于分布式缓存你可以尝试使用hazelcast。
它可以根据您的需要进行扩展,并且具有开箱即用的备份和同步功能。它是一个 JSR-107 提供者,并且有许多其他有用的工具可供使用。但是,如果你想要持久化,就需要自己处理或者购买他们的企业版了。
最后,为了解决这个大数据问题,使用现有的缓存解决方案(hazelcast, Guava cache, eh-cache 等):
- 已将缓存分为两级。
- 将约 100K 个密钥分组到一个 java 集合中,并将它们与常见的 属性 相关联,在我的例子中,密钥具有时间戳。所以,那个时间戳槽成为这个100K
二级缓存块的关键
- 此时隙密钥存储在 Java 持久缓存中,其值为压缩 Java 集合。
- 我设法通过带有压缩和解压缩开销的 2 级缓存获得良好吞吐量的原因是,我的关键搜索是范围限制的,因此当找到缓存匹配时,大多数后续搜索都在内存中解决 java 以前搜索的合集。
总结:确定要分组的键中的公共属性并将它们分解为多级缓存,否则您将需要大量的硬件和企业缓存来支持这个大数据问题。
需要为 Java 独立应用程序缓存超过 100+ 百万个字符串密钥(~100 个字符长度)。
标准缓存属性要求:
- 坚持不懈。
- 在 10 毫秒范围内从缓存中获取密钥的 TPS。
- 允许失效和过期。
- 独立的缓存服务器,允许多线程访问。
最好不要使用企业数据库,因为这个 100M 的密钥可以扩展到 500M,这会占用大量内存和系统资源,吞吐量低下。
尝试Guava Cache
。它满足您的所有要求。
链接:
- Guava Cache Explained
- guava-cache
- Persistence: Guava cache
编辑:另一个。我还没有使用它。 eh-cache
对于分布式缓存你可以尝试使用hazelcast。
它可以根据您的需要进行扩展,并且具有开箱即用的备份和同步功能。它是一个 JSR-107 提供者,并且有许多其他有用的工具可供使用。但是,如果你想要持久化,就需要自己处理或者购买他们的企业版了。
最后,为了解决这个大数据问题,使用现有的缓存解决方案(hazelcast, Guava cache, eh-cache 等):
- 已将缓存分为两级。
- 将约 100K 个密钥分组到一个 java 集合中,并将它们与常见的 属性 相关联,在我的例子中,密钥具有时间戳。所以,那个时间戳槽成为这个100K 二级缓存块的关键
- 此时隙密钥存储在 Java 持久缓存中,其值为压缩 Java 集合。
- 我设法通过带有压缩和解压缩开销的 2 级缓存获得良好吞吐量的原因是,我的关键搜索是范围限制的,因此当找到缓存匹配时,大多数后续搜索都在内存中解决 java 以前搜索的合集。
总结:确定要分组的键中的公共属性并将它们分解为多级缓存,否则您将需要大量的硬件和企业缓存来支持这个大数据问题。