SuperCache:一个Rails缓存小组件

前言

SuperCache最早由我在负责糗事百科开发工作时,所使用的缓存手段发展而来。当时糗事百科使用了页面整个静态缓存,而页面上诸如登录信息、每个文章的分数评论等,由Ajax载入,这样可以最大化缓存的效率。
但在扩展到两台应用服务器之后,caches_pagecaches_action就显得比较局限了。于是我将页面缓存放入了Memcached,由Nginx直接根据页面地址为key在memcached中查找,如果没有对应缓存才访问Rails层。经过一系列优化,最后变成了现在的SuperCache。现在“暴走漫画”也用的是这套方式。

为什么不用caches_action

caches_action可以指定路径,通过:store_options参数也可以指定rawtrue(默认情况下会序列化,nginx无法读取)以及失效时间,然而caches_action使用了fragment的存储方式,会始终在key前面加上views/,这就使得nginx在处理上变得麻烦。导致caches_action必须走Rails层,导致效率变低。

为什么不用caches_page

caches_page是将页面内容存到磁盘上作为静态文件,这样可以直接通过nginx或者Apache等服务器进行存取,不通过Rails进程,可以极大提高速度。但是caches_page并不支持将页面存入诸如memcache,这样就把caches_pages的应用局限于一台服务器上,要求nginx和rails都在一台服务器上。而且缓存很难共享或者是进行清理。当然也许可以通过nfs或者fuse挂载memcache等方式实现,但这些的增加了部署的复杂度,同时也不知性能如何。

为什么不用rack-cache

rack-cache是符合HTTP标准的透明反向代理,其失效和过期都要使用HTTP头来操作,无法使用Sweeper来清理缓存。和rack-cache作用类似的有Squid和Varnish,但是本人并不了解他们的配置,所以

所以SuperCache的目的就是解决这些问题:可以在多服务器的环境下运作,可以直接由前端的反向代理直接读取缓存而不用经过rails进程。并且可以像Rails原有操作缓存一样进行清理。

使用方法

安装

Gemfile中加入以下

然后命令行下更新:

使用

caches_actioncaches_page一样在Controller中指定所需缓存的页面:

super_caches_page可以有以下参数:

  • cache_path 指定缓存的key,默认是请求的路径
  • expires_in 控制了失效的时间

nginx配置

如果要发挥SuperCache的能力,那必须还得通过nginx的配置:

这样,如果nginx后端有多台Rails服务器,也可以使用静态页面缓存了。

其他好东西

除了上述的简单功能之外,我还正在筹划以下功能:

Dog-Pile Effect

所谓Dog-Pile Effect是指当某个缓存失效的时候,同时有大量请求发现没有缓存,进而请求后端的应用服务要求建立缓存,从而导致服务器卡顿甚至系统宕机的现象。

事实上很多场景下,当缓存失效的时候,只需要其中一个请求去建立新缓存,而其他请求可以使用过期的缓存继续服务。在SuperCache中,我使用Memcache来建立一个锁机制:当缓存失效的时候,只有获得锁的请求可以向后端发送请求并建立新缓存,其他未能获得锁的请求,直接缓存过期的版本。
这样就可以使缓存失效时,系统负载不会突然提升而能平稳过渡。

当然还有一些别的方式来处理这种现象,比如可以在请求之后直接更新缓存(类似Write through机制),而不是等缓存失效之后再处理,但我认为这种方式比较复杂。

目前暴走漫画使用了SuperCache的这种机制之后大大提高了响应并发的能力。

Cache Meta Info

手工处理缓存的清理非常复杂,在SuperCache将来的版本中,我会加入对缓存依赖对象的跟踪,也就是记录和ActiveRecord相关的cache key,当记录发生变更的时候,只需遍历删除对象所影响的Cache key,就可以一次搞定所有问题。

暴走漫画网站已经应用了这套逻辑,相关代码已经提交在了cache_meta_info分支中。


将来我会不断完善SuperCache这个小组件,希望朋友么多多支持,不吝赐教。

哈佛「公平」的公开课听课随感(1)

最近有空,又接着看了《哈佛大学公开课:公正-该如何做是好?》。我认为这个公开课非常好,它的介绍上是这样说的“旨在引导观众一起评判性思考关于公正、平等、民主与公民权利的一些基本问题。每周,超过1000位学生来听哈佛教授兼作家迈克尔桑德尔的课,以拓展他们对于政治与道德哲学的认知理解,探究固有观念是与非。”
与过去我在中学、大学所接收的填鸭式的教学完全不同,教授是跟学生一起进行探讨,他并非直接告诉学生,X是对的,Y是错误的,而且跟同学一起探讨,互相辩论,更重要是思辨的过程。
如果我们国家的教育,能以这样的形式,就能够开启民智,开启国家复兴的道路。

我在看完了第一第二课之后,对其中讨论的“功利主义”和“自由主义”有一些额外的想法,我想记录下来:

我认为功利主义的困境在于,大家的幸福感是不同的,是难以简单相加的;同时我认为人是会变的,某人今天吃包子很幸福,但让他吃十天包子他就不觉得幸福了。现在对于某个问题的决策,能否在将来也让人继续感觉幸福,是难以精确计算出来的。其次人往往会放大自己的感受,而对于他人的感受,则常常会忽略。这就使得在实际的社会实践操作中,仅仅遵循功利主义处理问题会非常困难。由于不可能事事都所有人来一起计算,所以一旦让某小部分有权力来进行影响大多数人的决策时,那么这部分人就往往容易倾向于根据有利于他们的判断标准来进行决策,这显然就有失公平了。我们不能假定这部分进行决策制定规则的人一定是无私的,也不能假定他们是全知的。毫无疑问的是这两点通常都不可能。
同时,部分人——比如说A——也可以为了利己的目的,欺骗另一些人——比如叫B,鼓吹A的价值更大,让认为B为A贡献、让渡资源可以得到更大的幸福等等。这在各种专制国家非常常见,在这些国家的民众的眼中,比如如果出现灾难的灾难,用100个贫民的性命来保住1个领导的性命是值得的。
所以功利主义是难以保证公平的。

而后课堂上说讲授的关于自由主义的原则,我认为它过于理想化。通过教授的讲课,我了解到自由主义的大前提之一是「每个人都是他自己的主人」。然而我认为,从自然角度来看,人并非完全是自己的主人。人的生命是父母授予的,人出生时是没有行事能力的,又由父母养育,而其又依赖于社会存活,所以我认为人并不可能完全是其自身的主人。同时,人不能脱离社会存活,同时人也不断寻求能获得他人的认可,为此,人不得不在很多事情上妥协,也丧失了自由性。
当然我个人是非常期望随着社会进步是越来越自由的,因为只有自由才能创新,才能推动社会进步。

[转]关于“抛球悖论”的一点思考

原文地址 http://techneresearcher.wordpress.com/2011/03/19/%E5%85%B3%E4%BA%8E%E2%80%9C%E6%8A%9B%E7%90%83%E6%82%96%E8%AE%BA%E2%80%9D%E7%9A%84%E4%B8%80%E7%82%B9%E6%80%9D%E8%80%83/

[注]此文是当年在吴国盛老师手下读书时写的,N年前的事情了。记得当初我写完后还直接发给吴老师看,不过倒没见他对此有什么反应。吴老师还是我的硕士论文指导老师,不知不觉很多年过去了……贴出这篇旧文,回忆下当初充满书香门第情调的那种初生牛犊般的求学感觉。

关于“抛球悖论”的一点思考

王 键

一、什么是抛球问题

在《自然本体化之误》(湖南科学技术出版社,1993年)一书关于芝诺悖论的一章中,该书的作者吴国盛教授谈到了一个与芝诺悖论相关的问题:即关于“无 限机器”(infinite machine)所产生的悖论,也被称为“超级任务”(super task)。 实际上也就是所谓的抛球悖论(问题)。

原书中的相关论述如下:“最有名的无限机器是抛球机器,它是这样设计的:一个小球从a处开始向b处抛动,令小球从a处抛到b处时花 1/2分钟,从b抛回a处花1/4分钟,依此类推,来回抛球的时间依次是:

1/2,1/4,1/8……,1/2n……

到第n次时所花全部时间是:

T=1/2+1/4……+1/2n=1-1/2n

现在要求机器在时间到达一分钟时停下来。可是问题出现了,人们发现无法确定小球最终落在何处。从上式看,当n取奇数时,落在b处,取偶数时落在a处, 可是小球越抛越快,只有在经过无限次之后才回到达一分钟,但一个无限数是没有奇偶之分的,因此,搞不清楚一分钟的时候小球处在什麽位置,也就是说,小球没 有终点,超级任务无法完成。”(参见该书第94页)

应该说,从逻辑上看这段分析是没有任何问题的。而对于这一类的问题,吴教授也表明了自己的态度:“许多人已经证明了,超级任务是不可能完成的,无限机器不存在。”(同上,第94页)

二、它的另一种表述形式

但上面这个“抛球机器”的例子有点别扭,因为它不够直观。我们很难想象一个有质量的小球可以无限加速,无穷摆动。那么很简单地,我们完全可以换个方式重新表达刚才的问题,把它转化一下:不妨暂且称其为“开关灯问题”:

假设有两盏灯,分别是a和b,现在让灯a先亮,过1/2分钟后让灯b亮,同时灯a熄灭,再过1/4分钟让灯a亮,同时灯b熄灭,依此类推,每次交换亮灯所间隔的时间依次是:

1/2,1/4,1/8……,1/2n,……

到第n次时所花全部时间的总和是:

T=1/2+1/4……+1/2n=1-1/2n

现在要考察的是:在时间刚好到达一分钟时,究竟是哪个灯在亮?是灯a还是灯b?实际上这个问题完全等价于刚才的抛球机器问题,重要的一点是:换一种不同 的表达方式可以从另一个角度使问题的实质显露的更加清楚一些。对于这个亮灯的问题,答案产生的矛盾显然是和抛球问题完全类似——在时间到达一分钟时,两个 灯不能都在亮,那么也无法最终确定到底是哪个灯在亮。

三、解释这一问题的尝试

但是,对 于那个“抛球机器”问题,悖论究竟是如何产生的呢?刚才已经说了,这段论述对问题的分析中的分析并没有逻辑上的错误。然而,它的出发点却可能是错误的—— 要产生悖论,所隐含的一个前提条件是:当时间到达一分钟时,小球只能具有一个固定的位置,要麽a,要麽b。这也就是说,如果“小球同时在a和b两个位 置”,则被认为是一种“不可能”出现的状态。而这就是所谓抛球机器悖论产生的一个基本前提。把小球换成灯泡的例子,道理也是一样的:它假定了在到1分钟 时,两个灯泡不能同时亮。由此引出悖论。问题在于,这个假定同问题的预设存在矛盾:按照题目的设计,既然到了一分钟,也就意味着次数n变成了超穷树,即 “无穷大”。那么在这个时刻,两次亮灯之间的时间差已经变成了趋零的“无穷小”。在这种情况下,两个等不能同时亮的假定已经开始失去意义。既然如此,悖论 不是自然被消解了么?

总之,这一“抛球悖论”初看起来的确有些自相矛盾,但其实却不是这个问题本身,而是这个悖论的产生:问题中出现 的小球速度无限大、违反惯性定律、加速过程如何可能等等本该颇受质疑的超经验现象都被不加怀疑地予以接受,然而当结果产生了一个超经验的现象时,它却被当 作是一个“悖论”而出现了。同样,换作灯泡的例子,两个灯泡同时亮的不可能性,却已经成为了题目预设的必然结果。而如果问题的前提本身就存在某些反常,那 麽由这些前提而产生的反常绝对不应该被当成一个“悖论”或者“反常”。

四、同芝诺悖论的区别

关于这两个悖论,我们认真思考一下就会发现它和芝诺悖论存在着一个很大的区别。当然,如果追根溯源,这几个悖论实际上在一定程度上都可以归结为数学问题。

这就仿佛同这样一个函数相类似:

f(x)=sin(1/x)

现在问此函数在0点取值是什麽?

从数学分析的观点来看,在0点, 函数值f(x)发散,且有界但并不收敛。因此从数学的观点看:问函数f(x)在0点取什么值 就是一个没有意义的问题(当然哲学家们也许并不这麽看)。

