关于redis模糊匹配的问题

关于redis模糊匹配的问题

前言:

由于涉及到了模糊匹配,怕存在工作中的误导倾向,在此特定说明,线上代码一定不能使用keys去做模糊匹配,最好是用match,具体原因请自行百度

背景:

# 一次设置 6 个 key
redis> MSET one 1 two 2 three 3 four 4 a10a 5 a9a 6  
OK

# 对指定标识前后字符进行匹配
redis> KEYS *o*
1) "four"
2) "two"
3) "one"

redis> KEYS *hr*
1) "three"
 
# 单个字符占位
redis> KEYS t?? 
1) "two"
 
# 匹配数据库内所有满足[]的 key ([]中的值网上说的五花八门,经本人测试,其实就是ASCII码范围,例如[10-20]这样是匹配不到a10a的,也就是说[]不能表达数值范围)
redis> KEYS a[10-20]* 
无结果

redis> KEYS a[1-9]* 
1) "a9a"

redis> KEYS t[w]* 
1) "two"

# 匹配数据库内所有 key
redis> KEYS * 
1) "a9a"
2) "a10a"
3) "four"
4) "three"
5) "two"
6) "one"

问题说明:

经过上述简单了解,我们发现redis 的模糊匹配并不能很好的支持字符串的匹配,什么意思呢?

例如:

我们现在有这些key 他们都丢在队列中

1#WX002bcd

1#WX001abc

3#WX004oop

2#WX003erd

2#WX003ccf

3#WX004ppi

加入程序中根据逻辑判断之后,我现在只需要取到含有WX001和WX003的key,这下会发现有点无法下手

#redis的keys并不支持类似这样操作
KEYS *#[WX001,WX003]*

目前本人的临时处理方案是,通过判断之后将对应的keys匹配正则放入到一个list中,例如:

//举例集合
List<String> pattens = new ArrayList<>(Arrays.asList("*#WX001*","*#WX003*"));
//对应实现
List<ZSetOperations.TypedTuple<String>> resultList = new ArrayList<>();
for(String patten : pattens){
  Cursor<ZSetOperations.TypedTuple<String>> scan = bound.scan(ScanOptions.scanOptions().match(patten).build());
  while(scan.hasNext){
    resultList.add(scan.next);
  }
}

然后对list做遍历处理,依次进行scan操作匹配到对应key,然后将其填入到我需要返回的对象中去,这种做法看上去似乎有点蠢,不知道有没有高人能指点一番

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值