redis的hash存储scan()方法的坑

1、问题描述

运用redisTemplate的哈希存储数据(少量数据)时,需要匹配key获取全部键值对时,可以使用 Cursor<Map.Entry<String, Object>> cursor = redisTemplate.opsForHash().scan(key, ScanOptions.NONE);方法。但是该方法执行次数达到一定量时,就会卡主,导致获取数据失败。

2、问题原因

因为redisTemplate.opsForHash().scan(key, ScanOptions.NONE); 该方法是通过游标的方式获取键值对的,如何遍历完一次后,如果游标没有关闭,会导致连接会一直增长,连接数到达峰值后,则会停止工作。所以每次使用完游标后,都要对其进行关闭。

3、问题定位以及解决问题

下图为while(true) 里面需要从redisTemplate中获取键值对,使用了 redisTemplate.opsForHash().scan(key, ScanOptions.NONE); 方法,每次使用后,未关闭游标,导致while(true)不再执行。

在这里插入图片描述

在这里插入图片描述

下图修改为关闭游标,则while(true)不会停止工作。

在这里插入图片描述

如果在配置redis时,配置了其连接池的大小,则会直接把异常抛出来,就不用debug定位找异常处了。
配置:

redis:
    database: 0                         #Redis数据库索引(默认为0)
    host:                     #Redis服务器地址
    port: 6379                          #Redis服务器连接端口
    password:           #Redis服务器连接密码(默认为空)
    pool:
      max-active: 8 # 连接池最大连接数(使用负值表示没有限制)
      max-wait: 1 # 连接池最大阻塞等待时间(使用负值表示没有限制)
      max-idle: 8 # 连接池中的最大空闲连接
      min-idle: 0 # 连接池中的最小空闲连接
    timeout: 3000                       #连接超时时间(毫秒)
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值