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时会达到一个平衡点,再大的话对效率影响甚微

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