redis 的 spop 方法和 lpop 方法的性能差别为何如此巨大 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
llzzll1234
V2EX    Redis

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

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

    需求背景大致就是需要从一堆数据中随机取出一定数量的值。 目前做了两种测试: 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)的复杂度,考虑了首次获取连接的时间吗
    leon0318
        4
    leon0318  
       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 &nbs;
    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     Solana     859 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 21:12 PVG 05:12 LAX 13:12 JFK 16:12
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86