扫码关注官方订阅号
学习是最好的投资!
以下要素视情况组合
另外,db/redis自增均可考虑跳步&缓存来降低压力(每次自增10/50/100回来后缓存在本地,本地的用完再去拿)
各位前辈们好,我有一个想法不知道是否可行:
1、创建一个序列号表,只有一行数据,为序列号的值
2、生成序列号时,每次读取该表,从该表中读取该行数据,语句为: SELECT SERIAL_NUM FROM SERIAL_TABLE WHERE ID = 1 FOR UPDATE;
3、每次读取的时候给该行使用FOR UPDATE上锁,读取完以后使用以下语句: UPDATE SERIAL_TABLE SET SERIAL_NUM = SERIAL_NUM + 1 WHERE ID = 1; COMMIT;
4、释放行锁,不知道这样是否可行,欸……
http://www.cnblogs.com/heyuquan/archive/2013/08/16/global-guid-identit...
3方案有什么问题吗? 位数大了有什么后果吗? 并没有。 在3方案的基础上还可以预生成一些可用id..如果你真的需要这么大的并发的话。
这跟高并发关系不大, 而是你需要列队服务, 来避开刚并发的同时执行而已.
自增是最好的办法了, 位数增大不很正常吗,说明你订单多啊. 当订单超过一定数量分表啊.
光时间戳还不够吗,YYYYMMddHHmmssSSS+uid试试
http://www.zuidaima.com/share/1550463224040448.htm 不知道这个可以不?高并发下,我觉得尽量少点去访问db吧
要想省事就用Hazelcast里的distributed counter,用法类似于AtomicLong
md5($uid.'_'.uniqid().'_'.rand(0,99999).'_'.$productName);
$productName为用户购买商品的名称,这个订单号都还重复的话,别搞电商了,买彩票吧,来钱快
这个位数的影响可以忽略吧,你用任何的计数方式,都会增长,又不存在你换种计数就会少了几位数。除非你用16进位制或者更高的进位制才有可能。
同时申请id的方法就是把并发的请求改成串行,其实用redis设置一个自增值,每次取就加一,这个就非常合适。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
以下要素视情况组合
另外,db/redis自增均可考虑跳步&缓存来降低压力(每次自增10/50/100回来后缓存在本地,本地的用完再去拿)
各位前辈们好,我有一个想法不知道是否可行:
1、创建一个序列号表,只有一行数据,为序列号的值
2、生成序列号时,每次读取该表,从该表中读取该行数据,语句为:
SELECT SERIAL_NUM FROM SERIAL_TABLE WHERE ID = 1 FOR UPDATE;
3、每次读取的时候给该行使用FOR UPDATE上锁,读取完以后使用以下语句:
UPDATE SERIAL_TABLE SET SERIAL_NUM = SERIAL_NUM + 1 WHERE ID = 1;
COMMIT;
4、释放行锁,不知道这样是否可行,欸……
http://www.cnblogs.com/heyuquan/archive/2013/08/16/global-guid-identit...
3方案有什么问题吗? 位数大了有什么后果吗? 并没有。
在3方案的基础上还可以预生成一些可用id..如果你真的需要这么大的并发的话。
这跟高并发关系不大, 而是你需要列队服务, 来避开刚并发的同时执行而已.
自增是最好的办法了, 位数增大不很正常吗,说明你订单多啊. 当订单超过一定数量分表啊.
光时间戳还不够吗,YYYYMMddHHmmssSSS+uid试试
http://www.zuidaima.com/share/1550463224040448.htm
不知道这个可以不?高并发下,我觉得尽量少点去访问db吧
要想省事就用Hazelcast里的distributed counter,用法类似于AtomicLong
$productName为用户购买商品的名称,这个订单号都还重复的话,别搞电商了,买彩票吧,来钱快
这个位数的影响可以忽略吧,你用任何的计数方式,都会增长,又不存在你换种计数就会少了几位数。除非你用16进位制或者更高的进位制才有可能。
同时申请id的方法就是把并发的请求改成串行,其实用redis设置一个自增值,每次取就加一,这个就非常合适。