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 #连接超时时间(毫秒)