问题: 我们的一个模块是与3个不同的redis进行交互[不同的redis将有不同的redis-KEYS],mongo DB和mySQL。 我们应该如何设计数据层,以便将来如果我们更改数据库,我们就不需要更改业务层。
Desing的想法:
每种数据库都有3种不同的界面。对于redis,业务层将告诉哪些redis要查找密钥。但问题是如果我们改变redis机器,商务层需要改变。
有没有处理这种情况的标准方法?任何帮助将不胜感激。
答案 0 :(得分:0)
我认为用于特定密钥的redis的逻辑与数据访问层而不是业务层有关,因此Business层只告诉DAO层检索密钥,DAO层将决定哪个redis实例必须是使用
更新:
这看起来像是一个神奇的情况:看看hibernate分片(我的意思是hibernate的模式用来做出更好的想法)(http://www.ibm.com/developerworks/library/j-javadev2-11/)
总之,您可以使用某种" ShardSelectionStrategy" (定义此类界面),其中包含" selectShardIdForNewObject(Object obj)" 根据输入对象参数返回 ShardId 。
因此,每次要在数据库中插入新对象时,必须将ShardSelectionStrategy对象传递给DAO类,该DAO类具有为对象选择正确分片的知识,上文中的示例为:
if (obj instanceof Race) {
Race rce = (Race) obj;
return this.determineShardId(rce.getDistance());
} else if (obj instanceof Runner) {
//Do Something
}
因此,该策略根据种族距离确定分片ID。
Hibernate在按键搜索对象时也使用" ShardResolutionStrategy" ,并在每次需要查询数据库时将其传递给DAO层的查询方法。
我希望这些信息对您有所帮助。