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!

转载于:https://www.cnblogs.com/anyan/archive/2011/10/20/2310146.html

Redis实现MongoDB的getlasterror功能相关推荐

  1. 基于Redis+MySQL+MongoDB存储架构应用

    摘  要: Redis+MySQL+MongoDB技术架构实现了本项目中大数据存储和实时云计算的需求.使用MongoDB切片的水平动态添加,可在不中断平台业务系统的同时保障扩容后的查询速度和云计算效能 ...

  2. HBase、Redis、MongoDB、Couchbase、LevelDB 五款主流NoSQL数据库大比拼

    在 HBase.Redis.MongoDB.Couchbase.LevelDB 五款较主流的数据库产品中,本文将主要对它们进行分析对比. 鉴于缺乏项目中的实战经验沉淀,本文内容和观点主要还是从各平台资 ...

  3. HBase、Redis、MongoDB、Couchbase、LevelDB主流 NoSQL 数据库的对比

    最近小组准备启动一个 node 开源项目,从前端亲和力.大数据下的IO性能.可扩展性几点入手挑选了 NoSql 数据库,但具体使用哪一款产品还需要做一次选型. 我们最终把选项范围缩窄在 HBase.R ...

  4. memcache、Redis与MongoDB的学习-1

    除此接触这三个词的概念,对今天看的资料最了一些整理. 之前经常有看到memcache.Redis与MongoDB相关的数据库,最开始意味这些都只是用来做数据库优化的缓存工具,后来具体看了一些资料之后才 ...

  5. Redis和MongoDB的区别

    Redis和MongoDB的区别(面试受用) 项目中用的是MongoDB,但是为什么用其实当时选型的时候也没有太多考虑,只是认为数据量比较大,所以采用MongoDB. 最近又想起为什么用MongoDB ...

  6. redis,memcache,mongodb对比

    这段时间对memcache,redis,mongodb 3种nosql进行了熟悉,简单的总结了下. 1.从3者的性能来看,memcache性能是最好的,redis次之(redis有单进程限制,会碰到c ...

  7. redis作为MongoDB的缓存在线实时去重

    一.背景原理 部分内容参考基于python的MySQL和redis数据同步实现(redis做缓存) 这个说的真的很清楚,但缺少实际的案例 1.MongDB 数据库 MongDB是一种非关系型数据库,主 ...

  8. Redis和MongoDB的区别-

    Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理. Memcached是一个自由开源的,高性能,分布式内存对象缓存系统. MongoDB是一个基于分布 ...

  9. Redis和Mongodb应用场景

    Redis和Mongodb应用场景 原文: Redis和MongoDB的区别以及应用场景 现在的分布式项目基本都会用到redis和mongodb,可是redis和mongdb到底有什么不同呢,今天我就 ...

  10. Redis和Mongodb应用场景研究

    现在的分布式项目基本都会用到redis和mongodb,可是redis和mongdb到底有什么不同呢,今天我就基于我们公司的项目来具体介绍一下redis和mongodb的各自的应用场景. 首先我们这个 ...

最新文章

  1. mac终端命令-----常规操作
  2. 【已解决】Errors during downloading metadata for repository ‘appstream‘: - Status code: 404 for
  3. ASP.NET Core MVC+EF Core从开发到部署
  4. 从头学习linux C 冒泡法排序
  5. elementui的upload组件怎么获取上传的文本流、_抖音feed流直播间引流你还不会玩?实操讲解...
  6. bzoj1176: [Balkan2007]Mokia cdq
  7. 如何修改网页中的文本内容改成自己希望的数值?
  8. 使用OCCI连接Linux下Oracle数据库
  9. 程序员面试金典——4.7最近公共祖先
  10. 可视化—解决graphviz保存决策树中文乱码问题
  11. java weka 使用_如何在Java代码中的Weka中使用日期类型?
  12. 蜂考数据结构c语言版答案
  13. UCOS操作系统——信号量实验(十)
  14. 如何将 txt 文本文件保存为 html 文件
  15. vue地址选择插件V - Distpicker
  16. Quartz定时任务框架(一)
  17. 两向量叉乘的计算公式_向量的叉乘运算法则
  18. Dos命令 --复制文件(夹)
  19. 三下乡心得——勿忘农村
  20. 怎么一台手机多人签到_人脸识别来啦!志愿汇APP最新改版!支持一个手机多个账号同时签到签退!...

热门文章

  1. 最好的git命令行基础使用教程 windows
  2. matlab axes坐标轴长度,[转载]Matlab 坐标轴(axes),数据提示(data
  3. JavaSE基础——Java多线程(2)
  4. Jquery学习 -千锋学习
  5. android 属性翻牌动画,如何在Android中利用TextSwitcher实现一个文字上下翻牌效果
  6. Spring IOC三种注入方式(接口注入、setter注入、构造器注入)
  7. 在mysql数据库中创建Oracle数据库中的scott用户表
  8. acWing 1296 聪明的燕姿
  9. 设计模式,六大设计原则,类的特性
  10. 小程序block标签配合if和else 和 动态修改标题栏