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

2012-12-30 01:14:24 +08:00
 wenbinwu
想用Django做一个短域名服务,需要注意些什么呢?(如果一开始就考虑到百万条短域名)

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

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

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

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

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

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

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

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



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

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

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

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

当然,个人觉得 @multiple1902 提供的答案很赞,提前考虑,后期会比较省事;不过不建议费太多时间在上面,除非你的目的是为了练手而不是产品自身。
wenbinwu
2013-01-03 00:01:18 +08:00
@shiny @multiple1902 谢谢两位的答案。如@shiny 所说,我目的不在产品本身,不会做实际服务的:)
HowardMei
2013-01-03 10:39:59 +08:00
@shiny 这个安全扫描很有意思,是用在线安全软件的API,还是服务器端恶意网址数据库呢?
shiny
2013-01-03 11:02:53 +08:00
@HowardMei 恶意网址有个特点:打一枪就跑,很多甚至用免费试用主机的三级域名来干,或者是免费域名,几天就失效。如果自己维护恶意网址库,费力且没用。
目前的安全机制是:
- 黑名单屏蔽。
- 在这么多安全软件里,就金山会用最快的速度来屏蔽。一开始三天两头要投诉(好在人工响应速度很快),后来以最高优先级查金山的API后基本没这问题了。
- CROND每天扫描新加+热门网址(查询其他安全服务商)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/56191

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX