rails缓存机制的几个问题

ruby on rails提供了一些内建的cache机制,我们比较多的用到了其中的fragment cache。在实际使用过程中,发现了一些问题,如果你不注意,performance和正确性可能都会受到影响。 cache的重复读取问题 这是从Agile Web Development with Rails中抄下来的一段代码: def list @dynamic_content = Time.now.to_s unless read_fragment(:action => ‘list’) logger.info(“Creating fragment”) @articles = Article.find_recent end end 相信大家也都是用判断read_fragment返回值的方法来看cache是否存在。但你有没有想过,read_fragment这个函数的真正含义是读取cache。在view里,helper cache又会把cache的内容读一遍。假设你的cache用的是FileStore,下面是cache.rb中read的实现: def read(name, options = nil) #:nodoc: File.open(real_file_path(name), ‘rb’) { |f| f.read } rescue nil end 两次调用read_fragment就是两次独立的文件IO,而且每次都全文读入。第一次读完全是浪费。 解决方案: 一个是在controller里将read_fragment返回的内容保存在一个instance variable里,再到view里显示。这个做法的缺点是无法在view里使用现成的helper cache了,需要重写一个类似的helper,判断相关的instance variable而不是再去read。 另一个方法是自己写一个check_fragment,用File.exist?去判断,效率要高得多。 cache判断的原子性问题 还是上面那段代码: def list @dynamic_content Read more about rails缓存机制的几个问题[…]

开始的艺术

Guy Kawasaki的blog差不多一开始我就在读了,你没法不注意到他,好像还没见过谁象Guy一样头十篇blog篇篇出现在del.icio.us/popular里。做为和Paul Graham一样的Startup鼓吹者,Guy出了一本书,专门讲Startup,叫做“The art of the start”,我看过他为此书做宣传时候的videocast。前天,在光合作用,买到了这本书的中译本。翻译的还挺快。 对于经常读他blog的人来说,可能很多内容都是熟悉的,甚至能讲出一些书中都没有的花絮。比如给公司起名字一段,他主张使用可以动词化的词,就象”google it”,当时就和还在微软的Scoble互相调侃,因为他的blog叫Scobleizer。当然还有很多blog里没有的内容,而且翻译的也算通顺,中文读起来毕竟顺畅。 对于很多准备做startup,或者象我一样,刚刚开始做startup的人来说,总会有一大堆的问题不知道答案。这本书可以帮你解决一些问题。至于他说的对不对,准不准,适合不适合中国国情,我不知道,因为我也才刚开始啊。但是我觉得这些都不是问题,至少一些事情你知道可以怎么去做了,也可以开始做了。开始做,对一个starup来说,比什么都重要。在我们的网站上线以后,我不知道听了多少遍“这个点子我/我们也想了很久了,可是一直没有做”。值得庆幸的是,我们开始做了。

该死的UA

昨天早上五点就起来赶11点United Airline的UA 889回北京,都上跑道了,冲了两下没冲起来又回去了,说什么三号引擎动力不足,临时换引擎,晃来晃去等到四点,又上了飞机,这次更好,还没上跑道呢就被告知”the same issue”,换了引擎还是不行。Damn it!敢情和攒机一样,试错啊?!当天飞不了了,改到第二天九点。到楼下办手续,别人都好好的,就我倒霉,说什么一输入LU就当机,换了四台机器,差点把UA柜台的机器全当了。。。 就这么在SFO耗了一天,腰酸背疼。今天又是五点起床,老天保佑我今天能回北京。F**k UA!