2013年5月29日水曜日

redis-objectsがなくてもプロジェクトは回るが

このエントリーをはてなブックマークに追加

あるととても便利だと思います

はじめに

エンジニアの@ryooo321です。
よろしくお願いします。
ご存知の方も多いかもしれませんが、今回はRubyからRedisを使う際にとても扱いやすいredis-objectsをご紹介したいと思います。

https://github.com/nateware/redis-objects


特徴

・ORMではない

・Redisのデータ型(counter, value, list, hash, set, sorted-set)をサポート

・ロック機能も利用可能



好きなところ

・モデルの任意のプロパティをRedisに保存するような感覚で利用できる点。

・Redisのキー情報をシームレスに管理できる点。

・ARモデルの一部プロパティをRedisに移したりできるので、データストア単位でなく理想の単位でモデルを定義できる点。


This is not an ORM. People that are wrapping ORM’s around Redis are missing the point.
(readmeより引用)
作者の方はこのように言っており、本当にとても使いやすい形になっております。

目次

1. Counter
2. List
3. Set
4. Hash
5. Sorted Set
6. global
7. Lock
8. redisオブジェクト


1. Counter

数値をアトミックにincrement/decrementする型です。

class User < ActiveRecord::Base
  include Redis::Objects
  counter :friend_count, :start => 0
  # startは省略可
end

@user = User.find(id)

# インクリメント
@user.friend_count.increment

# 渡したブロックで例外発生もしくはnilが帰ったときは、decrementを発行して数値を戻す
@user.friend_count.increment do |new_value|
  raise 'friend count is limited by 20' if 20 < new_value
  true
end

# Userを取得せずにアクセス
friend_count = User.get_counter(:friend_count, user_id)
User.increment_counter(:friend_count, user_id)
Userを取得せずにアクセスできる点、オブジェクト経由で操作する時はuser_idを渡さないでよい点(キーがシームレス)が便利です。


2. List

配列をアトミックに操作できる型です。

class User < ActiveRecord::Base
  include Redis::Objects
  list :friend_ids, :maxlength => 20
  # startは省略可
end

@user = User.find(id)

# rubyの配列のように使えます(Enumerable)
# 追加
@user.friend_ids << 123
@user.friend_ids.push(123)

# 変更
@user.friend_ids[2] = 123

# 削除
@user.friend_ids.delete(123)

# 取得
@user.friend_ids[2]
@user.friend_ids[2..4]
@user.friend_ids.at(2)
@user.friend_ids.first
@user.friend_ids.each do |user_id|
  # hoge
end
@user.friend_ids.values

Userを取得せずに操作するメソッドは現在ありません。

しかし、⬇⬇⬇このようにしてUserオブジェクトなしにアクセスできます。

name = :friend_ids
friend_ids = Redis::List.new(User.redis_field_key(name, user_id), User.redis, User.redis_objects[name])
friend_ids.values


3. Set

重複無効な配列をアトミックに操作できる型です。

class User < ActiveRecord::Base
  include Redis::Objects
  set :friend_ids
end

@user = User.find(id)

# rubyの配列のように使えます(Enumerable)
@user.friend_ids << 123
@user.friend_ids.each do |user_id|
  # hoge
end

# setなので、重複したものは無視
@user.friend_ids << 123
@user.friend_ids << 123 # 2回目は無視
@user.friend_ids.member?(me.id)

# 共通の友達
@user.friend_ids & me.friend_ids

# どちらかの友達
@user.friend_ids | me.friend_ids
@user.friend_ids + me.friend_ids

# 共通でない友達(差分)
@user.friend_ids ^ me.friend_ids
@user.friend_ids - me.friend_ids

# Userを取得せずに操作するメソッドは現在ありませんが、List同様(前述)に取得できます


4. Hash

ハッシュをアトミックに操作できる型です。

class User < ActiveRecord::Base
  include Redis::Objects
  hash_key :item_count_map
end

@user = User.find(id)

# rubyのHashのように使えます(Enumerable)
@user.item_count_map[item_id] = 10
@user.item_count_map.each do |item_id, count|
  # hoge
end

