【问题标题】:Using Hazelcast / Redis for DB backed cache requirement使用 Hazelcast / Redis 满足数据库支持的缓存要求
【发布时间】:2016-07-26 01:17:32
【问题描述】:

我正在开发一个分布式 Java 应用程序,该应用程序需要检查每个请求的黑名单用户 ID 列表。

如果请求在某些资格规则上失败,系统应将 userid(请求参数)添加到黑名单。

我正在尝试为黑名单实施寻找合适的缓存解决方案。我的要求是;

  • 查询黑名单应该很快
  • 黑名单持久性技术应该是可扩展的
  • 所有黑名单数据都应保存在 RDBMS 上,以用于故障转移/重新加载。

它们是两种可能的解决方案;

方案一:我可以使用redis来存储黑名单数据。每当请求在资格规则上失败时,我都可以轻松地将用户 ID 添加到 redis 缓存中。 - 优点:查询极快,易于实现 - 缺点:虽然它有效,但信任 redis 持久性,但它是设计上的缓存解决方案,而不是持久性层。

选项2:我可以使用redis来存储黑名单数据,同时我可以在RDBMS上维护db表以用于黑名单。每当请求在资格规则上失败时,我可以将用户 ID 添加到 redis 缓存和 rdbms 表中。 - 优点:查询速度极快,能够(可能)从数据库重新加载redis缓存 - 缺点:redis和db表存在一致性问题。

选项 3:我可以使用 hazelcast 作为休眠 L2 缓存,当我将任何用户 id 添加到黑名单时,它会同时添加到缓存和数据库中。

我对选项 3 有疑问

  • hazelcast L2 缓存是否适合保存这样的黑名单用户列表?
  • hibernate 是否管理缓存和数据库之间的一致性问题?
  • 应用重启时,二级缓存如何重新加载?

最后一个问题 - 对于这样的用例,您还有其他建议吗?

编辑:

  • 黑名单中有1亿条记录,我有几个smilar黑名单。

  • 我的读取性能很重要。我需要查询黑名单中是否存在密钥~100ms

【问题讨论】:

  • 您的“查询”会是什么样子?我希望黑名单主要是纯基于密钥的访问(例如基于用户名或用户 ID)。你能澄清一下吗?

标签: java hibernate caching redis hazelcast


【解决方案1】:

Ygok,

仍在等待澄清查询要求,但我可以假设它是按键查找(因为您提到 Redis 并且 Redis 没有查询语言。Hazelcast 确实有 Distributed Query / Predicate API)。 按键查找是 Hazelcast 的一项极其快速的操作。

选项 2 中,您需要保持 RDBMS 和 Redis 缓存之间的数据一致性。使用 Hazelcast MapLoader / MapStore 您可以实现 write-through- / read-through- 缓存概念。您需要做的就是将条目放入缓存,Hazelcast 会立即或配置延迟(通过批处理)将其持久化到 RDBMS。

在性能方面,请随时熟悉最近的Hazelcast / Redis benchmark

如果您有任何问题,请告诉我。

【讨论】:

    【解决方案2】:

    我之前也有过类似的问题,首先,你要存储多少数据,花费多少内存?您需要每秒多快的查询速度?数据结构是什么样的,只有 userId 作为键?

    • Hazelcast 查询在我的测试中不是很快(你可以自己做),但它可以存储大量内存数据。使用 Java 的 Hazelcast 默认序列化,消耗大量内存和IO。

    • Hazelcast 提供休眠二级缓存,缓存数据存储在 Hazelcast(仅查询缓存),因此重新启动您的应用程序不会影响 缓存。

    • Redis 提供内存数据持久化(DUMP 和 AOF),也许是一个 服务器崩溃时会丢失一些数据,但速度非常快。

    • 如果您不想丢失任何数据,请存储在多个 MySQL 上 服务器(按用户 ID 将数据拆分到不同的服务器,但您应该 考虑添加新服务器时的问题),同时,您可以 添加本地缓存(例如 Ehcache 或 google CacheBuilder)并设置 过期时间,可以提升性能。

    【讨论】:

    • 也许你可以选择Redis(Master/Slave with sentinel mode),如果你的key长度是10个字节,100000000 * 10个字节差不多要消耗1GB内存,使用dump持久化模式。并且必须存储在 RDBMS 上以供其他用途?如果只考虑数据丢失,可以通过脚本将Redis转储文件备份到NAS。
    【解决方案3】:

    使用Redisson 框架可以保持Redis 缓存和RDBMS 之间的一致性。它使用 MapWriterMapLoader 对象为 Map 对象提供 write-throughread-through 策略,这些对象需要在您的情况下使用。

    请阅读documentation section

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-02
      • 2015-09-14
      • 2021-06-14
      • 1970-01-01
      • 2015-02-08
      • 2021-07-03
      • 2020-05-26
      相关资源
      最近更新 更多