python和redis实现对象持久化

喜欢哪里学哪里学习方式太随性,所以,知识只能一点一点积累了吧


下午的时候突然想试试序列化和持久化对象,序列化有什么趣啊一遍一遍一遍的问!想来是被之前的面试虐多了有自虐的倾向


所谓序列化嘛,就是为了保存内存中的数据结构的,还有别的意义么


随手搜了一下,各种版本的文章也是不少,最后还是实践了这篇 序列化Python对象 - 深入Python 3 


序列化的过程分成两部分,第一部分是序列化+存储,第二部分是反序列化+恢复对象过程


存储对象过程

nyandeMacBook-Pro:~ nyan$ python
Python 3.4.2 (v3.4.2:ab2c023a9432, Oct  5 2014, 20:42:22) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> entry = {}
>>> entry['title'] = 'local pickle'
>>> entry['id'] = b'\xB6\xAD\xC5\xF4'
>>> entry['time_limit'] = None
>>> import pickle
<p class="p1"><span class="s1">>>> with open('entry.pickle', 'wb') as f:</span></p><p class="p1"><span class="s1">... <span>	</span>pickle.dump(entry, f)</span></p><p class="p1"><span class="s1">... 
>>></span></p>


至此,序列化过程结束,然后在终端当前的文件夹创建了entry.pickle文件


恢复对象过程

nyandeMacBook-Pro:~ nyan$ python
Python 3.4.2 (v3.4.2:ab2c023a9432, Oct  5 2014, 20:42:22) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pickle
>>> with open('entry.pickle', 'rb') as f:
... 	entry = pickle.load(f)
... 
>>> entry
{'title': 'local pickle', 'id': b'\xb6\xad\xc5\xf4', 'time_limit': None}

既然文件已经存储过了,没必要像原文那样分成两个终端来测试

测试结果表明可以将序列化的对象恢复



既然文件测试完成了,下面要怎么跟redis结合,解决掉文件的部分就好了,然后去查了一下pickle.py文件,发现果然有相应的方法存在

</pre><pre name="code" class="python">Functions:

    dump(object, file)
    dumps(object) -> string
    load(file) -> object
    loads(string) -> object

dumps和loads方法可以轻松解决文件的问题,下面是测试

>>> str = pickle.dumps(entry)
>>> print(str)
b'\x80\x03}q\x00(X\x02\x00\x00\x00idq\x01C\x04\xb6\xad\xc5\xf4q\x02X\x05\x00\x00\x00titleq\x03X\x0c\x00\x00\x00local pickleq\x04X\n\x00\x00\x00time_limitq\x05Nu.'
>>> ent = pickle.loads(str)
>>> ent
{'id': b'\xb6\xad\xc5\xf4', 'title': 'local pickle', 'time_limit': None}

避开文件的持久化和恢复已经解决,然后就是跟redis的结合,继续之前的实验

>>> import redis
>>> r = redis.Redis('127.0.0.1', '6379', '0')
>>> r.set('entrystr', str )
True
>>> r.get('entrystr')
b'\x80\x03}q\x00(X\x02\x00\x00\x00idq\x01C\x04\xb6\xad\xc5\xf4q\x02X\x05\x00\x00\x00titleq\x03X\x0c\x00\x00\x00local pickleq\x04X\n\x00\x00\x00time_limitq\x05Nu.'
>>> 



如此,python和redis的对象持久化过程完成



展开阅读全文

没有更多推荐了,返回首页