java - 使用 Hazelcast/Redis 满足数据库支持的缓存需求

标签 java hibernate caching redis hazelcast

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

如果请求在某些资格规则上失败,系统应该将用户标识(请求的一个参数)加入黑名单。

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

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

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

方案一:我可以用redis来存储黑名单数据。每当请求在资格规则上失败时,我都可以轻松地将用户标识添加到 redis 缓存中。 - 优点:查询速度极快,易于实现 - 缺点:信任 redis 持久性,尽管它可以工作,但它是一种缓存解决方案,不是持久层。

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

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

我对选项 3 有疑问

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

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

编辑:

  • 黑名单中会有100m条记录,我有几个类似的黑名单。

  • 我的阅读表现很重要。我需要查询黑名单中是否存在 key ~100ms

最佳答案

伊戈克,

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

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

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

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

关于java - 使用 Hazelcast/Redis 满足数据库支持的缓存需求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36437538/

相关文章:

java - LinkedHashMap removeEldestEntry 和重写删除

java - Stack类的Search方法总是返回-1

hibernate - 我可以在 withTransaction 闭包内提交吗

asp.net - 使用 IIS8.5 的浏览器缓存,我做得对吗?

java - Hibernate @SecondaryTable - 指定主表的外键

java - 创建名称为 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0 的 bean 时出错

c# - 以编程方式删除回发时的浏览器缓存

java - 如何在 Java 中以编程方式更改 logback 日志级别?

java - 将 Map<String, List<Integer>> 转换为 Map<String, int[]>

java - 标准化 Hibernate 中的重复值 - Java