2009-06-30 5 views
6

私は、ActiveRecordがSQLの詳細を抽象化するのと同じ方法でmemcachedの詳細を抽象化するルビーの宝石(またはレールプラグイン)を探しています。私はではない memcachedでActiveRecordモデルをキャッシュするのを助ける何かを探しています。私はその問題を助ける約4215の宝石があると確信しています。memcachedのORMのようなラッパーがありますか?

class Apple < MemcachedModel 
# whatever else here 
end 

、その後のようなものを行うことができるよう:のJSON表現をアップになります

my_apple = Apple.find('some memcached key') 

私が好きな理想的にはどのような

のような何かを行うことができるようにすることですこのクラスをmemcachedにしてデシリアライズします。また、私は多分のようなものを行うことができるだろう:それは誰かのように思える

my_apple.color = "red" 

# persist changes back to memcached 
my_apple.save 

# load any changes from memcached into local model 
my_apple.update 

が、今では、このかゆみを傷やこれらの線に沿って何かを作成している必要がありますが、いつでも私はちょうど上げ続けるように宝石のためのgoogle memcachedを使ってARモデルをキャッシュするのに役立つもの。

答えて

11

私のmoneta宝石を見ることができます。この宝石は、あらゆる種類のキーバリューストアのためのORM'ishです。 http://github.com/wycats/moneta/tree/master

モネタの基本的な考え方は、すべてのKVSが通常のRubyハッシュのサブセットのように正しく動作することです。私たちはサポートしています。storeupdate_key方法は、あなたは以下のようなものを使用することができ、ハッシュ追加オプション取る

#[] 
#[]= 
#delete 
#fetch 
#key? 
#store 
#update_key 
#clear 

cache = Moneta::Memcache.new(:server => "localhost:11211", :namespace => "me") 
cache.store("name", "wycats", :expires_in => 2) 
cache.update_key("name", :expires_in => 10) 

を我々はKVSs多数のサポート:

  • をBerkeleyDBの
  • CouchDB
  • DataMapper (これはDMがサポートする任意のストアを意味する)
  • ファイル
  • LMC
  • Memcacheの
  • インプロセスメモリ
  • MongoDBの
  • Redisの
  • 東京キャビネット
  • 東京タイラント
  • S3
  • SDBM
  • ファイルの使用XAttrs

すべてのストアが有効期限をサポートし、いずれかのネイティブ(memcachedの中など)またはmemcacheのスタイルの有効期限をエミュレートする標準モジュールを使用しました。 APIは常に同一であり、準拠を保証するためにすべてのアダプタが実行される共有仕様があります。

あなた自身のアダプターを追加することも非常に簡単です。なぜそう多くの理由がありますか。

+0

これは本当に面白いライブラリです。ここに投稿していただきありがとうございます! –

+0

クール。感謝Yehuda、私はこれを確認します。私は、これらの新しい永続ハッシュストアが出現しているすべての遊びの言い訳を探してきました。 –

3

私はMemcachedのRuby ActiveRecordのようなアダプターについて知らない。同様のライブラリは、Memcachedがリレーショナルデータベースとして動作しないため、おそらく作成が難しいでしょう。

その結果、ライブラリはActiveRecordでサポートされている機能の約80%を実装できないため、そのような実装のメリットは何ですか? "CRUD"パターンのmemcacheで作業するために、Railsに必要なものはすべてすでに用意されています。

Rails.cache.read('key') 
Rails.cache.write('key', 'value') 
Rails.cache.delete('key') 
Rails.cache.increment('key', 5) 
Rails.cache.fetch('key') { 'value' } 

ラップトップを作成し、対応する新しい/ create/update/save/destroyメソッドを使用してこれらのメソッドをプロキシすることができます。しかし、Memcachedはリレーショナルデータベースではないため、基本的なCRUDシステムを超えることはできません。

2

実装はかなり簡単です。

require 'ostruct' 
require 'active_support/cache' 

class StoredStruct < OpenStruct 
    attr_writer :store 
    def self.store 
    @store || superclass.store 
    end 

    def self.expand_key(key) 
    'StoredStruct_' + (superclass == OpenStruct ? '' : "#{self}_") + key.to_s 
    end 

    def self.get_unique_id 
    key = expand_key('unique_id') 
    store.write(key, 0, :unless_exist => true) 
    store.increment(key) 
    end 

    def self.save(instance) 
    id = instance.id || get_unique_id 
    store.write(expand_key(id), instance) 
    id 
    end 

    def self.find(id) 
    store.read(expand_key(id)) 
    end 

    attr_reader :id 

    def attributes 
    @table 
    end 

    def attributes=(hash) 
    @table = hash 
    end 

    def new_record? 
    self.id.nil? 
    end 

    def save 
    @id = self.class.save(self) 
    true 
    end 

    def reload 
    instance = self.class.find(self.id) 
    self.attributes = instance.attributes unless self == instance 
    self 
    end 
end 

このようにそれを使用します。

# connect to memcached 
StoredStruct.store = ActiveSupport::Cache::MemCacheStore.new("localhost:11211") 

class Apple < StoredStruct 
end 

fruit = Apple.new 
fruit.color = "red" 
fruit.taste = "delicious" 

fruit.id 
#=> nil 

fruit.save 
#=> true 
fruit.id 
#=> 1 

# to load any changes: 
fruit.reload 

Apple.find(1) 
#=> fruit 
+0

ニース。私は特にget_unique_idの実装方法が好きです。理想的には、ホイールを再発明するのではなく、既存のライブラリを使用することを考えていますが、これを最初からやり直す必要がある場合、私はあなたがここにいるものを盗もうと思っています:) –

0

あなたはNick Kallen's cache-moneyを探していてもよいです。

+0

サラ、探していない - ActiveRecord用のキャッシングライブラリ。 –

+0

ああ、私はあなたの質問を誤解して参照してください。あなたはActiveRecordを一切使用せず、オブジェクトをmemcachedに保存するだけですか?私は、あなたが保管しているものはどんなものなのか不思議です。 –

+0

他のAPIから取得した一時的なデータがあります。データをローカルにキャッシュして、要求を処理するたびにこの他のAPIにラウンドトリップする必要はありません。私がキャッシュしているものは、アカウント情報のものです - ユーザー、組織などのようなオブジェクトです。 –

1

Simone Carlettiが書いたように、Memcachedはリレーショナルデータベースではありません。すべてのキーをリストすることすらできません。そのため、Memcachedにデータを格納するActiveRecordのようなモデルには、ActiveRecordのすべての機能が含まれていません。それにもかかわらず、私はすべてのモデルに一貫したAPIを持たせることでいくらかの価値があると思うので、あなたのモデルの1つにMemcachedにデータを格納させるのが理にかなっているなら、私はその目的のために作成したモジュールを使うことができます:

http://blog.slashpoundbang.com/post/1455548868/memcachemodel-make-any-ruby-object-that-persists-in

関連する問題