由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 请问mongodb + nodejs 如何保证原子操作
相关主题
傻逼太监懂个屁C*node.js的unavailable
HOW WE DECIDED TO USE MONGO INSTEAD OF MYSQL看来couchbase跟mongo是真的干上了
MongoDB快超过Postgres了现在最流行的分布式kv store是什么
MongoDB力压Cassandra鄙视芒果的被打脸了
貌似couchbase的性能很牛逼吗最牛逼的NOSQL,Mongo,Redis
DynamoDB 只能在 create Table 时候建 indexesMongo, Cassandra又干上了
mongo的sharding有人说不好 是什么原茵?看来我的感觉不错,Hbase下降明显呀
感觉vert.x的设计很一般呀Play2 vs Vert.x 是什么情况?
相关话题的讨论汇总
话题: mongodb话题: mongo话题: redis话题: 问题话题: upsert
进入Programming版参与讨论
1 (共1页)
f*****w
发帖数: 2602
1
比如我要先查找某个东西是否存在,然后根据是否存在再插入一条记录,这个该怎么做
到原子性?
我看了下mongodb提供的相关的只有findAndModify(),可是也没有findandinsert啊
然后如果自己用两个的sequential的 db operation写的话万一有race condition怎么
办? 好像并不是安全的做法
p*****2
发帖数: 21240
2
有什么race condition?



【在 f*****w 的大作中提到】
: 比如我要先查找某个东西是否存在,然后根据是否存在再插入一条记录,这个该怎么做
: 到原子性?
: 我看了下mongodb提供的相关的只有findAndModify(),可是也没有findandinsert啊
: 然后如果自己用两个的sequential的 db operation写的话万一有race condition怎么
: 办? 好像并不是安全的做法

f*****w
发帖数: 2602
3
按照时间 request A 查询到不存在 ----> request B 正好查询相同的数据,也是
不存在 -----> request A 插入记录成功 -----> request B 的插入挂了,或者就
duplicate 记录了。

【在 p*****2 的大作中提到】
: 有什么race condition?
:
: 啊

l**********n
发帖数: 8443
4
upsert?



【在 f*****w 的大作中提到】
: 比如我要先查找某个东西是否存在,然后根据是否存在再插入一条记录,这个该怎么做
: 到原子性?
: 我看了下mongodb提供的相关的只有findAndModify(),可是也没有findandinsert啊
: 然后如果自己用两个的sequential的 db operation写的话万一有race condition怎么
: 办? 好像并不是安全的做法

p*****2
发帖数: 21240
5
你用什么做?

【在 f*****w 的大作中提到】
: 按照时间 request A 查询到不存在 ----> request B 正好查询相同的数据,也是
: 不存在 -----> request A 插入记录成功 -----> request B 的插入挂了,或者就
: duplicate 记录了。

f*****w
发帖数: 2602
6
我在用 mongojs
貌似楼上说的upsert确实是mongodb原生命令中能解决我的问题的 我去研究下
mongojs是不是能支持搞这个
btw mongojs 是最靠谱的mongodb库么?

【在 p*****2 的大作中提到】
: 你用什么做?
l**********n
发帖数: 8443
7
you have index to ensure no duplicate. so what is the problem?

【在 f*****w 的大作中提到】
: 按照时间 request A 查询到不存在 ----> request B 正好查询相同的数据,也是
: 不存在 -----> request A 插入记录成功 -----> request B 的插入挂了,或者就
: duplicate 记录了。

p*****2
发帖数: 21240
8
node是单线程不会有race condition吧

【在 f*****w 的大作中提到】
: 我在用 mongojs
: 貌似楼上说的upsert确实是mongodb原生命令中能解决我的问题的 我去研究下
: mongojs是不是能支持搞这个
: btw mongojs 是最靠谱的mongodb库么?

n****j
发帖数: 1708
9
我用 mongoose

【在 f*****w 的大作中提到】
: 我在用 mongojs
: 貌似楼上说的upsert确实是mongodb原生命令中能解决我的问题的 我去研究下
: mongojs是不是能支持搞这个
: btw mongojs 是最靠谱的mongodb库么?

a9
发帖数: 21638
10
多进程就完了。

【在 p*****2 的大作中提到】
: node是单线程不会有race condition吧
相关主题
DynamoDB 只能在 create Table 时候建 indexesnode.js的unavailable
mongo的sharding有人说不好 是什么原茵?看来couchbase跟mongo是真的干上了
感觉vert.x的设计很一般呀现在最流行的分布式kv store是什么
进入Programming版参与讨论
p*****2
发帖数: 21240
11
多进程可以做sharding

【在 a9 的大作中提到】
: 多进程就完了。
k***5
发帖数: 583
12
agree with that, use unique index to ensure no dup.

【在 l**********n 的大作中提到】
: you have index to ensure no duplicate. so what is the problem?
w**z
发帖数: 8232
13
这和mongo或js 没关系。任何db 都有这样的问题。除非你把这个table 都锁住了。不
然只能通过unique index 来enforce. MySQL 有 on duplicate key update, client
不会有exception.



【在 f*****w 的大作中提到】
: 比如我要先查找某个东西是否存在,然后根据是否存在再插入一条记录,这个该怎么做
: 到原子性?
: 我看了下mongodb提供的相关的只有findAndModify(),可是也没有findandinsert啊
: 然后如果自己用两个的sequential的 db operation写的话万一有race condition怎么
: 办? 好像并不是安全的做法

n****j
发帖数: 1708
14
说起这个请教大牛们一个问题,我现在需要生成一个 seq ID,不是连续数字。
按 mongo 做法是用个 collection 记录然后 findandmodify。我觉得这样啰嗦,采用
insert on dup generate & retry,不知道相比之下有什么问题?

【在 w**z 的大作中提到】
: 这和mongo或js 没关系。任何db 都有这样的问题。除非你把这个table 都锁住了。不
: 然只能通过unique index 来enforce. MySQL 有 on duplicate key update, client
: 不会有exception.
:
: 啊

p*****2
发帖数: 21240
15

即使不用unique index,如果同样的document,也就是overwrite吧。

【在 w**z 的大作中提到】
: 这和mongo或js 没关系。任何db 都有这样的问题。除非你把这个table 都锁住了。不
: 然只能通过unique index 来enforce. MySQL 有 on duplicate key update, client
: 不会有exception.
:
: 啊

p*****2
发帖数: 21240
16


我怎么没看懂。seq ID是谁用?是document的一个field?

【在 n****j 的大作中提到】
: 说起这个请教大牛们一个问题,我现在需要生成一个 seq ID,不是连续数字。
: 按 mongo 做法是用个 collection 记录然后 findandmodify。我觉得这样啰嗦,采用
: insert on dup generate & retry,不知道相比之下有什么问题?

n****j
发帖数: 1708
17
对,比如按次序生成下一个 UPS 单号

【在 p*****2 的大作中提到】
:
: 用
: 我怎么没看懂。seq ID是谁用?是document的一个field?

p*****2
发帖数: 21240
18

用redis

【在 n****j 的大作中提到】
: 对,比如按次序生成下一个 UPS 单号
n****j
发帖数: 1708
19
厄 。。。我请教的是 mongo

【在 p*****2 的大作中提到】
:
: 用redis

p*****2
发帖数: 21240
20
为什么一定mongo

【在 n****j 的大作中提到】
: 厄 。。。我请教的是 mongo
相关主题
鄙视芒果的被打脸了看来我的感觉不错,Hbase下降明显呀
最牛逼的NOSQL,Mongo,RedisPlay2 vs Vert.x 是什么情况?
Mongo, Cassandra又干上了Cassandra 比较 Dynamodb
进入Programming版参与讨论
n****j
发帖数: 1708
21
擦,求知欲强啊,你总不能说 mongo 不能解决这个问题吧。再说别的东西也有各种各
样问题去,不是所有麻烦都能绕过去的。

【在 p*****2 的大作中提到】
: 为什么一定mongo
p*****2
发帖数: 21240
22
还没明白你的问题
你就是想生成seq number 还是要在mongo里用呀

【在 n****j 的大作中提到】
: 擦,求知欲强啊,你总不能说 mongo 不能解决这个问题吧。再说别的东西也有各种各
: 样问题去,不是所有麻烦都能绕过去的。

n****j
发帖数: 1708
23
比如 UPS 要生成 shipping label,客户 submit 了之后要给出一个不重复的
tracking#。不能假设 node 单线程不会冲突,因为很多 server 会连到你这个
mongodb。

【在 p*****2 的大作中提到】
: 还没明白你的问题
: 你就是想生成seq number 还是要在mongo里用呀

l**********n
发帖数: 8443
24
why you want to use number? can you use uuid?

【在 n****j 的大作中提到】
: 比如 UPS 要生成 shipping label,客户 submit 了之后要给出一个不重复的
: tracking#。不能假设 node 单线程不会冲突,因为很多 server 会连到你这个
: mongodb。

p*****2
发帖数: 21240
25

server多了做sharding不就得了?

【在 n****j 的大作中提到】
: 比如 UPS 要生成 shipping label,客户 submit 了之后要给出一个不重复的
: tracking#。不能假设 node 单线程不会冲突,因为很多 server 会连到你这个
: mongodb。

