CouchDB可能是我见过最有创意的NoSQL产品。它通过append only的方式去组织数据,这样就能够通过对增量数据执行MapReduce的方法来生成数据视图。这一套方法背后是一个完整的体系。
当然,这也会引发一些问题,因为CouchDB默认是在读时合并修改的,也就是说,在数据读取时,CouchDB会先判断上次视图更新后又有多少新的写操作,然后将这些写操作通过MapReduce方法合并到视图中。并记录这一次更新的操作点。
很显然,这样每次进行合并更新可能降低读性能。特别是当遇到两次读之间的间隔过大时。可能会导致大量的写操作需要合并进视图,从而让读操作变得很慢。
那有什么方法可能解决这个问题。下面是一些具体的做法,你是否能接受这些做法可能还得看你的业务情况。
1.使用旧的视图
CouchDB在视图时,默认会进行写操作合并工作,这是我们上面讲过的。但是这里也说了,这只是一个默认,实际上你完全可以通过设置让其不更新视图,直接返回数据。当然,不更新,也就意味着你的数据不是最新的。所以说这需要你的业务能够接受。具体做法如下:
GET http://couchbase:5984/recipes/_design/recipes/_view/by_recipe?stale=ok |
说白了就是添加一个stale=ok的参数。
2.延迟合并
如果我们一直使用上面的方法。那么我们的数据可能就再也不会进行合并更新了。相信这是任何业务都难以忍受的。所以CouchDB还提供另一个stale的设置值,你可以设置它在读操作中返回旧的数据。然后CouchDB在返回数据后再自己执行合并工作。具体做法:
GET http://couchbase:5984/recipes/_design/recipes/_view/by_recipe?stale=update_after |
跟上面的很像,只是stale参数值变成了update_after,也就是随后更新。
3.定时更新
如果上面两种方式都不能让你满意,我们来看一下下面一个。CouchDB支持一个叫_change feed的特性,它像是订阅一样,会将所有变更操作推给订阅了此消息的客户端。于是我们就可以通过脚本去订阅变更。并且在变更时主动更新视图了。这里使用python客户端为例,具体做法如下:
from couchdb import Server cdbs = Server(‘http://localhost:5984/’) db = cdbs[‘recipes’] # the since parameter defaults to ‘last_seq’ when using continuous feed ch = db.changes(feed=’continuous’,heartbeat=’1000′) counter = 0 for line in ch: counter=counter+1 if (counter > 10): db.view(‘recipes/by_name’) counter = 0 |
上面例子中有一个counter计数,每当有更新时,将counter加1,当counter达到10时,就去主动更新视图。也就是制定每10次写操作就更新一次视图。这样读客户端就可以永远使用stale=ok的方式来读取数据就行了。
实际上,如果你设定counter为1时就更新视图,那么CouchDB就退化成为我们通常使用的写时更新索引的存储系统了。比如MongoDB或者MySQL。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
作者
相关推荐
-
OpenWorld18大会:Ellison宣布数据库的搜寻和破坏任务
在旧金山举行的甲骨文OpenWorld 2018大会中,甲骨文首席技术官(CTO)兼创始人Larry Elli […]
-
ObjectRocket着力发展Azure MongoDB服务
MongoDB吸引了微软公司的注意力,微软公司计划针对运行于该公司2017年发布的Azure Cosmos D […]
-
创建NoSQL数据建模符号 企业架构师亲自上阵
新兴的NoSQL数据风格促使创新的应用程序快速发展,但NoSQL同时也带来了挑战。NoSQL系统能够快速投入生产,有时甚至根本不用创建任何的前期模式。
-
深入理解Amazon DynamoDB NoSQL云数据库服务
Amazon DynamoDB NoSQL云数据库即服务主要为跨移动设备、网页web端、游戏、数字营销和物联网领域的应用提供支持。