由于对redis并不是太熟悉,今天遇到一个问题,不是太清楚应该怎么样处理更合适,另外也有一些疑问,期望牛牛们,可以帮忙一下,感谢了。
就是如果redis中一个list很大,即list里面存的数据很多。现在在Java代码中处理该list,那么Java中每次pop或者push的时候,都会需要一个新的链接吗?如果用类似LRANGE,那怎么样删掉已经取出来的数据呢?
或者如果对于redis中一个list很大的情况,要怎么样处理比较合适呢?
我真的不知道在哪里输入积分。真的不知道,我也不想发蛋贴的。我真的不知道呀。

解决方案 »

  1.   

    不太清楚具体场景, 处理list的场景频繁吗?  能否对list进行拆分。  不会存在每次操作这个list 需要新的链接,redis连接池可以设置, 其中的开销可以忽略不记。 而且你说的list很大 大概是多大,  写redis的时候可以压缩一下再存, 总之可操作的手段很多,需要根据实际情况来定
      

  2.   


    嗯,谢谢你的回复了。是今天面试的时候问到的呢。
    当时我说的场景是,list里面存放一些失败操作的用户id,然后会有定时作业去处理这个list
    面试官说, list如果很大,每次pop的时候不会占用连接吗?然后我就懵了,我也不知道呀。所以没有具体的业务场景,意思就是list里面的数据非常大。如果用连接池,每次pop的时候,是不是去连接池里面取连接呢,如果是的话,那还是每次pop操作都需要连接一次数据库,是这样的吗?
    我的疑问是,每次pop操作的时候,会不会连接一次redis。
      

  3.   

    我不明白这个场景下想问的是什么。 问连接池?还是redis本身处理数据,又或是list如何处理大量数据?
      

  4.   

    要不要加入我的Java群? 里面很多热心人帮你解答和分析哦。   群号:157797573  
      

  5.   

    面试官的意思可能是你的list可能会很大,处理可能需要非常频繁访问redis对应就可能会占用更多的链接,留给其他的就会少了。在业务量大的时候可能会导致连接池被耗尽。
      

  6.   

    如果用jedis的话,是会重新打开一个连接的,除非你自己写了个连接池或者说一直开一个连接,如果是用springdata-redis则不用考虑这个问题,因为redisTemplate是用连接池管理的。你说的其他方面没怎么看懂,不知道想问啥
      

  7.   

    嗯嗯,谢谢你了。
    他的意思应该就是list数据量很大的情况下,数据库连接问题。
    另一个问题就是,如果用类似lrange命令获取list的元素。因为pop每次就获取一个元素,并且在获取后在list中就删除了该元素。但是用lrange可以一次性获取很多,比如获取5个,但是lrange命令只是获取,并没有将获取的元素移出list队列。那要怎么样清空list呢。
      

  8.   

    嗯嗯,就是这个意思。
    除了用到数据库连接池。还有其他的优化方式或者处理方式吗?
    这能怎么优化?
    一是业务上的优化,不让频繁操作这个list
    二是做限流
      

  9.   

    是不是业务场景你没说清楚,是不是面试官想让你设计一个合理的redis的key,比如说按天拆分成很多个list,那样一个连接处理的数据就很少了,根本不需要考虑什么连接的问题了,业务场景不明确,随便说的