# まとめて操作
@user.item_count_map.bulk_set(:a => 10, :b => 20, :c => 30)
@user.item_count_map.bulk_get(:a, :b)
# => {:a => 10, :b => 20}
@user.item_count_map.bulk_values(:a, :b)
# => [10, 20]

# 個別にインクリメント
@user.item_count_map.incr(:a, 50)
@user.item_count_map[:a]
# => 60

# Userを取得せずに操作するメソッドは現在ありませんが、List同様(前述)に取得できます


5. Sorted Set

ソート済みハッシュをアトミックに操作できる型です。

class User < ActiveRecord::Base
  include Redis::Objects
  sorted_set :article_rate
end

@user = User.find(id)

# articleごとに評価スコアを登録
@user.article_rate[:a] = 30
@user.article_rate[:b] = 50
@user.article_rate[:c] = 10

@user.article_rate.score(:c)
# => 10

# 順位
# 昇順
@user.article_rate.rank(:b)
# => 2

# 降順
@user.article_rate.revrank(:b)
# => 0

# スコアの範囲取得
@user.article_rate.rangebyscore(0, 100, :limit => 1)
# => [:c]
@user.article_rate.members(:with_scores => true)
# => [[:c, 10], [:a, 30], [:b, 50]]

# atomicなインクリメント
@user.article_rate.incr(:c, 100)
@user.article_rate.score(:c)
# => 110

# Userを取得せずに操作するメソッドは現在ありませんが、List同様(前述)に取得できます


6. global

すべてのデータ型クラスでglobalオプションが使えます。

trueを指定すると、クラス単位でredisキーが共通になります。

※ 同モデルのオブジェクトすべてが、同じキャッシュを見るような状態です。

class User < ActiveRecord::Base
  include Redis::Objects
  sorted_set :article_rate
  sorted_set :event_point, :global => true
end

# これは@userごとのランキング
@user.article_rate.rank(:a)

# これは全ユーザーのランキング
@user.event_point.rank(:a)


7. Lock

lockの実装としてはredisにフラグ値をsetし、そのフラグがある場合は処理を待ち合わせる作りです。

同じhoge_lockを使っている箇所とで排他制御にできます。

class User < ActiveRecord::Base
  include Redis::Objects
  lock :hoge, :expiration => 20.second, :timeout => 1.second
  
  # lockのオプション
  # timeout :
  #    指定された時間以上にロック解除を待った場合、例外を投げます。
  # expiration :
  #    万が一ロックが解除されない状態になっても、指定された時間が経つとredis側でロック解除します。
end

@user = User.find(id)

# 処理Aと処理Bは排他的に動く
@user.hoge_lock.lock do
  # 処理A
end
@user.hoge_lock.lock do
  # 処理B
end



8. redisオブジェクト

redisオブジェクトはredis gemのオブジェクトで、redis-objectsで未実装のAPIもredisオブジェクト経由で呼び出せる場合があります。

class User < ActiveRecord::Base
  include Redis::Objects
  value :hoge
end

@user = User.find(id)

# redisオブジェクトへは、下記のようにアクセスできます。
redis = User.redis
redis = @user.redis

redis.pipelined do
  redis.set "foo", "bar"
  redis.incr "baz"
end


おわりに

本稿にお付き合い下さいましてありがとうございました。

この素晴らしいプロダクトを、みなさまが少しでもよいと思っていただければ幸いです。



一緒に働きたい方、絶賛 募集中

京都でスキルアップしたいエンジニアの皆さん、ご応募お待ちしています!
社内にはプロジェクターが使えるバースペースがあり、業務後のコミュニケーションの場となっています。

京都でスキルアップしたい学生さん、アルバイトも可能なのでご応募お待ちしています!
オフィスワークでドリンク飲み放題、時給は高く、シフトの自由度も高いです。

大阪、滋賀、神戸から通勤実績あります
イラストレーターさん、シナリオライターさんも募集中(アルバイト可)です!


