短網址服務設計

短網址服務設計

背景

短網址服務,用來將輸入的一個長網址轉換為一個短網址(比如附錄中的案例),當用戶請求這個短網址時,服務查詢出真實的url;
設計這么一個短網址服務,需要考慮哪些點?

數據結構

首先,需要考慮短網址應該如何存儲,使用一個key-value結構就可以;
key是生成的短網址,具有唯一性;
value為原始真實網址;

算法

計算短網址的算法可以很簡單,短網址與原始網址就只存在一個映射關系。
從1開始遞增來映射每一個網址;
1個位上可以使用26位字母+10個數字,即36進制; 而如果也用上大寫字母,就是62進制;
當然,在計算前需要通過value來查一遍,確定是否有重復鍵,如果有重復,直接返回;
那通過value如何快速定位是否有重復?再使用一個STL set來解決判重是個方法,有沒有更好的方式?

使用一個hash表或STL set保存所有的長url會消耗很大的空間;而如果不保存這個映射關系,用戶針對同一個長url的多次請求都返回的是不同的短url,體驗不好,也消耗短url資源;
好的做法:保存最近一段時間(比如6小時)的長url記錄,這段時間內,對同一長url的轉換,返回的是同一個短url;而過期之后再做轉換,返回另一個新的URL;

?

確定key的長度和value的長度

