短URL生成转换

主要逻辑:

1, 确定一个包括大小写字母、数据的字符串LS,长度为 L = 26+26+10 = 62

2, 初始化L**N个整数,并作为一个序列push到redis里

3, 当需要转换一个长URL时,先从以上的序列中随机pop出一个整数I

4, 对整数I取模(除数为L),余数对应到LS的一个字母,取完模后再除以L取整,当结果等于0时停止除模,否则结果继续取模。

5, 将所有余数对应的字母按顺序排列得到一个简短的字符串SS

6, 将长URL的md5哈希值作为KEY,将字符串SS作为VALUE,写入redis

7, 将字符串SS作为KEY, 将长URL作为VALUE,写入redis

8, 将前缀(短url域名)加上字符串SS,作为短URL结果返回

9, 当用户使用短url访问时,将短URL中的字符串SS取出,并作为KEY从redis中取出长URL,跳转长URL

注意:

当redis中序列数字快使用完时,要及时增加(可以写个脚本随时监控,数量少于10%时就自动增加数量),切忌不能存已经用过的数字

#encoding=utf-8import stringimport redisimport hashlibLETTERS = string.digits + string.ascii_lettersLETTERS_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 retif __name__ == "__main__":    url = "http://www.google.com/"    rd = redis.Redis('127.0.0.1',6379,db=0)    init(rd,3)    parse_url(rd,url)

登录后复制

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2281577.html

(0)
上一篇 2025年2月27日 18:45:10
下一篇 2025年2月25日 19:50:06

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • python greenlet 实现机制

    最近使用python开发web程序,一直使用的是fastcgi模式.然后每个进程中启动多个线程来进行请求处理.这里有一个问题就是需要保证每个请求响应时间都要特别短,不然只要多请求几次慢的就会让服务器拒绝服务,因为没有线程能够响应请求了.平时…

    编程技术 2025年2月27日
    200
  • 详解python的数字类型变量与其方法

    前言 python数据类型是不允许改变的,这就意味着如果改变 Number 数据类型的值,将重新分配内存空间。下面话不多说,来看看详细的介绍吧。 以下实例在变量赋值时 Number 对象将被创建: var1 = 1var2 = 10 登录后…

    编程技术 2025年2月27日
    200
  • python_bisect模块的使用

    这个模块只有几个函数, 一旦决定使用二分搜索时,立马要想到使用这个模块  import bisect    L = [1,3,3,6,8,12,15]  x = 3    x_insert_point = bisect.bisect_lef…

    编程技术 2025年2月27日
    200
  • python数组查找算法bisect二分查找插入

    1 实例 这个模块只有几个函数, 一旦决定使用二分搜索时,立马要想到使用这个模块  import bisect    L = [1,3,3,6,8,12,15]  x = 3    x_insert_point = bisect.bisec…

    编程技术 2025年2月27日
    200
  • Python 二分查找与 bisect 模块

    python 的列表(list)内部实现是一个数组,也就是一个线性表。在列表中查找元素可以使用 list.index() 方法,其时间复杂度为o(n)。对于大数据量,则可以用二分查找进行优化。二分查找要求对象必须有序,其基本原理如下: 1.…

    编程技术 2025年2月27日
    200
  • Python pass详细介绍及实例代码

    python pass的用法: 空语句 do nothing 保证格式完整 保证语义完整 以if语句为例,在c或c++/Java中: 立即学习“Python免费学习笔记(深入)”; if(true);  //do nothingelse{ …

    编程技术 2025年2月27日
    200
  • python与编码

    Python中的文字对象 python 3.x中处理文字的对象有str, bytes, bytearray。 bytes和bytearray可以使用除了用作格式化的方法(format, format_map)以及几个特殊的基于Unicode…

    编程技术 2025年2月27日
    200
  • python实现文件夹同步

    定义syndirtool类,用于同步两个文件夹的内容,从/usr/local/a文件夹到/usr/local/b文件夹,执行方法: Python代码   python SynDirTool.py /usr/local/a  /usr/loc…

    编程技术 2025年2月27日
    200
  • sirius的python学习笔记(1)

    1、可以通过try…except语句来简单的判断字符串是否为整数值,如例程 x = raw_input(‘>’) try:     PRint int(x) except ValueError: 立…

    编程技术 2025年2月27日
    200
  • 怒学Python——第二篇——类型与运算

    python支持5种数据类型,包括数字(numbers)、字符串(string)、列表(list)、元组(tuple)和字典(dictionary)。作为一门动态类型语言,不用去声明一个标示符的类型,使用的时候是什么类型会自动判定。 对于定…

    编程技术 2025年2月27日
    200

发表回复

登录后才能评论