redisTemplate使用scan进行模糊查询
scan的使用
·
scan和keys两个命令都是模糊查询,最大的区别就是keys会阻塞,而scan不会阻塞,具体的区别可参考以下文章
https://blog.csdn.net/weixin_42975911/article/details/120770712
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ScanOptions;
import java.util.HashSet;
import java.util.Set;
@Autowired
private RedisTemplate redisTemplate;
public Set<String> scan(String pattern) {
Set<String> keySet = (Set<String>) redisTemplate.execute((RedisCallback<Set<String>>) connection -> {
Set<String> keysTemp = new HashSet<>();
Cursor<byte[]> cursor = connection.scan(ScanOptions.scanOptions().match(pattern).count(10000).build());
while (cursor.hasNext()) {
keysTemp.add(new String(cursor.next()));
}
return keysTemp;
});
return keySet;
}
关于count的大小,对查询的速率也有一定影响,scan是一个基于游标的迭代器,每次都拿出对应的条数的key,返回以后再去拿下一次,这就意味着会进行多次通讯,受网速和机器性能的影响,通讯的时长都是不一样的。
这就可以得出结论:增加查询的条数就意味着每次查询时长变长,但是通讯次数变少;减少查询的条数就意味着查询时长变短,但是通讯次数变多。
所以count和搜索的效率之间存在着一定的联系,查阅了相关的资料后得到一个count值与搜索效率的曲线,大概是在count值为10000时会达到一个平衡点,再大的话对效率影响甚微
更多推荐
已为社区贡献1条内容
所有评论(0)