V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wenbinwu
V2EX  ›  Django

用Django做一个短域名服务,需要注意什么

  •  
  •   wenbinwu · 2012-12-30 01:14:24 +08:00 · 5852 次点击
    这是一个创建于 4341 天前的主题,其中的信息可能已经有所发展或是发生改变。
    想用Django做一个短域名服务,需要注意些什么呢?(如果一开始就考虑到百万条短域名)

    models上如何定义?
    短域名如何选取 (myshorturl.com/xxx, xxx的取名策略?)
    17 条回复    1970-01-01 08:00:00 +08:00
    multiple1902
        1
    multiple1902  
       2012-12-30 01:50:36 +08:00   ❤️ 6
    短域名(短网址)服务,优化的关键点就是「快」。从这个角度说,使用 Django 这样的「重」框架可能不是最好的选择。

    短网址的模型相对简单,非常接近一个 K-V 的存储,因此你可以考虑 NoSQL 的 K-V 数据库。具体来说,你必须存储的信息包括缩短后的网址本身,以及对应的原网址。你可能还会想要存储这条短网址的点击次数、添加日期、过期日期。但是,在用户点击一条短网址、你的网站给出转向的过程中,添加日期这些字段并不会被用到。所以这些字段(元信息)也可以放在另一个表里面。

    从性能优化角度分析,「缩短后的网址」在数据库里应该以主键的形式出现,至少也应当做索引。但是,以字符串作为主键的性能可能不如以自增的整数来得高。想一想,是不是可以设计一个「字符串」(例如 SxAm6)到 auto increment 字段(如 123456)的双射函数?

    短网址关键字如何选取?首先要看什么样的字符可以出现在 URL 里面。0-9a-zA-Z 以及一大把特殊符号都是可以出现的,但考虑到短网址也要方便用户用键盘输入,所以建议只使用字母和数字,字母区分大小写。

    链接总有热的和冷的。当服务的规模扩大,缓存和分片就会成为你要考虑的问题。这既可以在数据库本身的层面上处理,也可以在网站程序上处理。
    leecade
        2
    leecade  
       2012-12-30 02:18:07 +08:00 via iPhone   ❤️ 1
    楼上知乎水平啊
    LazyZhu
        3
    LazyZhu  
       2012-12-30 10:35:40 +08:00   ❤️ 2
    A hint: https://github.com/AlexChittock/SimpleShortener

    可能没有比这更「快」的了
    Candyhorse
        4
    Candyhorse  
       2012-12-30 13:03:35 +08:00 via iPhone
    我几个月前写的一个demo

    http://codinglabs.sinaapp.com/shorturl/
    wenbinwu
        5
    wenbinwu  
    OP
       2012-12-30 18:31:02 +08:00
    @LazyZhu 呵呵,这个方法够给力
    @Candyhorse 我也有写过,但是想往深处写写,比如记录短链接的hit count,有什么好方法
    shiny
        6
    shiny  
       2012-12-30 18:40:34 +08:00   ❤️ 1
    几个月来不断迭代修改开发的作品 955.cc 。当前基于php+redis+mysql,计划迁移到Tornado+Redis+MongoDB。

    目前有23万条网址。本来是纯php+MySQL的代码,到一定程度后扛不住了,换了redis后立竿见影。
    记录访问次数、访问IP、来路,用Redis的过期策略刚刚好(要历史数据就不够了)。



    另外bitly也开源了一部分组件: https://github.com/bitly
    LazyZhu
        7
    LazyZhu  
       2012-12-30 19:16:45 +08:00
    @shiny 试试“七夜”改的 https://github.com/qiye/redis-storage
    redis-storage 给 redis 增加了 leveldb 服务端的功能
    Js
        8
    Js  
       2012-12-30 19:19:20 +08:00
    强推kyototycoon
    shiny
        9
    shiny  
       2012-12-30 19:43:09 +08:00
    @LazyZhu 感谢推荐。

    目前个人倾向于采用 Tornado + MongoDB(python 下的驱动有 bitly 异步的封装 asyncmongo),临时热点数据还是用 redis 顶。

    异步对于短网址性能提升很明显(好像bitly用的也是Tornado + MongoDB方案)。
    Candyhorse
        10
    Candyhorse  
       2012-12-31 15:45:14 +08:00
    @wenbinwu

    我就是在挑战之前,让 KVDB 中的相应项自增 ~
    lookhi
        11
    lookhi  
       2012-12-31 16:13:37 +08:00
    楼上都没提到重点。
    if 非公开应用:
    楼上的都对
    elif 公开 and 客户海外:
    楼上的都对
    else:
    河蟹+楼上的
    wenbinwu
        12
    wenbinwu  
    OP
       2013-01-02 17:39:18 +08:00
    @shiny ‘到一定程度后扛不住了,换了redis后立竿见影。’请问redis在你的网站中作用除了记录访问次数、访问IP、来路外,还用来做什么? 谢谢
    v2ex_user001
        13
    v2ex_user001  
       2013-01-02 18:26:19 +08:00 via iPad
    补充一点:你自己的域名不要太长〜
    shiny
        14
    shiny  
       2013-01-02 18:30:46 +08:00
    @wenbinwu 还有是扫描队列(用户提交的恶意网址会导致杀毒软件直接屏蔽短网址,一定条件下会触发扫描,也配合了redis的使用)
    其他就没了,主要是各类统计数据。
    不到一定量无需考虑优化,等到有问题再解决也不迟,最重要的是最快速度出早期产品,由用户行为来决定开发的方向。

    当然,个人觉得 @multiple1902 提供的答案很赞,提前考虑,后期会比较省事;不过不建议费太多时间在上面,除非你的目的是为了练手而不是产品自身。
    wenbinwu
        15
    wenbinwu  
    OP
       2013-01-03 00:01:18 +08:00
    @shiny @multiple1902 谢谢两位的答案。如@shiny 所说,我目的不在产品本身,不会做实际服务的:)
    HowardMei
        16
    HowardMei  
       2013-01-03 10:39:59 +08:00
    @shiny 这个安全扫描很有意思,是用在线安全软件的API,还是服务器端恶意网址数据库呢?
    shiny
        17
    shiny  
       2013-01-03 11:02:53 +08:00   ❤️ 1
    @HowardMei 恶意网址有个特点:打一枪就跑,很多甚至用免费试用主机的三级域名来干,或者是免费域名,几天就失效。如果自己维护恶意网址库,费力且没用。
    目前的安全机制是:
    - 黑名单屏蔽。
    - 在这么多安全软件里,就金山会用最快的速度来屏蔽。一开始三天两头要投诉(好在人工响应速度很快),后来以最高优先级查金山的API后基本没这问题了。
    - CROND每天扫描新加+热门网址(查询其他安全服务商)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3030 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 14:36 · PVG 22:36 · LAX 06:36 · JFK 09:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.