摸清数据规模,即问清楚边界
KEYS pattern:查找所有符合给定模式pattern的key eg: keys a* 找出所有以a开头的key
eg:scan 0 match *a count 10 从游标为0
下面提供两个我自己包装的scan,一个是hash里模糊取key,另外一个是直接string key的模糊取
@Override
@SuppressWarnings("unchecked")
public <T> Map<String, T> hScan(String key, String pattern) {
final Map<String, T> scanResult = Maps.newHashMap();
try (Cursor<Map.Entry<Object, Object>> cursor = template.opsForHash().scan(key, ScanOptions.scanOptions()
.count(Integer.MAX_VALUE)
.match(pattern)
.build())) {
while (cursor.hasNext()) {
final Map.Entry<Object, Object> entry = cursor.next();
scanResult.put(String.valueOf(entry.getKey()), (T) entry.getValue());
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return scanResult;
}
@Override
public Set<String> scan(String pattern) {
return template.execute((RedisCallback<Set<String>>) connection -> {
Set<String> keysTmp = Sets.newHashSet();
try (Cursor<byte[]> cursor = connection.scan(new ScanOptions.ScanOptionsBuilder()
.count(Integer.MAX_VALUE)
.match(pattern)
.build())) {
while (cursor.hasNext()) {
keysTmp.add(new String(cursor.next()));
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return keysTmp;
});
}