Redisを使い始めました。なかなか面白いですね。今回は単純な文字列のキー・バリューではなく、Rubyのクラス情報をRedisに保存し、再びクラスに復元する方法について記載します。
Redisのインストール方法については、この記事を参照ください。
まずは単純な文字列をRubyで保存、取得してみます。
[ruby]
require “redis”
redis = Redis.new
p “—— test simple key & value —— ”
#中身が空のほうが良いので、DB番号3を選択
redis.select(3)
p redis.keys(“*”)
#シンプルなキーとバリューを保存
redis.set(“aaa”,”taro”)
redis.set(“bbb”,”hanako”)
redis.keys(“*”).each do |key|
p “key = #{key} value = #{redis.get(key)}”
end
[/ruby]
実行結果
[bash]
“—— test simple key & value —— ”
[]
“key = bbb value = hanako”
“key = aaa value = taro”
[/bash]
クラスを作ります。(Personクラス)
[ruby]
class Person
attr_accessor :id , :name , :age
def initialize(id,name,age)
@id = id
@name = name
@age = age
end
def to_json(*a)
{
:id => @id,
:name => @name,
:age => @age
}.to_json
end
def self.from_json(json)
obj = self.new(1,2,3) #適当な値を突っ込む
obj.id = json[“id”]
obj.name = json[“name”]
obj.age = json[“age”]
return obj
end
end
[/ruby]
クラスデータをRedisに保存し、復元してみます。
Redisは固有のデータ構造は保持できないので、クラスデータをjsonにシリアライズしたものを保存します。クラスのto_jsonメソッドのデフォルトの動きではうまく動作しないので、上記のPersonクラスに to_json(*a) メソッドを定義してやることで対応します。クラスデータの復元はRedisからJSON文字列を取得し、パース。その後 Personクラスに定義した self.from_json(json)メソッドで復元します。
[ruby]
require “redis”
require “json”
redis = Redis.new
p “—— test class save & restore —— ”
#中身が空のほうが良いので、DB番号3を選択
redis.select(3)
#クラスデータを保存
ps = Person.new(1,”taro”,18)
redis.set(“ps-1″, ps.to_json())
ps = Person.new(2,”hanako”,23)
redis.set(“ps-2”, ps.to_json())
redis.keys(“ps-*”).each do |key|
p “key = #{key} value = #{redis.get(key)}”
end
#クラスデータを復元
json = JSON.parse(redis.get(“ps-1”))
ps = Person.from_json(json)
p “Person id=#{ps.id} / name=#{ps.name} / age=#{ps.age}”
redis.flushdb
[/ruby]
実行結果
[bash]
“—— test class save & restore —— ”
“key = ps-2 value = {\”id\”:2,\”name\”:\”hanako\”,\”age\”:23}”
“key = ps-1 value = {\”id\”:1,\”name\”:\”taro\”,\”age\”:18}”
“Person id=1 / name=taro / age=18”
[/bash]
シンプルですが、こういうことができるといろいろな応用ができると思います。良かったら一度試してみてください。
Leave a comment