这里是一个简单的 Redis 包装器,可以对数据结构进行数据序列化和反序列化:
from redis import Redis
from collections import MutableMapping
from pickle import loads, dumps
class RedisStore(MutableMapping):
def __init__(self, engine):
self._store = Redis.from_url(engine)
def __getitem__(self, key):
return loads(self._store[dumps(key)])
def __setitem__(self, key, value):
self._store[dumps(key)] = dumps(value)
def __delitem__(self, key):
del self._store[dumps(key)]
def __iter__(self):
return iter(self.keys())
def __len__(self):
return len(self._store.keys())
def keys(self):
return [loads(x) for x in self._store.keys()]
def clear(self):
self._store.flushdb()
d = RedisStore('redis://localhost:6379/0')
d['a'] = {'b': 1, 'c': 10}
print repr(d.items())
d['a']['b'] = 2
print repr(d.items())
t = d['a']
t['b'] = 2
d['a'] = t
print repr(d.items())
del d['a']
d[('a', 'b')] = 1
d[('a', 'b')] = 2
print repr(d.items())
print repr([{x[0][1]: x[1]} for x in d.items() if x[0][0] == 'a'])
del d[('a', 'b')]
del d[('a', 'c')]
如果你更喜欢在redis中使用纯文本可读数据(而不是pickle存储的二进制版本), 你可以将pickle.dumps替换为repr, 将pickle.loads替换为ast.literal_eval。对于json,使用json.dumps和json.loads。
如果你总是使用简单字符串作为键值, 你可以将pickling从键中删除。