我学习了Redis并给LeanCache充了钱开了一个Redis实例进行了测试,存储、读取普通数据都正常。但当使用cPickle进行dumps时遇到了报错,可否请人帮我看一下,谢谢!
错误:
STDERR web1 22:36:37
Traceback (most recent call last):
STDERR web1 22:36:37
File "/opt/pyenv/versions/2.7.13/lib/python2.7/site-packages/leancloud/engine/leanengine.py", line 128, in dispatch_request
STDERR web1 22:36:37
result = {'result': dispatch_cloud_func(self.cloud_codes, app_params, decode_object=False, **values)}
STDERR web1 22:36:37
File "/opt/pyenv/versions/2.7.13/lib/python2.7/site-packages/leancloud/engine/leanengine.py", line 222, in dispatch_cloud_func
STDERR web1 22:36:37
result = func(**params)
STDERR web1 22:36:37
File "/home/leanengine/app/cloud.py", line 148, in cacheTest
STDERR web1 22:36:37
cache.test()
STDERR web1 22:36:37
File "/home/leanengine/app/cacheModule.py", line 31, in test
STDERR web1 22:36:37
u = cPickle.dumps(user, protocol=2)
STDERR web1 22:36:37
PicklingError: Can't pickle <class 'leancloud.object_.DEUser'>: attribute lookup leancloud.object_.DEUser failed
代码:
q = leancloud.Query('DEUser')
key = '5a7f8747d50eee0042dab717'
user = q.get(key)
print 'user deckAll = ', user.get('deckAll'), ', type = ', user.__class__.__name__
u = cPickle.dumps(user, protocol=2)
u0 = cPickle.dumps(user)
print 'user size = ', sys.getsizeof(user), ', u size = ', sys.getsizeof(u), ', u0 size = ', sys.getsizeof(u0), ', user type = ', user.__class__.__name__
self.r.set(key, u)
print 'exists(key1) = ', self.r.exists(key)
loadData = self.r.get(key)
d = cPickle.loads(loadData)
print 'deckAll = ', d.get('deckAll'), ', type = ', d.__class__.__name__
============更新===============
我尝试了不用pickle,直接将查询到的数据set到Redis里,然后从中读取,但是读到的数据结果直接print看类型没错,但type其实不对,是str不是DEUser(我的数据类型):
代码:
q = leancloud.Query('DEUser')
key = '5a7f8747d50eee0042dab717'
user = q.get(key)
print 'user deckAll = ', user.get('deckAll'), 'user = ', user, ', type = ', user.__class__.__name__
self.r.set(key, user)
print 'exists(key) = ', self.r.exists(key)
loadData = self.r.get(key)
print 'loadData = ', loadData, ', type = ', loadData.__class__.__name__
print 'deckAll = ', loadData.get('deckAll')
输出:
STDOUT web1 23:57:05
user deckAll = [u'5a82a7dd128fe1003799fd44', u'5a82ab299f54544d44178f45', u'5a82ac079f54544d44179512', u'5a82ae64fe88c200385329fc', u'5a82d7e69f54544fd1453da7', u'5a82dde39f545441043aa7c6', u'5a82e0cf128fe100379b9c3c', u'5a82e1409f54544fd1459fdc', u'5a82e1d09f545441043ad20d', u'5a82e301756571003c81e5d3', u'5a82e3539f545441043ae226', u'5a82e3dc128fe100379bbdd5', u'5a82e5949f54544d44194a66', u'5a82e6179f545441043afe44', u'5a82e647ee920a004468a9f2', u'5a82e71e9f545441043b078d', u'5a82e7af9f545441043b0e0f', u'5a82e7f3fe88c2003854e746', u'5a82e950ac502e00327ea4a8', u'5a82e98cd50eee0042ed8c41'] user = <leancloud.object_.DEUser object at 0x7ff00799fdd0> , type = DEUser
STDOUT web1 23:57:05
exists(key) = True
STDOUT web1 23:57:05
loadData = <leancloud.object_.DEUser object at 0x7ff00799fdd0> , type = str
STDERR web1 23:57:05
Traceback (most recent call last):
STDERR web1 23:57:05
File "/opt/pyenv/versions/2.7.13/lib/python2.7/site-packages/leancloud/engine/leanengine.py", line 128, in dispatch_request
STDERR web1 23:57:05
result = {'result': dispatch_cloud_func(self.cloud_codes, app_params, decode_object=False, **values)}
STDERR web1 23:57:05
File "/opt/pyenv/versions/2.7.13/lib/python2.7/site-packages/leancloud/engine/leanengine.py", line 222, in dispatch_cloud_func
STDERR web1 23:57:05
result = func(**params)
STDERR web1 23:57:05
cache.test()
STDERR web1 23:57:05
File "/home/leanengine/app/cacheModule.py", line 34, in test
STDERR web1 23:57:05
print 'deckAll = ', loadData.get('deckAll')
STDERR web1 23:57:05
AttributeError: 'str' object has no attribute 'get'