如果请求失败了某些资格规则,则系统应将用户ID(请求参数)添加到黑名单中。我正试图找到合适的缓存解决方案来实现黑名单。
我的要求是:
- 查询黑名单速度应非常快 - 黑名单持久性技术应具有可伸缩性 - 所有黑名单数据也应该在RDBMS上持续存在,以备故障转移/重新加载等情况。
有两个可能的解决方案:
选项1:可以使用redis存储黑名单数据。每当请求不符合资格规则时,我可以轻松地将userid添加到redis缓存中。
- 优点:查询速度极快,易于实现 - 缺点:尽管它能运行,但信任redis持久性,因为它是按设计而非一种持久层的缓存解决方案。
选项2:可以同时使用redis存储黑名单数据,同时在RDBMS上维护db表格以用于黑名单。每当请求不符合资格规则时,我可以同时将userid添加到redis缓存和rdbms表格中。
- 优点:查询速度极快,有从数据库重新加载redis缓存的能力(可能) - 缺点:redis和数据库之间存在一致性问题。
选项3:可以使用Hazelcast作为Hibernate L2缓存。当我将任何用户ID添加到黑名单中时,它会同时添加到缓存和数据库中。
对于选项3,我有几个问题:
- Hazelcast L2缓存是否适合保留此类黑名单用户列表? - Hibernate是否管理缓存与数据库之间的一致性问题? - 应用程序重新启动时,如何重新加载L2缓存?
还有一个问题:
- 您对这样的用例有其他建议吗?
编辑:
- 黑名单中将有100m条记录,我有几个类似的黑名单。 - 我的读取性能很重要。我需要在黑名单中查询键的存在性约为100ms