11 件のコメント:

  1. Thanks for sharing, nice post!

    Tìm hiểu dịch vụ mua hàng trên aliexpress như thế nào đảm bảo an toàn uy tín, hướng dẫn cách mua hàng trên aliexpress.com và ship về Việt Nam hay làm sao để mua hàng trên aliexpress chất lượng và giá rẻ và dịch vụ mua hàng hộ trên aliexpress như thế nào là tốt nhất, dịch vụ nhận đặt mua hàng trên aliexpress tại Việt Nam uy tín tốt nhất, chia sẻ cách mua hàng trên aliexpress và tìm hiểu aliexpress là gì mua hàng trên aliexpress có tốt uy tín hay không

    返信削除
  2. Thanks for sharing, nice post! Post really provice useful information!

    Giaonhanquocte247 chuyên dịch vụ order hàng nhật, ship hàng đức và dịch vụ order hàng đức về VN uy tín, giá rẻ.

    返信削除
  3. In all cases, just try to focus on education. You can check this out and it will change the way you write your poems and essays. Just try.

    返信削除
  4. Redis objects that you say very well. I will use it for my computer.duck life

    返信削除
  5. تیک بان خرید بلیط هواپیما, خرید اینترنتی بلیط هواپیما, بلیط هواپیما آنلاین, تیک بان نه ادعا می کند که بزرگترین است که مدعی می شود یک سایت معتبر خرید بلیط هواپیما در ایران است که توانسته بدون هیاهو و تبلیغات الکی سهمی درخور از مشتریان وفادار داشته باشد

    返信削除
  6. نمایندگی تعمیرات ال جی, نمایندگی مجاز ال جی, تعمیرگاه مجاز ال جی , نمایندگی ال جی, نمایندگی رسمی ال جی : آماده ارائه تعمیرات به شما عزیزان است.خدمات پس از فروش ال جی در کنار نمایندگی تعمیرات سامسونگ و خدمات پس از فروش سامسونگ می تواند برای تعمیرات شما خوب و ایده آل باشد.

    返信削除
  7. چاپ دیجیتال یکی از دو روش قدیمی است که یک پلیت یا زینک دارد که متریال روی آن قرار گرفته و چاپ می شود. این عمل همراه با انتقال جوهر صورت می گیرد که ممکن است رنگ ها در چند مرحله روی کاغذ اجرا شود. بنابراین قیمت چاپ دیجیتال جایگزین بسیار مناسبی بوده و مزایای زیادی هم دارد.
    چاپ بنر را می‌توان مهم‌ترین مدیا در گروه چاپ فضای خارجی به شمار آورد که برای انواع تبلیغات، به خصوص معرفی شرکت‌ها، محصولات و خدمات، به کار می‌رود.
    چاپ کارت ویزیت نشانگر سلیقه، گرایشات، نظرات و دیدگاه های کاری یک شخص یا سازماناست. برای ‏نیازهای فوری و تیراژهای زیر 1000، چاپ دیجیتال کارت ویزیت بهترین انتخاب است.
    چاپ کاتالوگ‎ ‎ابزار مهمی در معرفی و اطلاع رسانی در حوزه های تولید و خدمات است. ‏
    چاپ بروشور‎‎(Brochure) ‎دفترچه یا برگه ایست (معمولا به صورت تا شده از چند جا بر روی خود) برای ‏ارائه توضیحات کاملی
    چاپ پوستر‎‎‏ وسیله ای برای اعلان خبر در مورد رویدادها و موضوعات مختلف است که عموما به ‏صورت عمودی طراحی شده و به نمایش در می آید. ابعاد طراحی پوستر باید مناسب برای مشاهده از ‏فاصله نزدیک باشد.
    چاپ عکس معمولا با بهره گیری از مرغوب ترین نوع کاغذ (بهترین نوع کاغذ فوتو گلاسه) برای ‏چاپ عکس ها در بهترین کیفیت از نظر رنگ و رزولوشن و با ماندگاری بسیار بالا به کار می رود. ‏
    تابلو فلکسی یـا تابلو فلکسی فیس در ایران از حدود سال ۱۳۷۵ در تبلیغات فضای بیرونی و نیز درونی به کار می‌رود. چاپ فلکس عرض 5 متر به نسبت دیگر تابلو فلکسی تبلیغاتی ، به لحاظ نورپردازی و تنوع جلوه‌های بصری، برجسته است.
    چاپ روی بوم به دو صورت با کلاف و بدون کلاف صورت می گیرد. در چاپ با کلاف، چارچوبی دورتادور سطح چاپ شده قرار می‌گیرد و در چاپ بدون کلاف، طرح صرفا روی چاپ روی بوم انجام می شود.

    返信削除
  8. اگر دنبال کلینیک دندانپزشکی شبانه روزی خوبی می گردید تا به سلامت دندان های خود رسیدگی کنید. ارتودنسی دندان کودکان خود را بهتر دنبال کنید قبل از ایمپلنت دندان در مورد کلینیک دندانپزشکی بیشتر بدانید و یا حتا از هزینه لمینت دندان خبر داشته باشید می توانید دندون طلا سر بزنید.
    ایمپلنت دندان یکی از خدمات کلینیک دندانپزشکی دندون طلااست که به صورت کاملا تخصصی و با کمک آخرین و بهترین برندهای ایمپلنت انجام می شود. در کنار درمان ایمپلنت کارهای لازم برای آماده سازی شرایط کاشت ایمپلنت نیز در کلینیک دندانپزشکی انجام می شود. زمانی که استخوان فک برای جراحی ایمپلنت دندان آماده نباشد با جراحی های پیوند استخوان این کمبود برطرف می شود.

    لمینت دندان یک درمان سریع زیبایی برای دندان ها می باشد که بدون اینکه آسیبی به دندان های شما بزند، با استحکام عالی لبخند شما را زیباتر می کند. شما درمان زیبایی لمینت دندان می توانید با توجه به میل خود، رنگ و فرم دندان هایتان را انتخاب کنید.
    ارتودنسی دندان یک روش درمانی در دندانپزشکی است که دندان های نامرتب و نامنظم را اصلاح می کند. ارتودنسی دندان علاوه بر اصلاح دندان ها زیبایی خاصی هم به دندان ها می دهد و از خرابی آنها نیز پیشگیری می کند.

    جراحی دندان عقل اسم دیگر دندان های آسیاب چهارم دندان عقل نیز گفته می شود که به طور همیشگی در دهان رشد می کند.

    درمان و اصلاح لبخند لثه ای ، لبخند لثه ای یا لبخند لثه نما زمانی اتفاق می افتد که بیمار شروع به خندیدن می کند، در این زمان لثه های او دیده می شوند. در ۸۰ درصد بیمارها هنگام خندیدن لثه های آنها بیرون می زنند.

    اصلاح طرح لبخند و زیبایی خنده ، احساس خوب داشتن و انتقال آن به دیگران یکی از خواسته های افراد است، شاید چیزهایی زیادی باعث این احساس در شما شود. مسلما خنده و لبخند زیبا به چهره داشتن می تواند به این خواسته شما کمک زیادی کند.
    دیگه از این کلیشه تر نمی شود در مورد بازاریابی اینترنتی حرف زد! من هم قرار نیست از چیزی تعریف ارائه بدهم اما خب باید از یک جایی شروع کرد.
    همین اول بگویم آموزش سئو مثل آموزش رانندگی می ماند شما هیچ وقت بعد از آموزش رانندگی توسط شوماخر هر چند که بتوانید رانندگی خوبی بکنید اما شوماخر نیستید مگر این که تجربه او را داشته باشید.
    سیاری از کسانی که به کار سئو مشغول هستند وقتی قرار می شود درباره شغل شان توضیحاتی را به افراد نا آشنا سئو ارائه دهند دچار مشکل می شوند.

    返信削除
  9. لایت باکس تبلیغاتی برای رستوران ها، کافی شاپ ها و هر جای دیگری که نیاز به تبلیغات داشته باشد مورد استفاده قرار می گیرد.
    در لایت باکس تبلیغاتی طرح مورد نظر را به هر شکلی که مد نظر مشتری باشد تهیه می کنند و سپس با استفاده از یک نور مخفی در پشت تصویر و روی قاب طرح نمایان تر از قبل جلوه گری می کند. این طرح به شکلی نمایش داده می شود که گویی یک تلویزیون در برابر دیدگان شما روشن شده است.
    ساخت لایت باکس های تبلیغاتی به صورت یک رو، دو رو و چهار طرفه تولید می شوند و شما بسته به محیطی که برای نصب لایت باکس در نظر دارید می توانید از مدل های متفاوت آن ها استفاده کنید

    返信削除