Main logic:
1, determine a string LS including uppercase and lowercase letters and data, with a length of L = 26+26+10 = 62
2, initialize L**N integers, and push them as a sequence In redis
3, when you need to convert a long URL, first randomly pop out an integer I
4 from the above sequence, take the modulo of the integer I (the divisor is L), the remainder corresponds to a letter of LS, take After the modulus is completed, divide by L and round. When the result is equal to 0, stop modulo division, otherwise the result will continue to be modulo.
5, arrange the letters corresponding to all remainders in order to get a short string SS
6, use the md5 hash value of the long URL as KEY, use the string SS as VALUE, write it into redis
7, String SS as KEY, long URL as VALUE, write to redis
8, add prefix (short URL domain name) to string SS, return as short URL result
9, when the user uses short URL to access, will Take out the string SS in the short URL and use it as KEY to take out the long URL from redis and jump to the long URL
Note:
When the sequence numbers in redis are almost used up, increase them in time (you can write a script to monitor at any time, The quantity will be automatically increased when the quantity is less than 10%), do not save numbers that have been used
#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)