我们在实际开发中,会遇到在redis中模糊查询匹配的键值需求。主要有两种方式,第一:KEYS pattern 第二:SCAN
但是第一种方式的时间复杂度为O(N),其中N为数据库中密钥的数目。简单介绍下他的用法
一.KEYS pattern
Keys * // 遍历当前数据库中所有的key
Keys *xx // 匹配以xx结尾的key
Keys *xx* // 匹配字段中含有xx的字段
Keys xx* // 匹配以xx开头的key
官方对该命令的说明:将KEYS视为命令,仅应在生产环境中格外小心使用。在大型数据库上执行时,可能会破坏性能。此命令用于调试和特殊操作,例如更改键空间布局。不要在常规应用程序代码中使用KEYS
二.SCAN的介绍及使用
Scan的时间复杂度为O(1),使用该命令完全不用考虑数据量的大小以及查询效率。
1.Scan及相关命令
SCAN:迭代当前选择的Redis数据库中的密钥集
SSCAN:迭代Sets类型的元素。
HSCAN:迭代Hash类型的字段及其关联的值
ZSCAN:迭代排序集类型及其相关分数的元素
上面的四条命令,可以说是能查询redis数据库中所有类型结构数据。
SCAN,SSCAN,HSCAN和ZSCAN的工作方式都非常相似
下面以JAVA语言为基础,主要介绍SCAN的使用
2.SCAN的使用
1.导入pom依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
2.语法介绍
SCAN是基于游标的迭代器。这意味着在每次调用该命令时,服务器都会返回一个更新的游标,用户需要将该游标用作下一个调用中的游标参数。游标设置为0时,迭代将开始,服务器返回的游标为0时,迭代将终止
SCAN cursor [MATCH pattern] [COUNT count]
cursor:初始设为0
MATCH :<返回和给定模式相匹配的元素>
COUNT:每次查询数量
SSCAN 命令、 HSCAN 命令和 ZSCAN 命令的第一个参数总是一个数据库键
实例:
scan 0 match phone* count 20 //每次查询20个数据库中key字段中以phone开头的
sscan myset 0 match color* count 30 //每次查询30个myset(set)中key字段中以color开头的
3.代码实例
public static void main(String[] args) {
// 初始化Jedisl连接实例
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(8);
JedisPool jedisPool = new JedisPool(jedisPoolConfig,host,port,timeout,password,database);
Jedis jedis = jedisPool.getResource();
// 查询条件
ScanParams scanParams = new ScanParams();
scanParams.count(100);
scanParams.match("huawei*");
// 这一步很精髓 构造一个“”的游标
String cursor = "";
while(!cursor.equals("0")){
ScanResult<String> scan = jedis.scan(cursor,scanParams);
// 如果需要使用 sscan zscan hscan
// jedis.sscan(key,cursor,scanParams);
cursor = scan.getStringCursor();
List<String> result = scan.getResult();
// 下面是你自己代码逻辑
}
}