MongoDB 有一个叫 Tailable Cursors的特性,它类似于tail -f 命令,你在一个Capped Collection上面执行查询操作,当操作完成后,你可以不关闭返回的数据Cursor,并持续地从中读出新加入的数据。
这个特性可以用来干什么?我觉得最直接的一个用途就是用作消息队列了,利用此特性加上MongoDB 天然的Replication 机制,做一个分布式的队列系统貌似不是什么难事。Capped collections
Capped collections 就是固定大小的collection。 它有很高的性能以及队列过期的特性(过期按照插入的顺序)。 有点和 "RRD" 概念类似。Tailable Cursor
通常, mongoDB在遍历完所有结果集中的数据后,会自动关闭游标。
但是, 对于Capped collections, 在遍历完所有数据后,游标一直保持打开状态。当客户端再次向Capped collections插入数据时,Tailable Cursor将继续得到数据。
Tailable Cursor在概念上,类似于Unix的tail命令的-f选项,即一种‘follow’模式。创建步骤
创建一个 Capped Collectiondb.createCollection("mycoll", {capped:true, size:100000})
和标准的collection不同,你必须要显式的创建一个capped collection, 指定一个collection的大小,单位是字节。collection的数据存储空间值提前分配的。 要注意的是指定的存储大小包含了数据库的头信息。
特性
如果空间都被使用完毕,新添加的对象会取代最旧的那个数据。
如果你执行find(),并没有指定顺序。返回的结果就是按照插入顺序排序。
倒序使用 find().sort({$natural:-1})。
应用
日志Logging.Capped collection性能非常优秀,可以来存储日志文档。
插入一个没有索引的capped collection速度非常接近存储在文件系统。 - 由于使用了内置的LRU机制,也不用担心超出硬盘空间。缓存Caching.
如果你希望在数据库缓存一些小数量的对象。capped collection提供了非常方便的机制来实现这个操作。
注意的是要给capped table添加索引,因为这种应用,读频率高于写。
自动存档Auto Archiving.如果你希望数据自动过期。capped collection要比手写cron scripts更为方便。
建议
默认的情况下,capped collection不会在_id添加索引。
为了最大化性能,不要再capped collection上创建索引。
如果这个collection写操作多于读操作,更不需要索引了。
注意的是,你可能创建了索引。速度就会降低,但是还是要比标准的collection要快。
使用 natural ordering 来更有效的获取最近插入的元素。和linux的tail命令相似。
限制对象的个数 db.createCollection("mycoll", {capped:true, size:100000, max:100}); 提示: 当编程的时候,存储最近对象的版本号的方法就是把max参数设为1(max=1)。使用validate()工具来查看collection使用的存储空间 db.mycoll.validate();
档时,通知订阅者。网友回复