Java 使用Hazelcast/Redis满足DB备份缓存要求
我正在开发一个分布式Java应用程序,它需要检查每个请求的黑名单用户ID列表 若请求在某些资格规则上失败,系统应将userid(请求的参数)添加到黑名单中 我试图为黑名单的实现找到一个合适的缓存解决方案。我的要求是:Java 使用Hazelcast/Redis满足DB备份缓存要求,java,hibernate,caching,redis,hazelcast,Java,Hibernate,Caching,Redis,Hazelcast,我正在开发一个分布式Java应用程序,它需要检查每个请求的黑名单用户ID列表 若请求在某些资格规则上失败,系统应将userid(请求的参数)添加到黑名单中 我试图为黑名单的实现找到一个合适的缓存解决方案。我的要求是: 查询黑名单应该很快 黑名单持久化技术应该是可伸缩的 所有黑名单数据应保存在RDBMS上,也用于故障转移/重新加载目的 这是两种可能的解决办法 选项1:我可以使用redis存储黑名单数据。每当请求在资格规则上失败时,我可以轻松地将userid添加到redis缓存中。 -优点:查询
- 查询黑名单应该很快
- 黑名单持久化技术应该是可伸缩的
- 所有黑名单数据应保存在RDBMS上,也用于故障转移/重新加载目的
- hazelcast二级缓存是否适合保存此类黑名单用户
- hibernate是否管理缓存和数据库之间的一致性问题
- 应用程序重新启动时,二级缓存如何重新加载
- 黑名单上会有100万条记录,我有几个笑脸黑名单
- 我的阅读能力很重要。我需要查询黑名单~100ms内是否存在密钥
- 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。