2014年2月27日
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