对于芝诺的悖论,关键在于一点:如果把芝诺问题化为数学函数,那麽当这个函数f(x)的变元x 趋向于某一定值时,函数值f(x)也是趋向于某一定值的(换句话说,它的数学模型是一个连续函数)。而对于无限抛球问题,将其化为数学函数后,我们会发现 此函数与芝诺悖论对应的函数完全不同:对于这个函数f(x),当变元x 趋于某一定值时,函数值f(x)将是有界的但不是收敛的(与我举的第一个函数的例子相类似)。

五、是否能得出一个结论?

我以为,出现以上悖论的实质在于赋予某些“看似矛盾”的数学结构以经验的内容。这些数学结构,也一度曾让数学家们感到困惑。但是随着数学分析基础理论的建立和奠定,它们逐渐不再被看成悖论。然而,在被赋予了某些具体经验内容之后,它们仍然是难以被理解和接受的。

如此说来,我更倾向于认为:至少可以说,从局限在数学内部的观点来看,无限抛球问题并不存在悖论。但是跳出数学的圈子、从其他的观点来看,是否也可以这麽说倒还可以存疑。

不过,我感觉提出的这个问题似乎还不够清晰——对这个问题的回答,我暂时只能保持沉默。

芝诺悖论

(来自网络)

芝诺的运动论辨全部得自亚里士多德在《物理学》中的转述,有四个:

1、二分法。物体在到达目的地之前必须先到达全程的一半,这个要求可以无限的进行下去,所以,如果它起动了,它永远到不了终点,或者,它根本起动不了。

2、阿喀琉斯(一译阿基里斯)。若慢跑者在快跑者前一段,则快跑者永远赶不上慢跑者,因为追赶者必须首先跑到被追者的出发点,而当他到达被追者的出发点,慢跑者又向前了一段,又有新的出发点在等着它,有无限个这样的出发点。(这个悖论有一个著名的故事,就是阿喀琉斯与乌龟赛跑,等乌龟先跑出一段后阿喀琉斯再起跑追赶,结果则是飞毛腿阿喀琉斯怎么也追不上乌龟。)

3、飞矢不动。任何东西占据一个与自身相等的处所时是静止的,飞着的箭在任何一个瞬间总是占据与自身相等的处所,所以也是静止的。

4、运动场。两列物体B、C相对于一列静止物体A相向运动,B越过A的数目是越过C的一半,所以一半时间等于一倍时间。

这是芝诺为了捍卫他老师巴门尼德关于“存在”不动、是一的学说,提出了著名的运动悖论和多悖论,以表明运动和多是不可能的。他的结论在常人看来当然很荒谬,但他居然给出了乍看起来颇令人信服的论证,故人们常常称这些论证构成了悖论或佯谬。不过,若细细推敲,其结论未必荒谬,其论证未必令人信服,故中性的称这些论证为芝诺论辨最为合适。

历史上对于芝诺悖论的评价和驳斥:

19、20世纪之交的绝对唯心主义者象布拉德雷全盘接受芝诺的论证和结论。他视运动、时间空间为幻象,芝诺论辩正好符合他的主张,当然全盘接受。在《现象与实在》中他写道:“时间与空间一样,已被最明显不过的证明为不是实在,而是一个矛盾的假象。”除布拉德雷之外,哲学史上大部分哲学家认为芝诺的结论是荒谬的,其论证有问题。不过,在不断检查其论证毛病的过程中,人们反倒发现了芝诺论辨的深刻之处。常常是人们自以为解决了芝诺悖论,不多久就又发现其实并没有解决。

已知最早的批评来自亚里士多德。关于二分法,他说,虽然不可能在有限的时间越过无限的点,但若把时间在结构上看成与空间完全一样,也可以无限分割,那么在无限的时间点中越过无限的空间点是可能的;关于阿喀琉斯,他说,如慢者永远领先当然无法追上,但若允许越过一个距离,那就可以追上了;关于飞矢不动,他说,这个论证的前提是时间的不连续性,若不承认这个前提,其结论也就不再成立了;关于运动场,他说,相对于运动物体与相对于静止物体的速度当然是不一样的,越过同样距离所花的时间当然也不一样。亚氏批评的意义主要在于使芝诺论辨显得更为明了,前面对诸论辨的转述就显然参照了亚里士多德的这些批评。

