reids 对值/value的模糊搜索 scan

reids 对值/value的模糊搜索 scan

因为公司项目有个,搜用户名name获取对应用户uid的功能,所以才做了个这东西。老实说,reids对做val的搜索并不友好,正常情况下是做不到的,但因为项目有这样的需求,需要用到搜索,因为缓存都用了redis了,单为此功能去加个es进来,就感觉有点浪费,所以最终打算用key去实现这功能。


提示:以下是本篇文章正文内容,下面案例可供参考

一、实现原理

1.keys。这肯定都是第一想法,但很快就被否决了,因为项目要为长期以后打算,keys带来的redis阻塞及隐患,将会提前埋下,所以这个是不可取的。
2.相对于keys,有一个类似于keys的功能,scan方法基于游标读取,每次只获取一部分数据去匹配,所以用这个去做模糊匹配,消耗内存跟性能都很低是比较靠谱的。
3.但是无论是keys、还是scan,都是去根据key键来匹配的,按我们现在需求,搜索用户名(name)去匹配用户uid,明显设计不合理,例如两个张三,一个uid=10,另外一个uid=11,这时候就会出现
张三=>10
张三=>11
在redis赋值时候,张三会被重复覆盖。而且都是对所有key的遍历搜索,也不合理。
4.最终我是通过对scan,另外几个
SCAN 增量迭代当前数据库中的数据库键。
SSCAN 增量迭代集合键中的元素。
HSCAN 增量迭代哈希键中的键值对。
ZSCAN 增量迭代有序集合中的元素(包括元素成员和元素分值)。
通过上边分析,其实还都是围绕着key做匹配,还是存在覆盖问题。但是我思想想了一下,反正我就是做个uid,跟name搜索,我可以把uid、跟name一并存到集合里头,对集合里边的搜索不就得了吗?
5.最终思想就出来了,生成一个集合,将name、跟uid,以自己觉得合适的方式放到集合里边,最后再通过sscan去匹配出来,然后再拆分得出搜索出来的name,得出的uid。

二、实现步骤

1.建立集合

这边我是将 name_uid,用下划线的形式拼接进去的,为什么把name放前边,因为搜名字,肯定是把最近能匹配到的东西放前边比较好。

代码如下(示例):

> sadd ttt 张一_1 张二_2 张三_3 张四_4 李四_5 李五_6 陈四_7 陈五_8
8
> SMEMBERS ttt
张三_3
陈五_8
李四_5
陈四_7
李五_6
张一_1
张二_2
张四_4

2.做模糊匹配

代码如下(示例):

> sscan ttt 0 match 张*_*
0
张三_3
张一_1
张二_2
张四_4
> sscan ttt 0 match **_*
0
张三_3
张一_1
张二_2
张四_4
> sscan ttt 0 match **_*
0
张三_3
> sscan ttt 0 match **_*
0
李四_5
张四_4
陈四_7

3.获取uid

这样就可以获取到匹配到的name,然后通过业务代码拆分去得取相应的uid。


总结

这里只是给出一个思路,去解决问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值