如题,首先谢谢所有来回答的大牛.
描述一下问题:
<code>学习PHP过程中想通过实践编写一套推广系统。 推广地址:**http://xxxx.com/N4aF35aS7** "N4aF35aS7"作为一个识别码。</code>
现在的问题是:
<code>PHP有函数以微秒级别获取字符,但是如果考虑到高 并发(具体有多高不讨论,但需要考虑进来)可能会 有重复? 另外,识别码在生成上有规范: 1.长度固定(8位左右,太长地址不友好) 2.组合形式为大写、小写字母,数字(参考百度网盘分享地址) 3.绝对不重复,这点很重要 4.没什么要求了,再谢谢来回答的人。</code>
如题,首先谢谢所有来回答的大牛.
描述一下问题:
<code>学习PHP过程中想通过实践编写一套推广系统。 推广地址:**http://xxxx.com/N4aF35aS7** "N4aF35aS7"作为一个识别码。</code>
现在的问题是:
<code>PHP有函数以微秒级别获取字符,但是如果考虑到高 并发(具体有多高不讨论,但需要考虑进来)可能会 有重复? 另外,识别码在生成上有规范: 1.长度固定(8位左右,太长地址不友好) 2.组合形式为大写、小写字母,数字(参考百度网盘分享地址) 3.绝对不重复,这点很重要 4.没什么要求了,再谢谢来回答的人。</code>
我提一种方法:预处理标识符
提前通过算法生成绝对不重复的标识符,这个过程中可以自己进行测试,而且因为是预处理的,不需要考虑时间和算法复杂性。
将生成的不重复的标识符写入数据库
在高并发的场景下只使用读取操作
上面主要是解决了高并发下的快速响应问题,那么唯一性如何保证呢?
有两个思路:
使用队列进行读取,保证所有的读取都是通过唯一的队列来完成,比如使用redis的pop操作
使用sql的update命令,这个时候需要另外一个字段userid, 伪代码:update TABLE set userid = $userid where userid = 0 limit 1;
,然后再使用userid进行查询对应的标识符即可。
最后,我坚持的观点是:最开始的时候就把代码设计的尽量安全,注意,安全方面的问题一定要高优先级考虑。
至于说,真正的场景中有哪些“高并发”的场景呢?我只想说,出了问题还是要程序员背锅。
如果要求绝对不重复那我感觉思路有两个
1.每次随机产生新建的id数据持久化,然后每次随机产生的数据查历史数据是否重复(但是这每次要数据持久化肯定比较消耗性能)
2.按规律累加(比如按日期时间戳balabala),这样产生过的就不会重复,但是高并发怎么不重复应该就要考虑一下了。
想问问题主比较担心的是并发状态下产生相同的识别码还是比较担心会产生历史重复的识别码?
如果担心是并发状态的话应该考虑你说的微秒级别字符加一定量的随机数就好了(每位随机数可以在48-122之间按ASCII转换为字符),加多几位就好了,虽说理论上没有绝对不重复但是概率应该还是很小了
如果考虑历史重复那我想到的就是一开始说的那两条了
用锁机制试试看。。
1 写文件每次+1
2 你既然是推广系统这个唯一码只要你带上用户id那么就唯一
3 看到这种什么高并发的问题就觉得是自己闲的蛋疼,整个互联网要处理高并发的公司真不多,拿来那么多高并发。感觉现在就是,框架,系统,高并发,缓存成为了程序员的口头禅了。
可以生成一条 插数据库 建个唯一索引 让数据库给你去重
根据数据库中唯一ID生成一个对应的62进制字符串。
比较多的文章分析短网址的规则都是生成62进制,理论上ID不重复也不会重复生成字符串,但是长度是会变的。看是否可接受。
没有那么多真正高并发的事,要求高用用户ID也是一种办法。