背景
项目中使用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));