最近有个在盛大的徒弟问我交易信息的存储方案,对于大型电子商务交易网站,经常碰到查询慢,数据量大的问题,使许多公司对于这种查询碰到瓶颈,包括我现在所在的公司,大多数公司是将数据库读写分离,但实际上效果并不是很好,查询依旧很慢,毕竟数据量比较大。
很巧,我最近也在思考这个问题,当然我的方案是NOSQL数据库与关系数据库保持最终一致性,而不是保持实时一致性。这个需要一个检查机制,我这里就讲一种高效的检查方案。
方案说明:
我们对于user信息表(强烈建议使用短表,主键为userid)加一个长度为32位字符串的字段或一个长整型的字段(为什么可以是两种类型?因为.NET中的hashcode是long型的),命名为CheckSum,顾名思义就是综合校验。这个数据是怎么得来的?
我们将该用户的userid,加上每条交易的交易号,金额,状态,类型,最后更新时间进行拼接,然后取MD5或者hash得到一个字符串或者长整型。
那么NoSQL也有对应的字段,另外加上最后一次更新的时间。当用户登录后,出发一次校验,当发现CheckSum不同的时候,则将NoSQL最后更新时间取出,并从关系数据库中读取该时间后的交易,并更新(NOSQL大多数更新就是插入),这样可以保证关系数据库和NOSQL数据库的最终一致性了。