2009-06-30 10 views
6

के लिए कोई ओआरएम-जैसे रैपर है, मैं एक रूबी मणि (या रेल प्लगइन) की तलाश में हूं, जिस तरह से ActiveRecord SQL के विवरण को सारणीबद्ध करता है। मैं नहीं memcached में ActiveRecord मॉडल को कैश करने में मदद करने के लिए कुछ ढूंढ रहा हूं। मुझे यकीन है कि लगभग 4215 रत्न हैं जो उस समस्या से मदद करेंगे।क्या memcached

class Apple < MemcachedModel 
# whatever else here 
end 

और उसके बाद की तरह सामान करने में सक्षम हो:

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

जिनमें से JSON प्रतिनिधित्व लगेगा

मैं चाहता आदर्श रूप में क्या की तरह कुछ करने के लिए सक्षम होने के लिए है इस वर्ग को memcached और deserialize में। मैं भी हो सकता है जैसे अन्य कार्य करने के लिए सक्षम होना चाहते हैं:

my_apple.color = "red" 

# persist changes back to memcached 
my_apple.save 

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

यह कोई है की तरह लगता है अब तक इस खुजली खरोंच है चाहिए और इन पंक्तियों के साथ कुछ बनाया है, लेकिन जब भी मैं इस तरह के एक मणि मैं सिर्फ ऊपर मोड़ रखने के लिए गूगल चीज जो memcached का उपयोग कर एआर मॉडल कैश में मदद करते हैं।

उत्तर

11

आप मेरे moneta मणि पर एक नज़र डाल सकते हैं, जो सभी प्रकार के कुंजी-मूल्य-स्टोरों के लिए एक ORM'ish चीज है। आप इसे यहां देख सकते हैं: http://github.com/wycats/moneta/tree/master

मोनेटा के पीछे मूल विचार यह है कि सभी केवीएस को सामान्य रूबी हैश के सबसेट की तरह व्यवहार करना चाहिए।हम समर्थन करते हैं:

  • BerkeleyDB
  • :

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

    हम KVSs की एक बड़ी संख्या का समर्थन:

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

    store और update_key तरीकों एक अतिरिक्त विकल्प हैश आप thusly उपयोग कर सकते हैं जो ले

  • कॉच डीबी
  • डेटामैपर (जो किसी भी दुकान डीएम द्वारा समर्थित का मतलब है)
  • फ़ाइलें
  • LMC
  • Memcache
  • इन-प्रक्रिया स्मृति
  • MongoDB
  • Redis
  • टोक्यो कैबिनेट
  • टोक्यो टायरेंट
  • S3
  • एसडीबीएम
  • XAttrs फ़ाइलें का उपयोग कर

हर दुकान समाप्ति का समर्थन करता है, या तो मूल रूप से (memcached में) की तरह या एक मानक मॉड्यूल मेम्कैश शैली समाप्ति की बराबरी का उपयोग कर। एपीआई हमेशा समान है और एक साझा नमूना है कि अनुपालन सुनिश्चित करने के लिए सभी एडेप्टर चलाए जाते हैं।

अपने स्वयं के एडाप्टर को जोड़ना भी काफी आसान है, यही कारण है कि इतने सारे मौजूद हैं।

+0

यह वास्तव में एक दिलचस्प लाइब्रेरी है। इसे यहां पोस्ट करने के लिए धन्यवाद! –

+0

कूल। धन्यवाद येहुदा, मैं इसे देख लूंगा। मैं इन सभी नए लगातार हैश स्टोरों के साथ खेलने का बहाना ढूंढ रहा हूं जो पॉप-अप कर रहे हैं। –

3

मुझे मेमकैड के लिए किसी भी रूबी ActiveRecord-like एडाप्टर के बारे में पता नहीं है। एक समान पुस्तकालय शायद बनाना मुश्किल होगा क्योंकि Memcached एक संबंधपरक डेटाबेस के रूप में कार्य नहीं करता है।

परिणाम यह है कि लाइब्रेरी ActiveRecord द्वारा समर्थित सुविधाओं का 80% लागू करने में सक्षम नहीं होगा, तो इस तरह के कार्यान्वयन का क्या फायदा है? आपके पास पहले से ही "सीआरयूडी" पैटर्न के साथ memcache के साथ काम करने के लिए रेल में आवश्यक सब कुछ है।// बनाएँ/अद्यतन सहेजें/नष्ट तरीकों

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

आप अधिक सहज महसूस करते हैं, तो आप एक आवरण और प्रॉक्सी इन तरीकों संबंधित एक नई के साथ बना सकते हैं। हालांकि, आप कभी भी बुनियादी सीआरयूडी सिस्टम से आगे नहीं जा पाएंगे क्योंकि मेमकैड का उद्देश्य एक रिलेशनल डेटाबेस नहीं है।

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

हाँ, मेरे पास क्षणिक डेटा है जो मुझे किसी अन्य एपीआई से मिलता है। मैं स्थानीय रूप से डेटा को कैश करना चाहता हूं ताकि प्रत्येक बार जब मैं अनुरोध करता हूं तो मुझे इस अन्य एपीआई में राउंड-ट्रिप करने की ज़रूरत नहीं है। जिन सामानों को मैं कैशिंग कर रहा हूं वह खाता जानकारी सामान है - उपयोगकर्ता, संगठन, इत्यादि जैसी वस्तुएं –

1

जैसा कि सिमोन कार्लेटी ने लिखा था, मेमकैच एक संबंधपरक डेटाबेस नहीं है; यह अपनी सभी चाबियों को भी सूचीबद्ध नहीं कर सकता है। इस प्रकार, Memcached में डेटा संग्रहीत करने वाले किसी ActiveRecord-like मॉडल में ActiveRecord की सभी कार्यक्षमता नहीं होगी। फिर भी, मुझे लगता है कि आपके सभी मॉडलों के लिए एक सतत एपीआई रखने में कुछ मूल्य है, इसलिए यदि आपके मॉडल में से कोई एक मेमकैच में अपना डेटा संग्रहीत करने के लिए समझ में आता है, तो आप उस उद्देश्य के लिए बनाए गए इस मॉड्यूल का उपयोग कर सकते हैं:

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

संबंधित मुद्दे