python和redis实现对象持久化

来源:互联网 发布:java打印乘法口诀表 编辑:程序博客网 时间:2024/06/14 00:10

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


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


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


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


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


存储对象过程

nyandeMacBook-Pro:~ nyan$ pythonPython 3.4.2 (v3.4.2:ab2c023a9432, Oct  5 2014, 20:42:22) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwinType "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$ pythonPython 3.4.2 (v3.4.2:ab2c023a9432, Oct  5 2014, 20:42:22) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwinType "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的对象持久化过程完成



0 0
原创粉丝点击