免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4166 | 回复: 1
打印 上一主题 下一主题

[Redis] Redis实现MongoDB的getlasterror功能 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-02-16 19:31 |只看该作者 |倒序浏览
Redis实现MongoDB的getlasterror功能








MongoDB有一个命令叫getlasterror,从名字上看它的作用好像是获取最近的一个error。但其实这是MongoDB的一种客户端阻塞的方式。官方的解释如下:

MongoDB does not wait for a response by default when writing to the database. Use the getLastError command to ensure that operations have succeeded.

MongoDB 在写操作时,默认不会等数据写完后才返回,你可以通过使用getLastError命令来保证你的写是成功的。

说白了,MongoDB的写是异步的,返回给客户端成功但其写并不一定成功,而且在多个数据结点进行replication的时候,更无法保证数据同步到其它结点上。getLastError就是为此而生的,你指定一个条件,然后这个函数会一直阻塞到服务端告知这个条件满足了才会返回值。(当然,为了防止死等,这个函数还有一个超时参数),例子:

db.runCommand( { getlasterror : 1 , w : 2 } )上面命令表示等写操作被写到两个结点再返回成功。

这一功能使得数据安全性的保证更加灵活。

而最近有朋友在Redis上也实现了这一功能,实现的方式不是修改Redis源码,而是使用现有的功能拼得出,具体过程如下:

1. Client SUBSCRIBEs to  KEY on *slave*
2. Client writes KEY (e.g. set foo bar) to master
3. Client publishes KEY to master

由于Redis的单线程写操作,下面两个操作会被顺序执行

4. Master will replicate KEY to slave
5 Master will propogate *PUBLISH KEY* to slave

最后,在Master同步完数据后,客户端会收到SUBSCRIBE的消息:
6. Gets KEY event on SUBSCRIBE!

来源:http://goo.gl/7zDPb

论坛徽章:
0
2 [报告]
发表于 2012-02-17 22:32 |只看该作者
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP