[redis]缓存性能

2013-11-15 14:56:36 +08:00
 geew
缓存做得不多, 之前是看的资料上说提高性能必须得做缓存.
但在项目里用了缓存之后发现性能没有多大的提升, 有时候甚至比不用缓存还要差些?

是我的使用方法有问题吗还是??

比如我缓存一个对象(字典):
这样做的:
# 存
conn = redis.Redis(**kwargs)
redis_data = cPickle.dumps(data)
conn.set(key, redis_data)

# 取
redis_data = conn.get(key)
data = cPickle.loads(redis_data)

这样的存取增加了一个中间的编码解码的过程, 感觉这一过程是可以替换的吧, 但是用什么替换呢?
redis存储对象的时候必须要编码吗?有些对象是不能直接存的. 取出来的值都是字符串, 必须解码才行?

怎么才是正确的使用方法呢??
3196 次点击
所在节点    问与答
12 条回复
clino
2013-11-15 15:30:53 +08:00
用pickle我觉得是合适的做法,因为比如在python,数据是以python内部数据的方式存在的,在序列化之前是无法转给其他程序/进程处理的
geew
2013-11-15 15:38:18 +08:00
@clino 但是pickle dumps和loads会消耗一定的时间
hepochen
2013-11-15 15:38:45 +08:00
是每次存取都新建了一个连接还是使用连接池的?如果是前者,每次新建TCP连接是有系统开销的。

另外,cPickle、unicode、zip、base64等,这些编码解码的效率是很高的,不会是瓶颈的。我自己用了多年的Mac上,一秒钟都能处理过亿的字节...
nybux
2013-11-15 15:41:04 +08:00
缓存是相对与数据库来说的,你这对象是从数据库取的吗?
sarowlwp
2013-11-15 15:46:18 +08:00
这是啥用法,把字典序列化到 redis,然后用的时候 取出来再 反序列化成字典?
geew
2013-11-15 15:48:21 +08:00
@hepochen 有连接池, 没有每次连接的开销.现在发现的响应时间是使用缓存会比没有使用缓存满5ms左右,感觉有些奇怪
geew
2013-11-15 16:04:31 +08:00
@nybux 是的
geew
2013-11-15 16:05:28 +08:00
@sarowlwp 因为从redis取出来都是字符串. 之前有用过eval来进行对象还原, 但是有错误. 所以才用的序列化
clino
2013-11-15 16:19:16 +08:00
@geew eval这种肯定不太好
pickle对于不跨语言是好的选择
如果要跨语言或者要可读性,可以用json,呵呵
geew
2013-11-15 16:31:24 +08:00
@clino 试过json, 但是dump某些对象的时候会报错, 比如datetime.datetime
sarowlwp
2013-11-16 11:09:47 +08:00
@geew 如果是字典的话,为什么不直接用redis的api,redis本身是支持字典存储的,建议楼主看看文档 http://redis.io
geew
2013-11-16 15:49:06 +08:00
@sarowlwp 要是字典里面有其他的对象呢?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/89400

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX