[Ruby][Redis]オブジェクトをredisにキャッシュしたり検索したりするConcernを表現するgemを作った
Concernスタイルなモジュールを作ってみたかったので、Redisのキャッシュ機構をActiveSupport::Concernを使ってそれっぽくなるように書いてみた。
元々仕事で書いたコードだったけどちょっと直せば汎用化できそうだったので、夜なべしてgem化してみた。
使い方はこんな感じ
class MyObject include RedisCacheable attr_reader :id, :name redis_key :id # optional (default: :id) redis_attrs :id, :name # method names def initialize(attributes) @id = attributes[:id] @name = attributes[:name] end end class ProcObject < MyObject redis_attrs ->(obj) { obj.id * 10 } # can give proc end
my_object = MyObject.new(id: 1, name: "my_object") my_object.cache_to_redis # KEY = my_object.id, VALUE = MultiJson.dump({"id" => my_object.id, "name" => my_object.name}) MyObject.find_from_redis(1) # => {"id" => 1, "name" => "my_object"} proc_object = ProcObject.new(id: 1, name: "proc_object") proc_object.cache_to_redis # different namespace with MyObject ProcObject.find_from_redis(1) # => 10
もし、どこかで使えそうな機会があったら検討してみてください。
デフォルトでは新しくredisのコネクションプールを生成しますが、既にredisのコネクションが存在するならそれを再利用することができます。
RedisCacheable::Connectable.redis_connection = $redis # $redis is Redis instance or ConnectionPool