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,然后将其填入到我需要返回的对象中去,这种做法看上去似乎有点蠢,不知道有没有高人能指点一番
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhfhhkfg
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13