akishin999の日記

調べた事などを書いて行きます。

redis-rb で自動的に圧縮して保存する

redis-rb を使って Redis に値を保存する際に自動的に圧縮して、取り出す時には自動的に展開してくれたら便利だな、と思って試しに作ってみました。

Redis::Client へのモンキーパッチで、コマンド判別して Zlib::Deflate と Zlib::Inflate 使って圧縮・展開するようにしています。
とりあえず対応している Redis のコマンドは書込みは set, setex, setnx, psetex、読み込みは get だけです。

使い方は以下のような感じ。

# -*- coding: utf-8 -*-

require 'redis'
require 'redis/distributed'

require './auto_compression_redis'

REDIS_MASTERS = [
  {url: "redis://192.0.2.1:6379/1", id: "redis-node1"},
  {url: "redis://192.0.2.2:6379/1", id: "redis-node2"},
  {url: "redis://192.0.2.3:6379/1", id: "redis-node3"},
]

redis = Redis::Distributed.new(REDIS_MASTERS)

key1 = "key:1001"
key2 = "key:1002"

p redis.set(key1, "test1")
p redis.get(key1)

p redis.setnx(key2, "test2")
p redis.get(key2)

p redis.setex(key1, 10000, "test3")
p redis.get(key1)

p redis.psetex(key1, 100000, "test4")
p redis.get(key1)

p redis.set(key1, "隣の客はよく柿食う客だ")
p redis.get(key1)

実行すると以下のような感じ。

% ruby redis-gzip.rb
"OK"
"test1"
false
"test2"
"OK"
"test3"
"OK"
"test4"
"OK"
"隣の客はよく柿食う客だ"

圧縮するとコマンドラインクライアントから簡単に中身を確認したりはできなくなってしまいますが、メモリ使用量がかなり減ったので、キャッシュ用途とかなら結構おすすめです。


Redis Cookbook
Redis Cookbook
posted with amazlet at 13.06.07
O'Reilly Media (2011-07-25)

Redis in Action
Redis in Action
posted with amazlet at 13.06.07
Josiah L. Carlson
Manning Pubns Co
売り上げランキング: 45,530