我正在开发一个分布式 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/