黑格尔对芝诺悖论的解决是:“运动的意思是说:在这个地点又不在这个地点;这就是空间和时间的连续性,——并且这才是使得运动可能的条件。”这个解决方法要点在于强调时间空间的连续性,而且对连续性赋与新的、特有的解释。不过,它似乎并没有直接针对芝诺论辨本身来提出批评,而且关于连续性的独特解释与数学和逻辑所要求的精确性不相容。受黑格尔的影响,我国哲学界一般认为芝诺不懂得连续性和间断性的辩证关系,把这两者机械的对立起来,所以造成运动悖论。这大意是说,芝诺的论证没使用辩证逻辑,因而是无效的。这种批评同样是笼而统之,不关痛痒。

进入19世纪以后,人们开始运用数学分析的方法来考证芝诺悖论。就那“阿喀琉斯与乌龟”这个悖论来说吧,现在的小学生遇到类似的追赶问题都会很容易的建立起一个方程组来算出所需要的时间,那么既然我们都算出了追赶所花的时间,我们还有什么理由说阿喀琉斯永远也追不上乌龟呢?然而问题出在这里:我们在这里有一个假定,那就是假定阿喀琉斯最终是追上了乌龟,才求出的那个时间。但是芝诺的悖论的实质在于要求我们证明为何能追上。

高等数学运用极限理论与微积分也可以得出相同的结果,而且其解答思路与悖论的表述相似,就是把一段一段跑的距离加起来,这些数列虽然有无限多项,但其总和并不是一个无穷大的数目。但是问题是,即便综合是一个有限的数,但是它却是由无限多的数(无限多的步)组成的,作为一个活生生的人,阿喀琉斯如何来实践着无限多个的步骤呢?

事实上,隐藏在这几个悖论的背后,是我们对于运动本质的思考,即何谓运动(与参照系的关系)?怎样运动(如何迈出第一步)?

希腊时代犬儒学派的创始人第奥根尼对芝诺论辨有一个回答。据说当他的学生向他请教如何反驳芝诺时,他一言不发,在房间里走来走去,学生还是不理解,他说,芝诺说运动不存在,我这不是正在证明他是错的吗?这个故事很长时间被作为一个笑话,人们大多相信,第奥根尼根本没有弄懂芝诺的意思。芝诺并不是说在现象界没有运动这么一回事,他当然承认有,但他要说的是,虽然满目是物体在飞舞,但运动是不合理的,我们可以通过逻辑证明运动是不可能的。因此,我们所看到的运动是假象,并不真实,因为真实的东西一定是合乎逻辑的。

然而我想,近年来科学家们正在研究的时空可能的量子结构也许会为芝诺悖论带来一个新的思考方向。

具体来说,在人们的传统观念中,时间和空间(也可以结合起来说成是时空)都是连续的。正如100多年前,绝大多数人和科学家认为物质是连续的。尽管自古以来一些哲学家和科学家曾经推测如果把物质分解到足够小的块,就会发现它们是由微小的原子组成,然而当时几乎没有人认为能够证实原子的存在。今天我们已经得到了单个原子的图像,也研究了组成原子的粒子。物质的粒子性已经是过时的新闻了。 在最近几十年中,物理学家和数学家想知道空间是否也由离散块组成的。它是连续的,就像我们在学校里学到的那样,还是更像一块布,由根根纤维编织而成?如果能探测到足够小的尺度,我们是否能看到空间的“原子”,它们的体积不能被分割成更小的形态?对时间来说,情况又怎样呢?自然界是连续变化的,还是世界以一系列微小的步伐来进化。

如果世界真是如此构建的话,那么时空也就变成了“一份一份”的单元,我们就能得到一个最最极限的长度,一个最最极限的面积,一个最最极限的体积(圈量子理论认为,这个长度是普朗克长度10^-33厘米,面积是普朗克长度的平方,体积则是普朗克长度的立方)。而这在原则上就否定了芝诺第一、二悖论关于时空是连续的假设。

