1
mongost3t 2016-03-20 15:46:44 +08:00
为什么要用 pickle
|
2
fxxkgw OP @mongost3t
如果用 hmset 方式的话,那 hgetall 取出来后,第二层 也就是 key 为 ip 的那些字典会被默认为 str 的,需要每个判断每个转化 所以采用了 pickle 取出后从里到外都是字典了 |
3
TheCure 2016-03-20 17:46:25 +08:00
感觉是 pickle 的问题
换 cpickle/pickle 或者版本试试? |
4
ethego 2016-03-20 17:55:17 +08:00
dump 成 json 啊
|
5
fxxkgw OP @callofmx
换了 cpickle 也一样 我用了 pickle 写文件方式 再读取不会出现 redis 中的问题 #!/usr/bin/env python import pickle appinfo = { 'a': {'172.25.53.12': {'olversion': u'111', 'rb1': u'222', 'rb2': u'333'}}, 'c': {'172.25.53.14': {'olversion': u'111', 'rb1': u'222', 'rb2': u'333'}}, 'b': {'172.25.53.11': {'olversion': u'111', 'rb1': u'222', 'rb2': u'333'}}, 'd': {'172.25.53.13': {'olversion': u'111', 'rb1': u'222', 'rb2': u'333'}}} #op = operate_redis() #appinfo = op.read_from_redis('5006') p = pickle.dumps(appinfo) with open('test.txt', 'wb+') as f: f.write(p) f.seek(0) info = pickle.loads(f.read()) print "===========" print "===========" info['a']['172.25.53.12']['rb1'] = 'gofuckyourself' #只修改 a 对应的 b c d 中 rb1 不变 print info |
6
timonwong 2016-03-20 18:17:08 +08:00
> pickle stores such objects only once, and ensures that all other references point to the master copy. Shared objects remain shared, which can be very important for mutable objects.
需要确认的是,你的 appinfo[x][ip] 是不是指向的同一个 object? |
10
fxxkgw OP @timonwong
@mongost3t 这个我理解 dict list 都是可变的 赋值时候如果不是深拷贝会互相改变 但是我还是没明白 在同一个字典内 改变 a 为什么 bcd 都会跟着变 那么说在 redis 内存储时候因为 a b c d 值相同 所以用的是同一个地址? 我测试了下 一个字典,在本地 Python 下 a={'x':1, 'b':{'c':{'d':1,'e':2}}, 'f':{'g':{'d':1,'e':2}} } >>> id(a['b']['c']) 9040448 >>> id(a['f']['g']) 9085376 虽然值相同,但是存储的地址不同 但是 a 经过 redis 的 pickle 方式存储后 >>> id(a['b']['c']) 31571776 >>> >>> id(a['f']['g']) 31571776 地址是相同的,所以会造成那个问题。 |
11
jamiesun 2016-03-20 18:48:48 +08:00
copyonwrite
|
13
mulog 2016-03-20 19:15:32 +08:00
@fxxkgw redis 只知道你存进去的 pickle dump 出来的字符串,你取的时候把字符串还给你,这个锅人家不背。。
|
14
Zzzzzzzzz 2016-03-20 19:29:03 +08:00 1
|