>  기사  >  백엔드 개발  >  단축 URL 생성 변환

단축 URL 생성 변환

巴扎黑
巴扎黑원래의
2016-12-09 14:43:421265검색

주요 논리:

1, 대문자, 소문자 및 데이터를 포함하는 문자열 LS를 결정하고 길이는 L = 26+26+10 = 62

2, L*을 초기화합니다. * N개의 정수가 순서대로 redis에 푸시됩니다.

3. 긴 URL을 변환해야 하는 경우 위의 순서 I

4에서 정수 I가 무작위로 튀어나옵니다. 정수 I는 모듈로(제수는 L)를 취하고 나머지는 LS의 문자에 해당합니다. 모듈로를 취한 후 L로 나누고 결과가 0이 되면 모듈로 나누기가 중지됩니다. 결과는 계속 모듈로를 취합니다.

5, 나머지 모든 문자에 해당하는 문자를 배열하여 짧은 문자열 SS를 얻습니다

6, 긴 URL의 md5 해시 값을 KEY로 사용하고, 문자열 SS를 VALUE로 사용합니다. , redis

7을 작성하고, SS 문자열을 KEY로 사용하고, 긴 URL을 VALUE로 사용하고, redis

8을 작성하고, 문자열 SS에 접두사(짧은 URL 도메인 이름)를 추가합니다. short URL 결과는

9를 반환합니다. 사용자가 짧은 URL을 사용하여 액세스하면 짧은 URL에서 SS 문자열을 꺼내어 KEY로 사용하여 redis에서 긴 URL을 꺼내고 긴 URL로 이동합니다. URL

참고 :

redis의 일련 번호가 거의 다 사용되면 시간이 지남에 따라 늘려야 합니다. (언제든지 모니터링할 스크립트를 작성할 수 있으며 번호는 자동으로 10% 미만일 경우 증가) 사용한 번호는 저장하지 마세요. 🎜>

#encoding=utf-8
import string
import redis
import hashlib
LETTERS = string.digits + string.ascii_letters
LETTERS_NUM = len(LETTERS)
COUNTER_KEY = 'url:counter'
def init(rd,num):
    for i in xrange(LETTERS_NUM * num):
        rd.sadd('url:id:set',i)
#通过urlid取得短url对应的字符串
def get_url(urlid):
        result = []
        q = urlid/LETTERS_NUM
        r = urlid%LETTERS_NUM
        result.append(LETTERS[r])
        while q:
            r = q%LETTERS_NUM
            q = q/LETTERS_NUM
            result = [LETTERS[r]] + result
        return ''.join(result)
#得到短url字符串
def parse_url(rd, longurl):
    ret = longurl
    if (longurl.startswith("http://") or longurl.startswith("https://")) and len(longurl)>7: 
        m = hashlib.md5()
        m.update(longurl)
        urlkey = m.digest()
        old_param = rd.get(urlkey)
        if old_param:                 
            ret = old_param
        else:
            urlid = int(rd.spop('url:id:set'))
            param = get_url(urlid)
            rd.incr(COUNTER_KEY, 1)
            rd.set(param,longurl)
            rd.set(urlkey,param)
            ret = param    
    print "short url:",ret
    return ret
if __name__ == "__main__":
    url = "http://www.google.com/"
    rd = redis.Redis('127.0.0.1',6379,db=0)
    init(rd,3)
    parse_url(rd,url)
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.