python LeanCache的使用及cPickle相关问题

我计划用LeanCache做缓存。将存储服务的数据find或fetch到后,用cPickle序列化然后以objectId作为key存在Redis中。不同表的数据保存在同一个Redis实例中。

1 目前用cPickle序列化查询到的数据类会报错;若不用cPickle,直接保存查询到的数据类是存储成功的,但再取出来类型是有问题的。具体问题描述、代码、出错提示请见链接:

2 我对Redis和cPickle都没经验,请问是否推荐以上方案?我看到cPickle会将类中的函数也序列化,请问这样是否会导致因为fetch到的数据类实例中除了数据之外的其他函数也被序列化保存在了Redis中,从而占用了不必要的空间和序列化时间?

3 不同表的数据我想保存在一个Redis实例中,cPickle load的时候有没有办法知道数据的本来类型(在哪个表里)?(调用者当然是知道的,除了这个办法外有没有办法得知呢?不是__class__.__name__,而是想知道是哪个表的数据)

4 Redis调用set数据保存的时候,如果有多条要保存,是否建议用pipeline的方式(在云引擎云端的云函数里调用Redis)?如果是,那么以下方法是否正确的方式呢?
a 在deploy初期全局的地方先建立Redis链接:

import os
import redis

r = redis.from_url(os.environ.get("REDIS_URL_<实例名称>"))

b 每次需要存储或者读取,都执行一遍以下代码:

pipe = r.pipeline(transaction=True)
r.set('key1','value1')
data = r.get('key2')
pipe.execute()

请帮忙看一下这个问题,非常感谢!

抱歉 python 我不太了解, 我大概了解你的目的就是 key 为 id,缓存 vlaue 是查询的数据。

对,大家应该大都是这样使用LeanCache的吧,但是现在找不到相关文档或者相关讨论的帖子。可否烦请您邀请一位同事帮着看一下呢?现在春节加班,这个解决不了就完全没法推进,人多的时候很快服务器就崩了。谢谢!!

请问你的问题解决了吗

还没有 还在四处求救;我刚刚更新玩问题说明,最重要的是第一点,如果不解决,leancache现在没法用。 请问你也是遇到同样问题了吗?

对, 正在研究 , 你不用leancache影响大吗

不用Leancache,开发版服务器只能支撑1个用户玩大半天(没用缓存)。。。

你可以看看我第1点提到的那个帖子说明,不知道有没有帮助。我是自学的编程经验不丰富,也许你能看出来是哪里的问题~

那估计是cPickle出了问题, 你明天单独试试cPickle 序列化之后得到的内容是否正常(错误信息说的好像是decode解码问题)

现在是dumps那行就运行不下去了。我测试过自己写的其他类没问题,就是leancloud的数据那个类dumps就会这样。其实不用cPickle是可以set进redis里的,但是取出来之后我不知道怎么再弄成leancloud数据类。

看看那个类里有没有什么特殊数据类型不能序列化的

我不是很懂,分析不出来;但是看文档的时候看到了leancloud.Object类有dumps方法,是不是可以用这个做序列化后存储在Redis里;取出来之后再手动创建还原为leancloud.Objecct?

我觉得跟存不存Redis没什么关系 , 关键是这个类型 dumps 之后得来的串比如说是xxx, 可以写个单元测试把xxx反序列化成原本的类型能否成功。 根据你说的其他类型没问题,那么估计就是你这个类型里包含了什么特殊字段, 你想一下或者log出来看一看。 既然其他类型可以,问题应该不大

谢谢~ 我试一下。
我说的是第二个办法,就是不使用pickle也不用leancloud.Object类所带的dump进行序列化,查询到的类实例直接存在Redis里,然后再读取出来,这时虽然读出来了一个数据但是类型不太对。你可以看一下我帖子第1点的说明,给出来代码,非常简单。
存之前是<leancloud.object_.DEUser object at 0x7ff00799fdd0> , type = DEUser;存进去再读出来是<leancloud.object_.DEUser object at 0x7ff00799fdd0> , type = str

两个print代码一样,都是print 'loadData = ', loadData, ', type = ', loadData.__class__.__name__


这个帖子下面讨论的很详细了,也有了一些思路,你可以参考一下。

好的, 我看到了,这两天忙别的事情去了, 谢谢你