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 以及一大把特殊符号都是可以出现的,但考虑到短网址也要方便用户用键盘输入,所以建议只使用字母和数字,字母区分大小写。 链接总有热的和冷的。当服务的规模扩大,缓存和分片就会成为你要考虑的问题。这既可以在数据库本身的层面上处理,也可以在网站程序上处理。 |
2
leecade 2012-12-30 02:18:07 +08:00 via iPhone 1
楼上知乎水平啊
|
3
LazyZhu 2012-12-30 10:35:40 +08:00 2
|
4
Candyhorse 2012-12-30 13:03:35 +08:00 via iPhone
|
5
wenbinwu OP |
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 |
7
LazyZhu 2012-12-30 19:16:45 +08:00
|
8
Js 2012-12-30 19:19:20 +08:00
强推kyototycoon
|
9
shiny 2012-12-30 19:43:09 +08:00
@LazyZhu 感谢推荐。
目前个人倾向于采用 Tornado + MongoDB(python 下的驱动有 bitly 异步的封装 asyncmongo),临时热点数据还是用 redis 顶。 异步对于短网址性能提升很明显(好像bitly用的也是Tornado + MongoDB方案)。 |
10
Candyhorse 2012-12-31 15:45:14 +08:00
|
11
lookhi 2012-12-31 16:13:37 +08:00
楼上都没提到重点。
if 非公开应用: 楼上的都对 elif 公开 and 客户海外: 楼上的都对 else: 河蟹+楼上的 |
12
wenbinwu OP @shiny ‘到一定程度后扛不住了,换了redis后立竿见影。’请问redis在你的网站中作用除了记录访问次数、访问IP、来路外,还用来做什么? 谢谢
|
13
v2ex_user001 2013-01-02 18:26:19 +08:00 via iPad
补充一点:你自己的域名不要太长〜
|
14
shiny 2013-01-02 18:30:46 +08:00
@wenbinwu 还有是扫描队列(用户提交的恶意网址会导致杀毒软件直接屏蔽短网址,一定条件下会触发扫描,也配合了redis的使用)
其他就没了,主要是各类统计数据。 不到一定量无需考虑优化,等到有问题再解决也不迟,最重要的是最快速度出早期产品,由用户行为来决定开发的方向。 当然,个人觉得 @multiple1902 提供的答案很赞,提前考虑,后期会比较省事;不过不建议费太多时间在上面,除非你的目的是为了练手而不是产品自身。 |
15
wenbinwu OP |