V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
geew
V2EX  ›  问与答

[redis]缓存性能

  •  
  •   geew · 2013-11-15 14:56:36 +08:00 · 3188 次点击
    这是一个创建于 3837 天前的主题,其中的信息可能已经有所发展或是发生改变。
    缓存做得不多, 之前是看的资料上说提高性能必须得做缓存.
    但在项目里用了缓存之后发现性能没有多大的提升, 有时候甚至比不用缓存还要差些?

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

    比如我缓存一个对象(字典):
    这样做的:
    # 存
    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存储对象的时候必须要编码吗?有些对象是不能直接存的. 取出来的值都是字符串, 必须解码才行?

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

    另外,cPickle、unicode、zip、base64等,这些编码解码的效率是很高的,不会是瓶颈的。我自己用了多年的Mac上,一秒钟都能处理过亿的字节...
    nybux
        4
    nybux  
       2013-11-15 15:41:04 +08:00
    缓存是相对与数据库来说的,你这对象是从数据库取的吗?
    sarowlwp
        5
    sarowlwp  
       2013-11-15 15:46:18 +08:00
    这是啥用法,把字典序列化到 redis,然后用的时候 取出来再 反序列化成字典?
    geew
        6
    geew  
    OP
       2013-11-15 15:48:21 +08:00
    @hepochen 有连接池, 没有每次连接的开销.现在发现的响应时间是使用缓存会比没有使用缓存满5ms左右,感觉有些奇怪
    geew
        7
    geew  
    OP
       2013-11-15 16:04:31 +08:00
    @nybux 是的
    geew
        8
    geew  
    OP
       2013-11-15 16:05:28 +08:00
    @sarowlwp 因为从redis取出来都是字符串. 之前有用过eval来进行对象还原, 但是有错误. 所以才用的序列化
    clino
        9
    clino  
       2013-11-15 16:19:16 +08:00
    @geew eval这种肯定不太好
    pickle对于不跨语言是好的选择
    如果要跨语言或者要可读性,可以用json,呵呵
    geew
        10
    geew  
    OP
       2013-11-15 16:31:24 +08:00
    @clino 试过json, 但是dump某些对象的时候会报错, 比如datetime.datetime
    sarowlwp
        11
    sarowlwp  
       2013-11-16 11:09:47 +08:00
    @geew 如果是字典的话,为什么不直接用redis的api,redis本身是支持字典存储的,建议楼主看看文档 http://redis.io
    geew
        12
    geew  
    OP
       2013-11-16 15:49:06 +08:00
    @sarowlwp 要是字典里面有其他的对象呢?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1949 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:17 · PVG 00:17 · LAX 09:17 · JFK 12:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.