はじめに
これはRedis導入後に、Redis Objectsの使い方を学ぼうと思った一人の若者の備忘録です。
GitHubのリポジトリを参考にしています。
GitHub - nateware/redis-objects: Map Redis types directly to Ruby objects
Gemの導入
はじめに、Gemfileにgemを追加します。
gem 'redis-objects'
モデルクラスに組み込んでみる
Redis::Objectsをモデルクラスにインクルードします。
Redis::Obejcetsは ユニークな値を返すメソッドであるid
を備えているクラスであれば効果的に活用できます。
そして、自動的に各オブジェクトに対してユニークなキーを発行してくれたりします。
例:下記のようなフォーマット
model_name:id:field_name
Userクラスで試してみる
class User
include Redis::Objects
counter :my_posts
def id
1
end
end
user = User.new
user.id
user.my_posts.increment
user.my_posts.increment
user.my_posts.increment
puts user.my_posts.value
user.my_posts.reset
puts user.my_posts.value
user.my_posts.reset 5
puts user.my_posts.value
Counters
任意のcounter_name
をキーとしてRedisに保存される仕組み。
@counter = Redis::Counter.new('counter_name')
@counter.increment
@counter.decrement
@counter.increment(3)
puts @counter.value
Values
シンプルな値も簡単に取り扱えます。
@value = Redis::Value.new('value_name')
@value.value = 'a'
@value.delete
Lists
Lists
はRubyの配列のような働きをします。
配列を扱う際に登場するメソッドが同じように使えて便利。
@list = Redis::List.new('list_name')
@list << 'a'
@list << 'b'
@list.include? 'c'
@list.values
@list << 'c'
@list.delete('c')
@list[0]
@list[0,1]
@list[0..1]
@list.shift
@list.pop
@list.clear
配列の最大保持数も指定できます。
※ :maxlengthオプションを使います。最も古い要素を配列外に出します。
@list = Redis::List.new('list_name', :maxlength => 10)
Hashes
HashesもRubyのHashのような働きをします。Redis独自の仕様もあります。
RubyのHashとの衝突を避けるために、HashKey
という命名になっています。
@hash = Redis::HashKey.new('hash_name')
@hash['a'] = 1
@hash['b'] = 2
@hash.each do |k,v|
puts "#{k} = #{v}"
end
@hash['c'] = 3
puts @hash.all
@hash.clear
Redis上では、数字は文字列になることに注意してください。
Sets
SetsはRubyのSetクラスのようなものです。
順序立てられたものではないですが、要素の一意性が担保されます。
@set = Redis::Set.new('set_name')
@set << 'a'
@set << 'b'
@set << 'a'
@set.member? 'c'
@set.members
@set.members.reverse
@set.each do |member|
puts member
end
@set.clear
Sorted Sets
プロパティーの一意性に伴い、Sorted Sets
はハッシュと配列の両取りをしたような働きをします。
ハッシュのように割り当てることができ、取り出すときは配列風になります。
@sorted_set = Redis::SortedSet.new('number_of_posts')
@sorted_set['Nate'] = 15
@sorted_set['Peter'] = 75
@sorted_set['Jeff'] = 24
@sorted_set[0..2]
@sorted_set[0,2]
@sorted_set['Peter']
@sorted_set['Jeff']
@sorted_set.score('Jeff')
@sorted_set.rank('Peter')
@sorted_set.rank('Jeff')
@sorted_set.first
@sorted_set.last
@sorted_set.revrange(0,2)
@sorted_set['Newbie'] = 1
@sorted_set.members
@sorted_set.members.reverse
@sorted_set.rangebyscore(10, 100, :limit => 2)
@sorted_set.members(:with_scores => true)
@sorted_set.increment('Nate')
@sorted_set.incr('Peter')
@sorted_set.incr('Jeff', 4)