p*****2
发帖数: 21240
26

感觉你这个问题属于system design了。

【在 n****j 的大作中提到】
: 比如 UPS 要生成 shipping label,客户 submit 了之后要给出一个不重复的
: tracking#。不能假设 node 单线程不会冲突,因为很多 server 会连到你这个
: mongodb。

z***e
发帖数: 5393
27
我的游戏也遇到这个问题的.
我想给每个玩家一个独立标示,但是又不能像UUID那么长,更像电话号码一样。
以前公司的游戏里面是随机生成9个数字+字母,然后查找看有没有重复,如果有就再
repeat,直到不重复(最多repeat N次,看情况)----这是个北美Top 50内手机游
戏的设计,用户量千万是有的。
我现在的设计是用总用户数+ 秒+毫秒+随机三位数,不过出来的数字还是太多了,
效果不好。。。
anyway,我意思是,没必要考虑理论上的“绝对唯一”。
还有个办法是专门用一个service生成一堆unique number作为一个queue,每次你过去
取一个,然后那个pool可以自己做一个thread safe的处理,保证每次只响应一个请求
,不会同时处理多个(当然也可以同时处理,比如你再把这个queue分割开10个,同时
响应10个请求云云)----但是我觉得那是没事找事做。

【在 n****j 的大作中提到】
: 比如 UPS 要生成 shipping label,客户 submit 了之后要给出一个不重复的
: tracking#。不能假设 node 单线程不会冲突,因为很多 server 会连到你这个
: mongodb。

x****u
发帖数: 44466
28
uuid只有16字节啊

【在 z***e 的大作中提到】
: 我的游戏也遇到这个问题的.
: 我想给每个玩家一个独立标示,但是又不能像UUID那么长,更像电话号码一样。
: 以前公司的游戏里面是随机生成9个数字+字母,然后查找看有没有重复,如果有就再
: repeat,直到不重复(最多repeat N次,看情况)----这是个北美Top 50内手机游
: 戏的设计,用户量千万是有的。
: 我现在的设计是用总用户数+ 秒+毫秒+随机三位数,不过出来的数字还是太多了,
: 效果不好。。。
: anyway,我意思是,没必要考虑理论上的“绝对唯一”。
: 还有个办法是专门用一个service生成一堆unique number作为一个queue,每次你过去
: 取一个,然后那个pool可以自己做一个thread safe的处理,保证每次只响应一个请求

n****j
发帖数: 1708
29
不是这个问题,UPS tracking# 有自己格式,你马工不能嫌麻烦让人改成数字拉倒,要
解决客户的问题。

【在 l**********n 的大作中提到】
: why you want to use number? can you use uuid?
n****j
发帖数: 1708
30
我现在做法就是先 insert next seq id,dup 了 retry next,不知道有没有 build
in 的办法,比如给 mango 一个 getNextSeq 来取代他自己的生成 _id 算法

【在 z***e 的大作中提到】
: 我的游戏也遇到这个问题的.
: 我想给每个玩家一个独立标示,但是又不能像UUID那么长,更像电话号码一样。
: 以前公司的游戏里面是随机生成9个数字+字母,然后查找看有没有重复,如果有就再
: repeat,直到不重复(最多repeat N次,看情况)----这是个北美Top 50内手机游
: 戏的设计,用户量千万是有的。
: 我现在的设计是用总用户数+ 秒+毫秒+随机三位数,不过出来的数字还是太多了,
: 效果不好。。。
: anyway,我意思是,没必要考虑理论上的“绝对唯一”。
: 还有个办法是专门用一个service生成一堆unique number作为一个queue,每次你过去
: 取一个,然后那个pool可以自己做一个thread safe的处理,保证每次只响应一个请求

相关主题
哪位说说AWS到底比其他VPS好在哪里?HOW WE DECIDED TO USE MONGO INSTEAD OF MYSQL
Redis和Memcached有什么区别?MongoDB快超过Postgres了
傻逼太监懂个屁C*MongoDB力压Cassandra
进入Programming版参与讨论
a9
发帖数: 21638
31
mongodb设计出来就不是干这个的。
你可以自己用javascript写个插件干这个事儿吧。

【在 n****j 的大作中提到】
: 不是这个问题,UPS tracking# 有自己格式,你马工不能嫌麻烦让人改成数字拉倒,要
: 解决客户的问题。

p*****2
发帖数: 21240
32
那还不如用redis呢 多简单呀

