2011-02-25 6 views
9

Redis को बचाने के लिए, और मैं सीधे Redis करने के लिए उन ActiveRecord वस्तुओं संग्रहीत करना चाहते हैं, लेकिन redis-rb का उपयोग कर मैं एक त्रुटि मिलती है।कैसे रेल की ActiveRecord वस्तु मैं अपने वेब कैश के रूप में उपयोग कर रहा हूँ redis

ऐसा लगता है कि मैं इसे या कुछ क्या क्रमानुसार नहीं कर सकते। क्या मेरे लिए ऐसा करने के लिए कोई lib है? क्या मुझे इसे जेसन प्रारूप में क्रमबद्ध करना है?

कौन सी धारावाहिक प्रारूप सबसे अधिक कुशल होगा?

उत्तर

14

रेडिस तारों (और तारों के कुछ अन्य डेटा संरचनाओं) को स्टोर करता है; इसलिए आप Redis मानों में क्रमबद्ध कर सकते हैं हालांकि आप एक स्ट्रिंग के साथ समाप्त होने तक इतनी देर तक पसंद करते हैं।

JSON शायद सबसे अच्छी जगह के रूप में यह दुबला होना, अत्यधिक भंगुर नहीं है, को लाइव उन्नयन पैटर्न के साथ अच्छी तरह से काम करता है, और सीटू पढ़ी जा सकती है शुरू करने के लिए है। बाद में आप आवश्यकतानुसार अपने लक्ष्यों को पूरा करने के लिए और अधिक जटिलता जोड़ सकते हैं, उदाहरण के लिए, संपीड़न। #to_json और #from_json पहले से ही ActiveRecord पर हैं यदि आप JSON का उपयोग करना चाहते हैं (YAJL या इसके साथ जो अत्यधिक धीमी नहीं होनी चाहिए, अपेक्षाकृत बोलना चाहिए।) #to_xml भी है, यदि आप एस & एम

में हैं

कच्चे marshaling भी आप के लिए काम कर सकते हैं, लेकिन कभी-कभी horrifically गलत हो जाता है (मैं मार्शल लिया है वस्तुओं LZO संपीड़न है कि केवल JSON में कुछ कश्मीर थे के बाद 2 एमबी से अधिक है।)

तो यह वास्तव में एक रुकावट है, तो आप करेंगे अपने लक्ष्य (ओं) के लिए अपने स्वयं के दक्षता परीक्षण चलाने के लिए, उदाहरण के लिए, अपनी खुद की वस्तुओं और डेटा पैटर्न के साथ गति, पढ़ने की गति, या भंडारण आकार लिखें।

+0

धन्यवाद यूरी, आपने वास्तव में मुझे बताया कि मुझे क्या पता है। ऐसा लगता है कि जेसन यहाँ मेरा सबसे अच्छा विकल्प है ... धन्यवाद फिर से! –

+0

अभी यह कोशिश कर रहा है, ऐसा लगता है कि यदि आप संघों सहित हैं तो मार्शल सही विकल्प है। यह चीजों को सही प्रकार में बहाल करेगा। JSON के साथ, एसोसिएशन को केवल हैश के रूप में संग्रहीत किया जाता है, इसलिए आपको from_json से पुनर्स्थापित करने का प्रयास करने में त्रुटि मिलती है। – mahemoff

+0

http://msgpack.org/ भी एक अच्छा विकल्प है। जेएसओएन से छोटे और अधिक कुशल। –

1
def self.set(friend_list, player_id) 
redis.set("friend_list_#{player_id}", Marshal.dump(friend_list)) == 'OK' ? friend_list : nil 
end 

def self.get(player_id) 
    friend_list = redis.get("friend_list_#{player_id}") 
    Marshal.load(friend_list) if friend_list 
end 
+0

लगता json मेरे लिए और अधिक सुविधाजनक है, लेकिन मैं मार्शल विधि के खिलाफ एक प्रदर्शन परीक्षण करेंगे। फिर भी धन्यवाद। –

0

आप एक हैश विशेषताओं विधि का उपयोग करने के लिए अपने मॉडल में बदल सकते हैं और उसके बाद mapped_hmset के साथ सहेजें

def redis_set() 
    redis.mapped_hmset("namespace:modelName:#{self.id}", self.attributes) 
end 

def redis_get(id) 
    redis.hgetall("namespace:modelName:#{id}") 
end 
संबंधित मुद्दे