于是再回过头看芝诺关于阿喀琉斯追赶乌龟的悖论。随着阿喀琉斯越来越接近乌龟,他们之间的距离差越来越小,但这个距离现在并不是趋于无穷小,而是有一个极限――空间量子的最短距离。因为阿喀琉斯的速度大于乌龟,于是在这一确定距离的路程上他经过的时间要比乌龟短――胜负已分,在这里阿喀琉斯终于超过了乌龟!

类似的道理,对于第一个悖论,全程的中点并不是可以无限分割的,它同样遇到了空间量子距离的限制――因此从根本上否定了这个悖论。

但是,对于第三和第四个悖论却比较难回答。前面说了,第一第二个悖论事实上就是建立在假设时空是连续的基础上来说明无论是绝对运动或是相对运动都是不可能的;而第三和第四个悖论却体现了假如时空不是连续的,运动同样是不可能的。还有,芝诺悖论它不仅涉及到运动场所(背景)本质的特性问题,如第一、三悖论;也有关于运动本身(包括运动的发生和过程)的考量,如第二、四悖论——这是芝诺悖论的另一大难题。但是随着物理学的发展,我们对于运动本性的问题可能也可以回答一部分。

先来看一个实验,乃是关于中子是如何在重力场中下落的。东西往下落,这可谓是最稀松平常的一个运动现象了,它是最最基本的运动方式之一,我们每天都能见到,实践这种运动,并且说白了,芝诺的飞矢实际上做的就是这种运动。那么,在中子下落的过程中,科学家们观察到什么有趣的事情了吗?答案很出乎人们的预料:实验过程中的中子在下落中都只出现在不连续的高度上!这说明,重力场本身是已量子化的,运动其间的物体的运动过程同样是量子化的,它就如电子跃迁只能出现在不连续的能级上的行为一样(这已被量子力学所深入考察印证)。于是,整个世界就如一部异常精细的电影,我们如胶片般一帧一帧地随着时间运动、演化。只不过一帧帧间的时间间隔不是0.04秒,而是一单位普朗克时间。帧与帧间的动作差别也是极其微小的,最小单位乃是一单位普朗克长度、面积或是体积。芝诺对于飞矢不动的现象的论断是正确的,因为一帧画面它就是静止的,但他由此导出的运动不可能的结论却是值得商量的。

也许你要问,为何到现在我还不能说芝诺是错的,仍要用“值得商量”这个词?那是因为无论前面说的时空结构是量子化的,还是运动过程是量子化的也好,这些都只解决了一个“运动过程是可能的”的问题,它只是将经典的芝诺悖论转化为“量子芝诺悖论”而已。芝诺悖论的更深的意义在于它还质疑了“运动的发生”也就是为何会动或称“第一步”的问题。就算把“飞矢”的问题量子化后,如果加进考虑“坍缩”,还会出现一个奇怪现象:假如我们一直观察系统,也就是飞矢的“每一帧”,那么因为我们的观察它的波函数必然总是在坍缩,薛定谔波函数从来就没有机会去发展和演化。这样,它必定一直停留在初始状态,看上去的效果相当于飞矢停滞了。在这个问题上我还没有什么好的思路,有一点想法就是它也许与我们的精神对于量子效应的决定作用有关:意识使得波函数坍缩——使得物质波不再随着薛定谔方程演化,而成为一个客观实在(仅限于量子的哥本哈根解释)。物质由这样诞生,反过来说要是使运动也有可能,人意识的作用大概也必不可少吧。想到这里,我不由得再次敬佩起芝诺来,他所提出的悖论是多么的深刻啊,真是值得我们好好探究再探究。

推出“热点”的意义

http://www.bling0.com/blinger/107870

最近大家看到了在“最新”“最热”外出现了个“热点”

为什么要做热点,先说一下“最热”和“最新”的存在的问题

最热的好处在于,顶上去的多半是比较“有质量”的帖子,但问题在于,24小时的跨度往往太大,一些热帖顶在前面之后,长时间不会被替换掉,几次去看,往往都是那几个帖子。

而最新的问题在于,如果刷帖太快,看到的只是最新的内容,这对于只是一天上来若干次,但又不是一直在刷新的网友来说,容易错过很多有意思的东西。但对于只是偶然进入的网友来说,可能内容又太水。