【在 z***e 的大作中提到】
: 我的游戏也遇到这个问题的.
: 我想给每个玩家一个独立标示,但是又不能像UUID那么长,更像电话号码一样。
: 以前公司的游戏里面是随机生成9个数字+字母,然后查找看有没有重复,如果有就再
: repeat,直到不重复(最多repeat N次,看情况)----这是个北美Top 50内手机游
: 戏的设计,用户量千万是有的。
: 我现在的设计是用总用户数+ 秒+毫秒+随机三位数,不过出来的数字还是太多了,
: 效果不好。。。
: anyway,我意思是,没必要考虑理论上的“绝对唯一”。
: 还有个办法是专门用一个service生成一堆unique number作为一个queue,每次你过去
: 取一个,然后那个pool可以自己做一个thread safe的处理,保证每次只响应一个请求

p*****2
发帖数: 21240
33
你这属于system design 你没必要非得用mngo 整个redis就行了

【在 n****j 的大作中提到】
: 我现在做法就是先 insert next seq id,dup 了 retry next,不知道有没有 build
: in 的办法,比如给 mango 一个 getNextSeq 来取代他自己的生成 _id 算法

n****j
发帖数: 1708
34
为了这么个小问题换 redis,还有其他问题 redis 不容易解决的换啥?换客户吗?

【在 p*****2 的大作中提到】
: 你这属于system design 你没必要非得用mngo 整个redis就行了
p*****2
发帖数: 21240
35

你太有意思了。就不能mongo+redis?

【在 n****j 的大作中提到】
: 为了这么个小问题换 redis,还有其他问题 redis 不容易解决的换啥?换客户吗?
n****j
发帖数: 1708
36
现在的问题是,怎么用 mango 解决类似问题,mango+redis 显然比我这个效率低

【在 p*****2 的大作中提到】
:
: 你太有意思了。就不能mongo+redis?

p*****2
发帖数: 21240
37

are you sure? 为什么你会认为效率低?

【在 n****j 的大作中提到】
: 现在的问题是,怎么用 mango 解决类似问题,mango+redis 显然比我这个效率低
p*****2
发帖数: 21240
38

我一直奇怪为什么会有人想用一种Nosql去解决所有问题。

【在 n****j 的大作中提到】
: 现在的问题是,怎么用 mango 解决类似问题,mango+redis 显然比我这个效率低
n****j
发帖数: 1708
39
Race 发生的机会不大,当然每个系统不同,在我这不到千分之一,你的方案每次都需
要 2 次操作

【在 p*****2 的大作中提到】
:
: 我一直奇怪为什么会有人想用一种Nosql去解决所有问题。

p*****2
发帖数: 21240
40

redis的latency也就是1ms,对整个latency的影响完全可以忽略

【在 n****j 的大作中提到】
: Race 发生的机会不大,当然每个系统不同,在我这不到千分之一,你的方案每次都需
: 要 2 次操作

相关主题
MongoDB力压Cassandramongo的sharding有人说不好 是什么原茵?
貌似couchbase的性能很牛逼吗感觉vert.x的设计很一般呀
DynamoDB 只能在 create Table 时候建 indexesnode.js的unavailable
进入Programming版参与讨论
a*****e
发帖数: 1700
41
前面的回答 upsert 已经完美解决问题,不明白还在讨论什么
f*****w
发帖数: 2602
42
传统db 可以有transaction 貌似可以绕过这个问题

【在 w**z 的大作中提到】
: 这和mongo或js 没关系。任何db 都有这样的问题。除非你把这个table 都锁住了。不
: 然只能通过unique index 来enforce. MySQL 有 on duplicate key update, client
: 不会有exception.
:
: 啊

w**z
发帖数: 8232
43
你要在Client 端把整个block of code synchronized.

【在 f*****w 的大作中提到】
: 传统db 可以有transaction 貌似可以绕过这个问题
1 (共1页)
进入Programming版参与讨论
相关主题
Play2 vs Vert.x 是什么情况?貌似couchbase的性能很牛逼吗
Cassandra 比较 DynamodbDynamoDB 只能在 create Table 时候建 indexes
哪位说说AWS到底比其他VPS好在哪里?mongo的sharding有人说不好 是什么原茵?
Redis和Memcached有什么区别?感觉vert.x的设计很一般呀
傻逼太监懂个屁C*node.js的unavailable
HOW WE DECIDED TO USE MONGO INSTEAD OF MYSQL看来couchbase跟mongo是真的干上了
MongoDB快超过Postgres了现在最流行的分布式kv store是什么
MongoDB力压Cassandra鄙视芒果的被打脸了
相关话题的讨论汇总
话题: mongodb话题: mongo话题: redis话题: 问题话题: upsert