转载请附上本文地址:http://blog.csdn.net/u011957758/article/details/75810039
前言
是的,相信只要是社交类的app,或多或少会涉及到描述。那么当存在链接的时候,我们不知道链接有多长,所以描述字段就没法准确的用varchar(140)了。
难道用text?好像不行,两方面原因:1.描述肯定要有限制的。2.dba不推荐text,效率你懂的。
所以对于高并发下的短链如何实现,做一个总结,用于日后留恋。
正文
简述
需求:
1.描述需要限制140字,链接按照固定的字数算比如10字。
2.收集链接,用于额外的分析。
思路:
1.需要拆分出链接,便于计算字数,同时描述里头必须以短链形式替换不知长度的链接,这样描述落地到数据库时候,设置比140字稍长一点的字段即可。
2.需要将链接进行收集并入库存储,方便取出分析。
3.考虑线上数据量超级大,需要进行分析将尽可能非必要的操作异步化,让短链实现时候基本处在内存中操作。
流程图
注意点
1.短链替换完后,先会在redis缓存中设定对应的链接,目的是防止数据积压导致异步任务延时进行,导致描述输出的时候,短链没地方进行替换。
2.先是[U]{短链id}[/U],后面为[L]{短链id}[/L],目的是为了区分出链接是否有真的落到数据库了,并且这样可以更直观的在数据库的描述中识别出来。
3.如果量级不大,也可以用此套方案,将t2的实现直接在t1中完成,异步增加了复杂度与更多不确定因素。
4.存储链接的数据库字段需要设置为“CHARACTER SET utf8mb4 COLLATE utf8mb4_bin”,兼容emoji的表情。
重点实现
1.去除特定的字符标记
public function stripUrls($des) {
$des = preg_replace('/\[(U|L)\].+?\[\/(U|L)\]/i', '', $des);
$des = str_ireplace('[U]', '', $des);
$des