【发布时间】: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