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吧
|
|
|
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
|
|
|
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的处理,保证每次只响应一个请求
|
|
|
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 次操作
|
|
|
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 貌似可以绕过这个问题
|