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

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值