那么为了平衡这两者,很多网站都选择使用一些加入时间的算法来进行排序。
博聆这里的“热点”理念很简单,目的是为了让近期比较活跃的帖子能浮现出来。
文章的“热量”会随着时间而衰减(乘上一个系数),长期没人顶它,则会自动被淘汰出去。

我想这是比较好的做法。

另外一点,转帖不会出现在“热点”中

继续阅读“推出“热点”的意义”

分页的话,大家觉得是用偏移量好呢,还是用页码好呢?

这是我发在ruby-china上的讨论帖 http://ruby-china.org/topics/3695

假如记录数量非常巨大,有几十万甚至上百万

分页诸如/page/N这样的链接地址,好处在于(我认为),易于seo,并且有现成插件

但是我发现这种分页形式对于数据库、缓存来说并不友好

数据库方面:pagination主要使用的sql的limit [offset], rows,而limit的方式是取出offset之前的记录再抛弃掉,所以对于大页码来说性能是有损害的。

缓存方面,一般我们使用的都是从最新往后翻页,一页显示X条记录,当有新的记录出现的时候,会形成连续反应,后面的页面全都缓存失效

用户体验方面,如果出现新的记录,老的记录会被顶到后面,那么在翻页的时候,经常可以看到之前已经看到过的文章,对于用户来说很不爽。

如果使用偏移量,比如 domain.com/articles/s/N 这种形式,则可以解决以上三种问题。
如果是按id排序,那么就是 where articles.id < N limit rows

翻页过程中的用户,可以保持原来的翻页链接,并且能够使用缓存,如果有新记录,也不会影响翻页的体验。

但这样的坏处可能在于SEO上出现太多页面

有没有朋友来讨论一下

继续阅读“分页的话,大家觉得是用偏移量好呢,还是用页码好呢?”

计算机专业怎么判断自己适合考研还是工作?

问:计算机专业怎么判断自己适合考研还是工作?

大二学生,所选方向软件工程。关于这个问题,看过《IT学生解惑》、《我是一只IT小小鸟》中相关介绍。我的想法是,到了大三,如果自己感觉实力有了些,就不选择考研。考研的话,是不是理论课的内容居多呢?

答:

仅举例,我是02级东南大学软件学院的

我有同学参加了微软嵌入式大赛,并入围复赛并拿到了不错的名字,团队有4人,具体做什么的东西的我忘了。
后来借这个奖,领队去了IBM亚洲研究院实习,其他三个人都去了不错的公司,其中有一个去了微软。
领队的同学在实习之后发现,他在他感兴趣的计算机图形学方面,所欠缺的知识太多,算法功底不够,最后他就选择考研去了(北大/清华,具体忘记了)计算机系,希望未来在图形学方面有所建树。
而去了微软的同学后来转型没做开发了,经常国内国外跑。
其他两个同学在大公司做技术骨干。

再说个同宿舍好基友的,从大三开始沉迷WOW,曾挂课好几门,属于经常被辅导员叫去喝茶的。后来去了BO做测试,再后来BO被SAP买了,再后来因为沉迷WOW,跳槽去了BLZ。你问他过得怎样?我觉得也挺好,玩WOW还和他现在爱人认识了,去年生了个大胖小子。

还有个同学,也是没有想清楚做啥,就考研了,考的本校本院的研究生(好考嘛),后来去了中兴通信。现在结婚了,日子稳定,过得也挺好,除了有时候感慨觉得没前途,不喜欢干手上的事情。

好了,总结一下,其实人生是个长跑,我们追求的是幸福,是不是考研和将来过的幸福没有必然联系。
换句话说,你可能问的是考研和工作哪个将来更有“钱途”。我觉得也没有必然联系,还是要看你最后选择走怎样的路。

最后说下我,我从初中就开始学习编程,本科也是软件,后来想创业,而现在确确实实正在创业,但从辞职创业至今已经有三年,还失败了一次,积蓄已经掏空。和前面说的四个同学比,我是过的相当凄惨的。 但是我并不觉得后悔,因为这个是我想做的事情,我乐在其中。

(编辑了一下,增加个例子,特殊的例子就不举了)

为什么糗事百科作为一个注册门槛很高的 Web 2.0 网站,其UGC能如此给力?

http://www.zhihu.com/question/19832316/answer/13101283

