在MongoDB中模拟Auto Increment的php代码

yipeiwu_com6年前PHP代码库
代码大致如下所示:
复制代码 代码如下:

<?php
function generate_auto_increment_id($namespace, array $option = array())
{
$option += array(
'init' => 1,
'step' => 1,
);
$instance = new Mongo();
$instance = $instance->selectCollection('_seq', 'seq');
$seq = $instance->db->command(array(
'findAndModify' => 'seq',
'query' => array('_id' => $namespace),
'update' => array('$inc' => array('id' => $option['step'])),
'new' => true,
));
if (isset($seq['value']['id'])) {
return $seq['value']['id'];
}
$instance->insert(array(
'_id' => $namespace,
'id' => $option['init'],
));
return $option['init'];
}
var_dump(generate_auto_increment_id('foo'));
var_dump(generate_auto_increment_id('bar', array('init' => 123)));
?>

其具体实现方式主要是利用MongoDB中findAndModify命令,只要每次往MongoDB里insert对象前生成ID赋值给_id就OK了,因为它的实现满足原子性,所以不存在并发问题。

另外说明一点,findAndModify本身提供了一个upsert参数,为true的话可以自动insert,但那样就不能自定义初始值了,所以文中示例没有使用upsert。

BTW,数据库“_seq”的名字以下划线开头,这样列表的时候会排在前面,更容易分辨些。

参考:Auto Increment with MongoDB

相关文章

php使用explode()函数将字符串拆分成数组的方法

本文实例讲述了php使用explode()函数将字符串拆分成数组的方法。分享给大家供大家参考。具体分析如下: explode()函数:字符串拆分成数组 示例代码如下: <...

浅谈PHP表单提交(POST&GET&URL编/解码)

POST方法不依赖于URL,不会将传递的参数值显示在地址栏中。另外,POST方法可以没有限制地传递数据到服务器,所有提交的信息在后台传输,用户在浏览器是看不到这一过程的,安全性高。 PO...

浅析php静态方法与非静态方法的用法区别

在php编程中,static关键字声明一个属性或方法是和类相关的,而不是和类的某个特定的实例相关,因此,这类属性或方法也称为“类属性”或“类方法” 如果访问控制权限允许,可不必创建该类对...

PHP5.3的垃圾回收机制(动态存储分配方案)深入理解

垃圾回收机制是一种动态存储分配方案。它会自动释放程序不再需要的已分配的内存块。 自动回收内存的过程叫垃圾收集。垃圾回收机制可以让程序员不必过分关心程序内存分配,从而将更多的精力投入到业务...

php的POSIX 函数以及进程测试的深入分析

php的POSIX 函数以及进程测试的深入分析

复制代码 代码如下:<?phpecho posix_getpid(); //8805sleep(10);?> 再用 #ps -ax 这个时候如果多开开个浏览器请求,就会发...