V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Feiox
V2EX  ›  程序员

为什么现在高级语言内置的数据结构非常高效,但还要使用 Redis 这类(不开持久化)的缓存?

  •  
  •   Feiox ·
    feiox · 2015-09-17 16:26:29 +08:00 · 3886 次点击
    这是一个创建于 3136 天前的主题,其中的信息可能已经有所发展或是发生改变。

    R.T

    我在比较慢的 CPython 中建立一个一千万的集合用时 1.1s ,做一千万次查找用时 1.4s ,
    但使用 redis-benchmark 跑测试却只能达到 12w 每秒的速度。
    (测试用机: 2015 高配 Macbook Pro 15 )

    所以,对于那些只是单机跑的小应用来说,还有必要使用 Redis 这类的缓存吗?

    messense
        1
    messense  
       2015-09-17 16:33:31 +08:00   ❤️ 1
    方便跨进程共享数据。
    maemual
        2
    maemual  
       2015-09-17 16:37:38 +08:00
    1 、单机跑的小应用本来就是少数
    2 、不开持久化的 Redis 又是少数
    加上这么些限制条件之后,只能说,嗯,在你的设想下是不需要用 Redis 了。
    wayne712
        3
    wayne712  
       2015-09-17 16:41:31 +08:00
    redis 如果作为缓存使用的话 , 缓存当然还可以设置过期时间了, 而内置数据的话本身并不带这样的功能吧
    learnshare
        4
    learnshare  
       2015-09-17 16:47:34 +08:00
    语言无关,可共享
    Feiox
        5
    Feiox  
    OP
       2015-09-17 16:52:54 +08:00
    @learnshare @wayne712 @maemual @messense 那为什么这些语言实现的如此快,而 Redis 要差两个数量级呢?
    aisk
        6
    aisk  
       2015-09-17 16:54:26 +08:00
    除了上述需要考虑分布式环境 / 持久化的原因之外,如果直接在内存里保存大量的数据结构,在某些带 GC 的语言里,会导致 GC 速度大大降低。不过也看实现了。

    另外如果自己申请大段内存做序列化实现的话,可以避免这个问题,但是实现复杂度会大大增加。
    aisk
        7
    aisk  
       2015-09-17 16:55:35 +08:00
    @Feiox 还要考虑网络开销,这个是大头。另外你用 Python 客户端再往里面添加复杂对象,序列化也是很大的开销。另外 redis 还会帮你压缩内存,这也是开销。
    zts1993
        8
    zts1993  
       2015-09-17 16:57:59 +08:00
    多线程?线程安全么?
    xiaolee59
        9
    xiaolee59  
       2015-09-17 17:00:45 +08:00
    高内聚,低耦合,生产环境下服务都是分层的,数据就应该在数据那一层,业务只需要关心逻辑实现,全部用原生数据结构,那么你的服务进程过了,你的数据也就没了?而且百分之百找不回来?
    ljbha007
        10
    ljbha007  
       2015-09-17 17:14:23 +08:00
    大多数情况生产环境都不只一台机器 /一个进程 你内存里的数据结构虽然快 但是没办法横向扩展 没办法分布式同步数据 如果你自己实现的话开发成本会飙升 然而 redis 本来解决了这个问题 为什么不用呢
    maemual
        11
    maemual  
       2015-09-17 17:39:30 +08:00
    @Feiox 因为存到 Redis 里的,有大量的网络开销,大量的序列化开销啊。。。
    shiny
        12
    shiny  
       2015-09-17 17:42:21 +08:00
    这种 benchmark 不能反映生产环境上的真实情况
    assassinpig
        13
    assassinpig  
       2015-09-17 20:47:55 +08:00
    万一需要开持久呢?
    msg7086
        14
    msg7086  
       2015-09-17 21:06:34 +08:00
    只开一个进程一个线程的话,自然不需要开的。
    问题是这情况实在太少了。
    akira
        15
    akira  
       2015-09-17 21:50:10 +08:00
    单机跑的小应用 用内存缓存干嘛,人家本来就不是设计给这个场景用的
    adrianzhang
        16
    adrianzhang  
       2015-09-17 21:55:12 +08:00
    为了分布式。单机小应用用不着。
    llhhss
        17
    llhhss  
       2015-09-17 23:30:11 +08:00
    小应用要不要缓存都得先看看
    chenwen
        18
    chenwen  
       2015-09-17 23:41:40 +08:00
    就算是是单机小应用,用内存缓存,你不用考虑缓存持久化得问题么
    zoul
        19
    zoul  
       2015-09-17 23:53:14 +08:00
    分布式,水平扩展,缓存服务化
    gamexg
        20
    gamexg  
       2015-09-18 07:13:14 +08:00 via Android
    即使是 python web 小应用也不会是单进程的啊。
    跨进程共享最好上专业缓存。
    Redis 对于一些操作可以保证原子。

    Python 进程内当然比 Redis 网络通信快。
    nezhazheng
        21
    nezhazheng  
       2015-09-18 10:38:16 +08:00
    如果你需要缓存的数据非常少,比如小于 50M ,如果你的应用只是单进程,那么肯定是没必要用 Redis 的
    nezhazheng
        22
    nezhazheng  
       2015-09-18 10:40:35 +08:00
    回答你的另一个问题,速度差异。
    进程内的内存读取与网络读取的速度差距比你上面给出的数据要来的大的多。
    你可以网上搜一下,有张非常著名的图标注了各种读取的延时。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5724 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 01:58 · PVG 09:58 · LAX 18:58 · JFK 21:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.