Java 使用Hazelcast/Redis满足DB备份缓存要求

Java 使用Hazelcast/Redis满足DB备份缓存要求,java,hibernate,caching,redis,hazelcast,Java,Hibernate,Caching,Redis,Hazelcast,我正在开发一个分布式Java应用程序,它需要检查每个请求的黑名单用户ID列表 若请求在某些资格规则上失败,系统应将userid(请求的参数)添加到黑名单中 我试图为黑名单的实现找到一个合适的缓存解决方案。我的要求是: 查询黑名单应该很快 黑名单持久化技术应该是可伸缩的 所有黑名单数据应保存在RDBMS上,也用于故障转移/重新加载目的 这是两种可能的解决办法 选项1:我可以使用redis存储黑名单数据。每当请求在资格规则上失败时,我可以轻松地将userid添加到redis缓存中。 -优点:查询

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

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

我试图为黑名单的实现找到一个合适的缓存解决方案。我的要求是:

  • 查询黑名单应该很快
  • 黑名单持久化技术应该是可伸缩的
  • 所有黑名单数据应保存在RDBMS上,也用于故障转移/重新加载目的
这是两种可能的解决办法

选项1:我可以使用redis存储黑名单数据。每当请求在资格规则上失败时,我可以轻松地将userid添加到redis缓存中。 -优点:查询速度极快,易于实现 -缺点:依赖redis的持久性尽管它可以工作,但从设计上来说,它是一种缓存解决方案,而不是持久性层

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

选项3:我可以将hazelcast用作hibernate二级缓存,当我将任何用户id添加到黑名单时,它都会添加到缓存和数据库中

我对方案3有疑问

  • hazelcast二级缓存是否适合保存此类黑名单用户
  • hibernate是否管理缓存和数据库之间的一致性问题
  • 应用程序重新启动时,二级缓存如何重新加载
还有最后一个问题 -对于这样的用例,您还有其他建议吗

编辑:

  • 黑名单上会有100万条记录,我有几个笑脸黑名单

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


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

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

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

  • Redis提供内存数据持久性(转储和AOF),可能是 服务器崩溃时会丢失一些数据,但速度非常快

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

    • Ygok

      仍在等待关于查询要求的澄清,但我可以假设它是按键查找(因为您提到了Redis,Redis没有查询语言,Hazelcast有)。 使用Hazelcast,按键查找是一种极快的操作

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

      在性能方面,请随时熟悉最近的产品


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

      使用框架可以保持Redis缓存和RDBMS之间的一致性。它为使用案例中需要使用的
      MapWriter
      MapLoader
      对象的地图对象提供
      直写
      通读
      策略

      请阅读此

      您的“查询”是什么样的?我希望黑名单主要是纯基于密钥的访问(例如基于用户名或userid)。你能澄清一下吗?也许你可以选择Redis(带sentinel模式的主/从),如果你的密钥长度是10字节,100000000*10字节几乎需要1GB内存,那么使用转储持久模式。并且必须存储在RDBMS上用于其他用途?如果只考虑数据丢失,请通过脚本将ReDIS转储文件备份到NAS。