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

redis 的 spop 方法和 lpop 方法的性能差别为何如此巨大

  •  
  •   llzzll1234 · 2021-06-17 16:20:20 +08:00 · 2366 次点击
    这是一个创建于 1284 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求背景大致就是需要从一堆数据中随机取出一定数量的值。 目前做了两种测试: 1.将 N 个数据打乱后 lpush 进 redis,之后循环 lpop 。 2.N 个数据 sadd 进 redis,然后 spop 出 N 个值。

    写了一个测试方法,发现这两种的性能差距巨大,数据量几千上万的时候这很正常。 但是哪怕只取一个值,lpop 也需要 60ms,spop 只需要 4ms 。差别也很大。 所以这背后的性能差距在什么地方?

    后来我还试了 lindex 和 srandmember,也差不多要这么多时间。

    请各位大佬指教

    int batchSize = 1;
    long startTime = System.currentTimeMillis();
    for (int i = 0; i < batchSize; i++) {
            redisService.lpop(key);
    }
    System.out.println(System.currentTimeMillis() - startTime);
    
    long startTime2 = System.currentTimeMillis();
    redisService.spop(setKey,batchSize);
    System.out.println(System.currentTimeMillis() - startTime2);
    
    8 条回复    2021-06-18 10:38:11 +08:00
    shylockhg
        1
    shylockhg  
       2021-06-17 16:22:59 +08:00
    set 和 list 的区别
    llzzll1234
        2
    llzzll1234  
    OP
       2021-06-17 16:36:03 +08:00
    @shylockhg 知道是 set 和 list 的区别,但是就没理解到 set 的随机取值为什么会比链表的左出栈更快
    wbd31
        3
    wbd31  
       2021-06-17 17:42:13 +08:00   ❤️ 1
    没啥别,单取一个元素都是 O(1)的复杂度,考虑了首次获取连接的时间吗
    leonme
        4
    leonme  
       2021-06-17 18:53:18 +08:00 via iPhone
    好问题
    llzzll1234
        5
    llzzll1234  
    OP
       2021-06-17 19:16:17 +08:00
    @wbd31 被你点醒了,现在在第一次获取之前加了个 exists,然后再获取值,时间就正常了,1 条的情况下 lpop 和 spop 都是 2ms,多条的情况下 lpop 就时间大幅增加。
    应该就是首次获取链接的时间导致的问题,感谢。
    llzzll1234
        6
    llzzll1234  
    OP
       2021-06-17 19:21:38 +08:00
    @wbd31 那这么看来 jedis 的初始化是没有去做链接的吗?但是我记得在 springboot 启动的时候是会去链接 redis 检测是否成功的啊。
    ccde8259
        7
    ccde8259  
       2021-06-18 01:16:06 +08:00 via iPhone
    Jedis 用的 JedisPool 参数配置注意一下。
    spring.redis.jedis.pool 下有四个参数,分别是:
    max-idle
    min-idle
    max-active
    max-wait
    zdt3476
        8
    zdt3476  
       2021-06-18 10:38:11 +08:00
    看你代码是网络 IO 的问题啊。如果 LPOP 要批量,试试 PIPLINE ?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5907 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 06:18 · PVG 14:18 · LAX 22:18 · JFK 01:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.