php实现含有redis命令的原子操作
在做一个爬虫,其中有一部分是评论数据。因为评论数太多,所以想要将爬取下来的评论进行分表。
目前的思路是:
每个表保存100万条数据(1-1000000保存在table1,1000001-2000000保存在table2)。
在redis创建一个String键comment:totalNum,保存数据库中已有的评论数。
根据 comment:totalNum 来确定评论的主键id以及保存到哪个表中。
目前思路是:
$id = $redis->get( 'comment:totalNum' );
$tableName = getTableName( $id );
$sql = "insert xxx";
$res = $db->mysql_query( 'sql' );
if( $res ){
$redis->incr( 'comment:totalNum' );
}
因为考虑用多线程,所以当一个表快要到100万条数据时,就会有一个问题:
如果一个进程获取了comment:totalNum为1000000,判断可以放在表一中,然后去执行对数据库的操作,但是如果此时也有一个进程获取了comment:totalNum的值,那么也会进行对数据库的操作,结果就会是数据库中增加了两条记录,一条主键为1,000,000,一条主键为1,000,001,不符合初衷。
所以我想问一下,有没有比较好的方法,能实现:
原子操作 start
$id = $redis->get( 'comment:totalNum' );
$tableName = getTableName( $id );
$sql = "insert xxx";
$res = $db->mysql_query( 'sql' );
if( $res ){
$redis->incr( 'comment:totalNum' );
}
原子操作 end
相关阅读:
Python的lxml模块,无法用dtd验证xml文件是为什么?
ios 怎样让远程通知在通知栏中显示
webkit内核浏览器创建快捷方式
用gdb tui模式调试无法从标准输入?
什么是ORM,以及在php上的使用?
GULP有什么插件能够对HTML文件的css进行合并
关于JS中Object.create的兼容实现
nodejs get请求,希望数据能在游览器缓存
php中的可变变量和引用赋值有什么区别
运行angular2文件报错?
java,返回错误
用json-lib,把json串转成java对象问题
关于移动web前端,由于不同的devicePixelRatio到指定的css尺寸和实际显示尺寸不一样的问题?
有 npm script 还需要 gulp 么?
在table中使用border-collapse时如何设置不同的border颜色?
引入jquery分页插件
对已获取的url和参数,如何模拟post请求?
canvas画图IPAD上画不出来。
reactjs和flux的一些疑问
expdp的问题