用Django做一个短域名服务,需要注意什么 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wenbinwu
V2EX    Django

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

  •  
  •   wenbinwu 2012-12-30 01:14:24 +08:00 6235 次点击
    这是一个创建于 4671 天前的主题,其的信息可能已经有所发展或是发生改变。
    想用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     Solana     4305 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 10:13 PVG 18:13 LAX 03:13 JFK 06:13
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86