[Ruby][Redis]オブジェクトをredisにキャッシュしたり検索したりするConcernを表現するgemを作った
Concernスタイルなモジュールを作ってみたかったので、Redisのキャッシュ機構をActiveSupport::Concernを使ってそれっぽくなるように書いてみた。
元々仕事で書いたコードだったけどちょっと直せば汎用化できそうだったので、夜なべしてgem化してみた。

GitHub - joker1007/redis-cacheable: It is concern style redis caching helper. It makes very easy to cache object.

使い方はこんな感じ

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