jedis smembers使用风险及改造

背景

项目中使用redis的set集合存储业务数据,业务异常后需要恢复业务数据,此时使用smembers一次性将业务数据从set集合中取出来。

smembers使用代码如下:

Set<String> result = jedisCluster.smembers(redisKey);

风险评估

使用smembers从set集合中一次性取出所有数据存在以下风险:

1、redis是单线程的,如果一次性取出的数据太大,则用时会比较长,可能会堵塞整个实例;
2、代理会限制一次性获取的大小,默认限制大小是1M,如果取出的数据大于1M,则会导致一次性取不出来。

整改方案

使用sscan分批次从set集合中取出数据,sscan使用示例代码如下:

Set<String> result= new HashSet<>();
String cursor = ScanParams.SCAN_POINTER_START;
do {
    // scan类方法默认count为10
    ScanResult<String> scanResult= jedisCluster.sscan(redisKey, cursor);
    result.addAll(scanResult.getResult());
    cursor = scanResult.getStringCursor();
} while(!ScanParams.SCAN_POINTER_START.equals(cursor));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值