使用redis实现自动补全与热门搜索排序功能

一、使用zset实现自动补全功能

redis的zset(有序集合)是一个带有分值的集合数据类型,集合中的数据唯一,并且当分值相同时会默认按字典序进行排序,同时,可以使用zrank查询某一成员所在位置,并使用zrange查询该位置及之后某一段空间内的数个成员。所以我们可以利用这个特性来实现自动补全功能。

1.分词存入

将我们需要进行提示的文本切分后存入zset中

# text=auto
zadd auto 0 a
zadd auto 0 au
zadd auto 0 aut
zadd auto 0 auto$
zrange auto 0 -1
1) "a"
2) "au"
3) "aut"
4) "auto$"

其中最后一个auto成员添加$标记,表示此为需要输出的文本

2.查询提示

当我们输入待补全的文本后,使用zrank进行查询成员位置,并使用zrange取出之后的x(根据实际情况调整)个成员,循环过滤出所有带有$结尾的成员

# query=a
zrank auto a 
0
zrange auto 0 100
1) "a"
2) "au"
3) "aut"
4) "auto$"

for k in res:
   if k.endswith('$'):
     keys.add(k)

print(keys)
["auto$"]

如此一来,我们就可以获取到一个结果为auto的输出列表。实现文件的自动补全功能。

二、使用zset实现热搜排序

同样的,由于有序集合的分值系统,且支持按分值排序,我们还可以使用它完成热搜排序功能

zincrby hot 1 auto
zincrby hot 1 hot
zincrby hot 1 auto
zrevrange hot 0 -1 withscores

1) "auto"
2) "2"
3) "hot"
4) "1"

这里我们使用到了两个新命令,zincrby设置成员score增量值,如不存在则新建,zrevrange与zrange一样可获取指定位置区间的值,不同的是按分值由大到小排序

发表回复