專業(yè)的短鏈接生成工具
鏈接域名
短網(wǎng)址有效期
社群營銷短鏈接服務(wù)設(shè)計
更新時間:2025-4-22 07:07:10 作者:愛短鏈
背景:最近無意中看到,操作在群里分享頁面時,鏈接很長,導(dǎo)致發(fā)出后直接刷屏。這種體驗肯定不好,當(dāng)然也不利于轉(zhuǎn)化。所以更好的辦法是生成一個短鏈接服務(wù),可以縮短鏈接,所以我寫了一個工具來優(yōu)化它,也研究了常見的短鏈接服務(wù)設(shè)計。
點擊即可在線生成:http://www.meetyule.com
計劃比較
方案一:可以通過digest MD5操作得到一個定長的值,然后持久化到數(shù)據(jù)庫中。當(dāng)然,生成的時候需要判斷是否重復(fù)。如果哈希沖突,即重復(fù),則重復(fù)操作,直到生成并寫入數(shù)據(jù)庫。
優(yōu)點:長度固定群里短鏈接服務(wù)設(shè)計方案對比方案,你值得擁有!更方便的直接調(diào)用庫。
缺點:當(dāng)數(shù)據(jù)量大時,可能會頻繁發(fā)生碰撞,導(dǎo)致生成效率低。當(dāng)然短鏈接服務(wù),常規(guī)短鏈接可以根據(jù)業(yè)務(wù)考慮進行清理。
選項2:您可以使用表的字段來自動增加長鏈接的映射。當(dāng)然,為了進一步簡化,還可以將十進制優(yōu)化為62系統(tǒng)短鏈接服務(wù),即[0-9],[a-z][A-Z]62個字符,只用4位就可以表示62^4個鏈接,所以就足夠了。至于線上高并發(fā)的一般方案,是分布式的,但在我看來,并沒有那么復(fù)雜。可以參考分布式id生成方法。您不需要每次都請求DB來獲得自我增值。它可以在每臺應(yīng)用機器上使用。緩存一個區(qū)間,大大降低了DB的負載。唯一的缺陷是中間序列可能會因為機器重啟和內(nèi)存斷電而中斷,但這對業(yè)務(wù)來說并不重要。
核心邏輯代碼實現(xiàn):
public class ShortUrlGenerator {/** * 內(nèi)存緩存的最大值 */private int maxId = 0;/** * 步長,每次DB獲取的長度 */private int delta = 10;/** * 生成后DB的長短鏈接映射 */private Map<String, String> dbMap = new HashMap<>();public static void main(String[] args) {ShortUrlGenerator shortUrlGenerator = new ShortUrlGenerator();for (int i = 0; i < 10000; i++) {String s = "http://longLinkDomain/" + i;String shortUrl = shortUrlGenerator.generate(s);System.out.println("生成短鏈接:" + shortUrl + ", 獲取到原始鏈接為:" + shortUrlGenerator.get(shortUrl));}}// 301重定向長鏈接private String get(String shortUrl) {return dbMap.get(shortUrl);}private static final String DOMAIN = "http://micro/";private Table table = new Table();public String generate(String str) {if (maxId % delta == 0) {// 重啟,或則內(nèi)存的id區(qū)間消耗完了,請求DB獲取區(qū)間maxId = table.auto();}int id = maxId --;// 0,9, a,z A,Z// 轉(zhuǎn)換為62進制的4位短鏈接String s = parseInteger2Char(id, 62, (o) -> {if (o <= 9) return (char) ('0' + o);if (o >= 10 && o < 36) return (char) ('a' + (o - 10));return (char) ('A' + (o - 36));});String ret = DOMAIN + s;dbMap.put(ret, str);return ret;}/** * * @param id 需要轉(zhuǎn)換的id自增 * @param hex 轉(zhuǎn)換的進制,我這里是用62 * @param mapperFunction 對應(yīng)的進制需要用一個數(shù)字映射字符的邏輯,回調(diào)函數(shù) * @return */private String parseInteger2Char(Integer id, int hex, Function<Integer, Character> mapperFunction) {/* 進制轉(zhuǎn)換 */Stack<Integer> stack = new Stack<>();while (true) {int n = id % hex;stack.push(n);id /= hex;if (id < hex) {stack.push(id);break;}}/* 短鏈接字符映射 */StringBuffer sb = new StringBuffer();while (! stack.isEmpty()) {sb.append(mapperFunction.apply(stack.pop()));}return sb.toString();}}/** * 模擬DB自增獲取操作 */class Table {// 原子類,避免并發(fā)問題private AtomicInteger id = new AtomicInteger(0);// 此處統(tǒng)計DB請求次數(shù)int count = 0;public Integer auto() {count ++;System.out.println("DB請求次數(shù) : " + count);return id.getAndAdd(1000);}}
總結(jié)
網(wǎng)上還有一個生成隨機數(shù)的問題,當(dāng)然也用到了hash沖突短鏈接服務(wù),所以我個人認(rèn)為使用DB的自增算法相對復(fù)雜可靠,批量緩存間隔為一個很好的。思想,另一方面,商業(yè)方面的考慮也很重要。例如,從如何避免數(shù)據(jù)量的增加來看,預(yù)計設(shè)計復(fù)雜的哈希沖突解決方案可能會導(dǎo)致更簡單的沖突概率。
以上就是關(guān)于《社群營銷短鏈接服務(wù)設(shè)計》的全部內(nèi)容了,感興趣的話可以點擊右側(cè)直接使用哦!》》在線短鏈接生成器