比如流水号是 10 位: 1000000001 , 1000000002 ,这样的,我想使用 PHP 生成这样的流水号,根据我的理解,流水号应该是连续增长的,但是我每次生成的时候怎么不重复而且保持连续呢?
存数据库的话比较麻烦,而且每次要查库,还要更新数据,性能低。也不能使用随机码,这样数字不连续。放到 redis 里面万一 redis 挂掉了呢所以也不好。
PHP 生成流水号有什么好办法?
比如流水号是 10 位: 1000000001 , 1000000002 ,这样的,我想使用 PHP 生成这样的流水号,根据我的理解,流水号应该是连续增长的,但是我每次生成的时候怎么不重复而且保持连续呢?
存数据库的话比较麻烦,而且每次要查库,还要更新数据,性能低。也不能使用随机码,这样数字不连续。放到 redis 里面万一 redis 挂掉了呢所以也不好。
PHP 生成流水号有什么好办法?
|
guoerSep 3, 2015
1
redis 可以备份的
|
|
dsgygbSep 3, 2015
2
窝这有个生成订单的函数。=--是随机的。只能保证 26 年内不重复。。。
function make_number (){ $year_code = array ('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','I','S','T','U','V','W','X','Y','Z'); return $year_code[intval (date ('Y'))-2015]. strtoupper (dechex (date ('m'))).date ('d'). substr (time (),-5 ).substr (microtime (),2,5 ).sprintf ('%02d',rand (0,99 )); } |
|
oott123Sep 3, 2015 via Android
3
不依赖数据库、不依赖外部存储…
万一楼主的 php 挂了呢? |
|
realpgSep 3, 2015
4
不依赖数据库不依赖外部存储?
既然你叫流水号要求不冲突, 如果是顺序的,那么至少要有一个地方存储当前值或者下一个值吧? 如果是随机的,那么至少要有一个地方存储已经生成的全部号码避免生成重复吧? |
|
branchzeroSep 3, 2015
5
满足这个条件的思路:
得有一个进程锁,保证每次读取 ID 之前,前面跑脚本的操作已经完全进行完毕了(也就是在每次读取 ID 前上锁, ID 自增后解锁)。 然后随便找一个靠谱地方存计数器就是了(文件啊、数据库、内存缓存或者其他,随便你) 用数据库的话上面这些都不是问题,不用数据库的话,自己想办法解决吧。 |
|
br00kSep 3, 2015
6
万一服务器挂了呢。
|
|
incompatibleSep 3, 2015 via iPhone
7
每次生成一批放在缓存里 随用随取
快用完时再生成一批 |
|
wumchSep 3, 2015
8
你这是同时高要求一致性、可用性、分区容错性啊
|
|
lavadoreSep 3, 2015
9
数据库已经有这个功能了,你不用为什么非要在 php 里用?
数据库不用查库, auto_increment 每次插入后自动返回流水号,已有的功能为什么不用 |
|
aprikyblueSep 3, 2015
11
万一来一道雷呢
|
|
cevincheungSep 3, 2015
12
mysql
select uuid_short () 生成流水号也是用来入库的,数据库挂了生成流水号也没啥用。 |
|
huigeerSep 3, 2015
13
时间戳加随机数
|
|
railsSep 3, 2015
14
其实楼主的问题可以简化为:如何在 php 内计数
|
|
1004Sep 3, 2015
15
弄个订单系统不就行了
|
|
roychanSep 3, 2015
16
要不查库那肯定只能找一个自递增或者自递减的变量了,也就是时间,自己设计一个算法生成不会重复的流水号即可。
|
|
moe3000Sep 3, 2015
17
redis 中开一个 key ,每次取出后, incr 一次,直接用 reids 生成
不过这样就依赖 redis 了 |
|
undeadkingSep 3, 2015
21
楼主对于流水号的理解本身就是有问题的,于是陷入了伪问题,平时都不留意各种系统的流水号是什么规则么.
|
|
loginv2Sep 4, 2015
22
默认环境为 centOS 6.5 下的话
使用文件锁定的方式(保证一致性)在自带的 RAMDISK 分区写入文件记录流水号 然后在业务结束之前 流水号写入数据库 ( RAMDISK 和 文件锁 保证性能和一致性,服务器重启 数据库也没法用 所以也不用担心服务重启) 服务器开机以后执行将数据库最后的流水号写入到文件 |
|
lbp0200Sep 6, 2015
23
guid 或者 redis 的原子加 1
|
|
xyzasd01Sep 8, 2015
24
如果自增主键从 1 开始。那该订单的流水号就是 100000000 + $自增 ID 。
|