首先,是因为它让用户能得到快乐,得到快乐的用户自然更愿意回报
其次,因为它的氛围是用户自己发表,所以用户会跟风进行发表
再次,就是因为它不需要注册就能发表
最后,审核机制让好的内容得以筛选出来,保证网站的内容质量,然后回到第一条

亲身经历夜半鬼声

http://www.bling0.com/cool/qin-shen-jing-li-ye-ban-gui-sheng

就刚刚,我听见房顶传来时断时续的嗡嗡声,嗡嗡声感觉是某马达发出来的,结束还伴随着“嗒”的一声,这些声音都不是很响但是富有穿透力,连绵不绝,终于把我吵醒。

我看了一下表,三点半,寻思哪家人这么无聊现在还装修,以为这声音小就能不影响别人休息么。然后等了好久发现也没停的迹象,于是我索性穿上衣服出去找哪家人在装修。

外面是漆黑的长廊(来过的人懂的),现在又在刮风下雨,风从间隙中吹过,发出呜呜的啸叫。

我摸上二楼,在对应的周围几个人家门口,在门口仔细听着,发现没声音,然后又上了三楼,发现还是没声音。

雨还在淅淅沥沥地下着,我又在黑暗中摸回了房间,发现那个声音还在继续。然后我就纳闷了。我走出大楼,看究竟哪个房间还有人,然后锁定了四楼的一户人家。

我爬上了四楼,找到了404房间,门缝透出橘黄色的白炽灯光,门口还贴着一张电费的欠费催缴单,除了窗外的风声,也没有奇怪的声音了。我敲了404的门,一位大妈把门轻轻打开,露了一条缝,大妈似乎很疑惑,我问是不是在装修,她立马说没有没有,然后把门关上了。

吃了闭门羹之后我想该怎么办呢,又上了六楼,去找另一家刚刚看到有灯光的屋子,走到门口,还是没有听见异常的声音,倒是风声变得更大了,好像野兽在怒号。

漆黑的长廊的另一侧传来叮叮当当的声音,我顺着长廊想回去,然后突然出现了一个大叔的身影,与我擦肩而过。

“请问……”我问道,“有没有听到一种很奇怪的声音,就像有人家在装修”。大叔很奇怪地看着我,说哪有什么奇怪的声音,可能是风吹的声音,这个天气就是这个样子,你不要害怕。

说完大叔继续前进,没到一个门口就放下手中的牛奶瓶

我也安慰自己说大概就是风声吧。然而回到房间,听着那声音怎么也不像是风声产生的,风声共鸣应该是一种渐渐增大渐渐减小的,而非这种突然出现又突然消失的。

于是我再次拿起伞,跑出了大楼,沿着大楼的另一侧寻找是不是还有什么可能的房间。

当我经过地下停车库入口(我住的房间在一楼,就在入口上方)的时候,我突然看到那边发出绿色的光,忽闪忽闪,还伴随着那种奇怪的轰鸣声。我沿着车库入口往下走,然后一转弯,终于发现了,是某个类似于电表的东西出了故障,类似短路之类的。

于是我赶紧跑到门卫,让保安大叔去帮我解决了这个怪物

回到房间后,我顿时觉得今天的经历可以上cctv10的科教探索节目了,还要分上下两集。

关于待读页面的一些说明

关于待读页面的一些说明

待读文章页面,您可以想象成您的“邮箱”

当您订阅的小组、用户以及文章产生新的内容时,则会将这些新的文章投递到您的“邮箱”中

在“按时间排序”中,待读文章是按照其投递到您的“邮箱”中的时间顺序来排序,最新的最前。

同时,您还可以直接在“待读文章”页面,选择“按热度排序”,就能直接排序您尚未读过的文章。

在待读页面中,未读过的文章的字体颜色较深,背景边框有绿色,读过的文章字体颜色较浅,无背景边框。

当滚动页面,或者点击文章时,当前的文章的边框会被高亮,这时文章会被设置为“已读”。

在把“文章”标记为已读后,文章对于您的权重便会清零,这时刷新“按热度排序”的页面时,读过的文章将会放到最后。

已读的文章,在过了一段时间之后,会自动从您的“邮箱”中删除,所以,请及时点击“顶”或者进行关注,方便今后进行整理