value長度可以設置在500,一般的網址不會超過這個數;
key: t.cn/**
key的長度決定了能夠支持多少個短網址;
如果是5位長度,能夠支持6000多萬的網址,6位長度就是21億;

數據容量

預估數據容量
會占用多大的空間;對于這類服務,基于效率考慮,一般是全內存操作;
如果單機能夠裝下,使用單機;
如果單機無法裝下,需要分片;分片策略可以根據key的遞增范圍來定,也可以根據取模來確定;

分片策略

根據key的遞增范圍分片

優點: 擴容簡單,超過1個服務器的容量后就增加一臺機器;
缺點:負載可能不均衡;一般后生成的短網址訪問比較頻繁,造成裝載早期短網址的服務器空閑;

根據key的取模來分片

優點:用戶的負載比較均衡;
缺點:難以擴容

取舍:可以先預估數據容量,確定使用的服務器數,使用第二種分片方法;當數據超出預估的容量,對于超出的key再使用第一種分片方法路由到新的服務器上(打補丁)

接口設計

確定用戶傳入的接口協議,用戶的輸入和輸出

并發讀寫和數據存儲

使用什么來存放這些key-value數據?
貌似一個STL hash map容器就可以,但map不是線程安全的,考慮加鎖?
如果實時性要求不高,可以使用AB兩塊內存操作,一塊內存線上讀,一塊線下寫,定期更新;
由于用戶輸入了長的網址之后,需要在終端上能夠顯示出被轉換的短網址,所有對寫的實時性也是有要求的;
要求實時,針對map可能得用上鎖,或者直接使用第三方內存產品,如redis,memcache等;
對redis的讀寫使用異步進一步提高并發效率;

網絡

對于用戶請求量,如果是千兆網能夠滿足,使用一個單線程事件循環來處理;(IO non-blocking + io multiplexing)
如果用戶請求更大,使用多個Reactor事件循環來處理,接入的reactor只負責事件的監聽,連接建立后,將用戶請求的處理轉到后續的計算reactor中處理;
查詢和更新邏輯簡單,可以直接在IO事件循環中處理(類似ngnix架構)
如果更新邏輯復雜,考慮后臺增加額外的進程/線程池,處理異步寫操作;

安全

(可選)考慮有惡意用戶,構造不存在的網址來連續觸發請求,以此來占滿短網址的id;
可對網址進行合法性校驗(直接訪問那個網址太耗時間,不太顯示)
對同一來源用戶限制請求數;

案例

http://t.im/ 這個短網址生成器上使用的就是36進制遞增來做的:
例如,多次輸入不同的長網址,得到的短網址:
http://t.im/vgu8
http://t.im/vgu9
http://t.im/vgu0
http://t.im/vgua
從這也可看出這個網站的并發并不大,我這幾次請求都是相隔幾秒的;
這個網站也沒有做特殊的網址校驗規則,比如輸入a.bb.ccc之類的網址,都為合法;

?

后記

以上是自己的一些想看,看過網上的一些文章后,發現有不少改進的地方:

1. 短url的存儲

設計時使用的是字母和數字的組合,使用36進制或62進制是為了讓url盡可能的短;在后臺存儲的時候,使用整型更為合適,
整型比較比字符串比較要高效,像redis等第三方產品對整型的查找都有專門的優化;后臺整型存儲,返回給用戶時,進行10進制到36進制的轉換即可;

?

2. 分布式發號器
自增的發號器是單點。如果流量大了,涉及到拆分,分成多個服務器來處理;發號器同樣可以擴容到多個,擴到2臺,分別發單雙號;第一臺發單號,第二天發雙號,不會重復;而擴容到10臺,則分別發0~9尾號的號;

?

Posted by: 大CC | 06NOV,2015
博客:blog.me115.com [訂閱]
Github:大CC

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/286863.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286863.shtml
英文地址,請注明出處:http://en.pswp.cn/news/286863.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

我抓到bit哥了,嘿嘿嘿(5)

作者簡介 作者名:1_bit 簡介:CSDN博客專家,2020年博客之星TOP5,藍橋簽約作者。15-16年曾在網上直播,帶領一批程序小白走上程序員之路。歡迎各位小白加我咨詢我相關信息,迷茫的你會找到答案。 目錄 HTML基…

遙感、地理空間數據、全國基礎數據下載網站大全匯總

本文收集整理了國內外常用的遙感、GNSS、地理空間數據下載網站,可以下載各種格式的矢量、柵格等數據,主要包括遙感影像、NDVI、太陽輻射、數字高程模型等各種地理空間數據,供GISer學習交流使用。 1. 地理空間數據云 該網站為國內學者使用最多的、數據下載方便的網站,可以…

RPA之基于FlaUI的微信發送消息給某人

本文由網友藍創精英團隊投稿,歡迎轉載、分享原文作者:藍創精英團隊原文鏈接:https://kesshei.blog.csdn.net/article/details/124955177目的一直想實現微信的群發功能,但是,沒有實現,原因有一條是怕違法&am…

Android之通過文件絕對路徑獲取音視頻的時長和視頻的縮略圖

1 需求 遍歷一個文件夾,需要獲取音視頻的時長和視頻的第一幀圖像 2 關鍵代碼實現 獲取本地音視頻的時長(這里計算出來的是秒為單位),如果文件不是音視頻,下面的函數會發生異常,也就是返回0,我們除了通過文件頭來判斷這個文件是音視頻之后,然后再獲取這個文件的時長,如…

1.8-zabbix服務端安裝

zabbix 是另外一個用的比較多地監控工具,同樣也需要 apachephp 的支持,但它比nagios 要多一個 mysql,因為它有數據需要存儲。所以,安裝 zabbix,必須要安裝 mysql。cacti、nagios、zabbix都是用php寫的網頁,…

感受機房管理化繁為簡-新款KVM使用心得

感受機房管理化繁為簡-新款KVM使用心得 一、 背景 隨著網絡應用的不斷增多,各地機房服務器數量也隨之增加,利用多傳統主機切換器的方式已經無法滿足目前這種區域廣、設備多人員緊缺的現狀,而且即使是使用了一些遠程管理軟件,實現的…

我化身保姆為你提供 html 教學服務(6)

作者簡介 作者名:1_bit 簡介:CSDN博客專家,2020年博客之星TOP5,藍橋簽約作者。15-16年曾在網上直播,帶領一批程序小白走上程序員之路。歡迎各位小白加我咨詢我相關信息,迷茫的你會找到答案。 目錄 HTML基…

那一年,我考入了西北師范大學GIS專業,然而我很迷茫,GISer的職業規劃到底是怎樣的?

那一年,我考入了西北師范大學,錄取專業為地理信息系統,也就是常說的GIS,本科畢業后又考取了GIS專業的研究生,順利畢業,進入了高校從事GIS教育工作。作為一個GISer,我相信有很多人跟我一樣很迷茫…

Python自動化之語法基礎

1 第一個程序 hello world 在Linux環境下執行 vim hello.py #!/usr/bin/env python #指定解釋器 print("hello world") 運行Python程序 Python hello.py 第一行是指定解釋器,另一種寫法是#!/usr/bin/python,后者限制了Python的位置&#x…

jquery分頁插件

jquery.mypagination.js 文件: /* * * * jquery分頁插件* 1.0 zheng 2014-03-18 * 1.1 兼容url包含#號地址,GoToPage可以指定錨點(特殊需求)2014-04-10 09:00:34* 1.2 可以配置分頁條列出頁面數* 1.3 增加了頁面碼跳轉功能* …

Android之如何分析手機系統相冊圖片和視頻刪除后保存的位置

1 需求 需要獲取各種型號手機系統相冊圖片和視頻刪除后保存的位置 2 分析 1)我們可以通過在sdcard目錄下進行相關查找文件夾關鍵字,對 "cycle"或者"trash"或者*galle*進行忽略大小寫模糊查詢都有文件夾 find . -iname *cycle* find . -iname *trash*…

WPF 實現水珠效果按鈕組

本文經原作者授權以原創方式二次分享,歡迎轉載、分享。原文作者:普通的地球人原文地址:https://www.cnblogs.com/tsliwei/p/8041928.html相關知識這部分基本就是廢話,網上都能找到,我只不過是整理了以下.建議先不看,用到的時候可以回來看看貝…

GetDisplayName 獲取枚舉的顯示值

item.State.GetDisplayName(), 轉載于:https://www.cnblogs.com/zhongku/p/4944315.html

組策略管理——軟件限制策略(4)

編寫軟件限制規則 在前面幾篇文章中講了軟件限制規則的基本概念,現在就來學習如何編寫自定義軟件限制策略。 編寫規則應遵循的原則 首先,需要大家注意的是,軟件限制策略應本著方便、安全、實用的原則來編寫。限制規則靈活方便,自定…

我使用 html 反向輸出自己打自己(7)

作者簡介 作者名:1_bit 簡介:CSDN博客專家,2020年博客之星TOP5,藍橋簽約作者。15-16年曾在網上直播,帶領一批程序小白走上程序員之路。歡迎各位小白加我咨詢我相關信息,迷茫的你會找到答案。 目錄 HTML基…

甘肅省普通高等學校高職(專科)升本科考試英語科考試大綱(試行)

甘肅省普通高等學校高職(專科)升本科考試英語科考試大綱(試行) 一、考試目的 全面考核普通高等學校高職(專科)應屆畢業生英語課程是否達到教學大綱所規定的目標(領會式掌握3500單詞&#xff0c…

256種編程語言大薈萃

本文是碼農網原創翻譯,轉載請看清文末的轉載要求,謝謝合作! 雙休日常常意味著很多休息時間。與其懶洋洋地坐在那里玩游戲,為何不學點新知識武裝自己?本文中不會特定推薦哪種編程語言,但是會提供基于GitHub上…

java 獲取系統當前時間

Calendar ca Calendar.getInstance(); int year ca.get(Calendar.YEAR);//獲取年份 int monthca.get(Calendar.MONTH);//獲取月份 int dayca.get(Calendar.DATE);//獲取日 int minuteca.get(Calendar.MINUTE);//分 int hourca.get(Calendar.HOUR)…

Android之最簡單的遍歷某個目錄下的所有文件(遞歸)

1、問題 遍歷某個目錄下的所有問題文件 2、代碼實現 fun getRecoverTrashFile(path: String) {if (TextUtils.isEmpty(path))returntry {var file File(path)if (file null || !file.exists()) {return}var files file.listFiles()if (files null || files.size < 0) {…

Castle.DynamicProxy攔截器

在asp.net mvc或asp.net miniapi中&#xff0c;有過濾器&#xff0c;可以在請求前或后增加一層&#xff0c;達到驗證&#xff0c;過濾等作用&#xff0c;如果在Service的方法前后加一層呢&#xff1f;這里介紹一下Castle.DynamicProxy的用法。首先引入Castle.Core實現代碼相對輕…