Loading...

Tag Archive for '%e5%8e%8b%e7%bc%a9'

    AD: 猛买网,精彩团购 | Jobsdigg | 很棒的男装店 | 网站地图

Rails中压缩存储文本数据

继续压缩话题。之前写了 Rails生成压缩的静态缓存,以及配置nginx以支持直接发送压缩文件两篇文章。今天谈的是在Rails中,将大段文本内容以压缩格式存在数据库。这也是从公司的一个项目中获得的灵感。
原始需求
手头有一个结构简单的文本库,可以看做是key=>value。约180万条数据,2.8G(确实不算大,见笑了)。

这个库查询频繁,CPU在IOWAIT耗时颇多。
Linode服务器硬盘紧张,而CPU富裕。
若能通过压缩减小体积,备份/回导时也会更省时。

实施过程
整个实施过程做到了无缝转换,不需要停服务。

第一步:将文本字段类型由TEXT修改为BLOB;新增一个is_gzip字段用于标识是否经过压缩,默认为0。
* 需要注意,BLOB和TEXT最长支持65535字节。
第二步,修改Rails相应的Model。代码示例(压缩content字段):
class TextData < ActiveRecord::Model
def content
if self.is_gzip
Zlib::Inflate.inflate(super)
else
super
end
end

def content=(info_content)
super Zlib::Deflate.deflate(info_content, 9)
self.is_gzip = true
end
end

再一次感叹super的便捷。修改代码后,需要重新部署一下Rails应用。
第三步,创建一个rake任务,用来批量做转换。关键部位只消这么做:
text_data.content = text_data.content
text_data.save

第四步,在做过修改的表上做一次optimize [...]

Rails中使用压缩的静态缓存

最近我的Linode服务器硬盘吃紧,一个16G的分区,使用率达到99%,就快无立锥之地了。某个Rails应用,生成的静态文件占用了超过9G的空间,并且还在不断增长。最初没想到好办法,想,难道要被逼升级服务器?后来联想到WP-SuperCache的原理,计上心来:用GZip压缩这些静态文件。
压缩文件做缓存有什么好处?

文本压缩的比例够大,这样做节约
压缩好之后,无需Web服务器再做压缩

那,会有什么问题?

不支持GZip的客户端,只能看到一堆乱码。据我观察,YSlurp疑似不支持GZip。
CPU的开销会增加

第一个问题也可以通过web服务器的一些逻辑判断,给不支持GZip的客户端返回未经压缩的内容(WP-SuperCache就是这么做的)——但个人感觉意义不大,大部分客户端都支持GZip,Google的SPDY(自备翻墙工具)都强制压缩强制SSL了。对第二个问题,VPS上主要是内存不够,CPU资源相对富裕。
在Rails中,做到这点非常轻松。原Controller中代码大致如下,无需改动这些代码,即可把静态页面缓存改为GZip格式。

cache_pages函数原型在action_pack/lib/action_controller/caching/pages.rb 中,大致的调用顺序为:

其中,class.cache_page函数进行了写入文件的操作,写入的位置是由class.page_cache_path决定的。看到这里,难道要撸起袖子hack Rails框架?No,只要在ApplicationController中加入几行代码,覆盖这两个函数即可做到。

def self.cache_page content, path
# 若目录不存在,则创建,以免写入时报错
FileUtils.makedirs(File.dirname(page_cache_path(path)))
Zlib::GzipWriter.open(page_cache_path(path)) do |gz|
gz.write content
end
end

# 使用super可以调用父类的同名方法
def self.page_cache_path path
super + “.gz”
end

将上面代码加入后,生成的静态缓存,就变成.gz后缀的压缩文件了。此外,Ruby的super函数真是一个很棒的玩意。

但这仅做了一半,我们还需要配置WEB服务器以支持直接发送GZip压缩文件。对Apache来说,可以大部分照搬WP-SuperCache的Rewrite规则;对nginx来说,还需要写一些配置。下一篇文章,将谈谈在nginx中如何做配置以支持直接发送GZip文件。

700M压缩到142M

前几天一直在用的c++ builder到期了(说是一直用,其实只用过一次)。我在网上拼命找他的注册机,居然奇迹般的没有找到。只好忍了,把它卸掉——我发誓这是我第一次没有找到对应的注册机,真是不爽。今天早上去网上又下了一个版本,说是带注册机的,才142M,我家的网速那么快(我到宁愿他慢一点,好歹稳定一点啊),一会儿就下载好了。
然后解压,这不解不要紧,一解吓我一跳。压缩包里面有一个iso文件,足足有700M!我纳闷他是怎么用winrar压到差不多五分之一的。要是里面都是纯文本文件,还有可能,今天算是长见识了。
后来又顺手下载了一个flex builder,听说很好使啊。