2012-10-13 10 views
10

मेम्कैश से एक प्रमुख (pylibmc का प्रयोग करके) के लिए, आप ऐसा करते हैं:बिना किसी eval के redis से वस्तु प्राप्त करें?

client.set(key, {'object': 'dictionary'}, time=expire) 
client.get(key) 

redis में एक ही है: अंतिम पंक्ति मेरे लिए सही नहीं लगता है

redis.setex(key, expire, {'object': 'dictionary'}) 
eval(redis.get(key) or 'None') 

है। रेडिस केवल तारों को वापस करने लगता है। क्या ऑब्जेक्ट को उसी रूप में वापस करने के लिए रेडिस प्राप्त होता है जिसे इसे रखा गया था?

उत्तर

24

अंतर यह है कि दोनों memcached और redis केवल स्ट्रिंग मानों का समर्थन करते हैं, pylibmcpickle, redis-py का उपयोग करके आपके द्वारा भेजे गए मानों को क्रमबद्ध करता है, बस उन्हें स्ट्रिंग में परिवर्तित करता है।

यदि आप रेडिस के साथ ऐसा करना चाहते हैं, तो आप अपने लिए पिकलिंग करने के लिए अपने स्वयं के कार्य कर सकते हैं।

def set_value(redis, key, value): 
    redis.set(key, pickle.dumps(value)) 

def get_value(redis, key): 
    pickled_value = redis.get(key) 
    if pickled_value is None: 
     return None 
    return pickle.loads(pickled_value) 
7

या आप भी कर सकते हैं उपवर्ग Redis:

import pickle 
from redis import StrictRedis 


class PickledRedis(StrictRedis): 
    def get(self, name): 
     pickled_value = super(PickledRedis, self).get(name) 
     if pickled_value is None: 
      return None 
     return pickle.loads(pickled_value) 

    def set(self, name, value, ex=None, px=None, nx=False, xx=False): 
     return super(PickledRedis, self).set(name, pickle.dumps(value), ex, px, nx, xx) 

सौजन्य: https://github.com/andymccurdy/redis-py/issues/186

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