分享技术 · 探索极限 · Code is Art
数据库 发布 2022-07-01 634 阅读 约 2 分钟阅读

使用 Redis ZSET 实现自动补全与热门搜索排序

利用 Redis ZSET 的字典序和分值排序能力,实现搜索自动补全与热门搜索排行榜。

一、使用 ZSET 实现自动补全

Redis 的 ZSET 是带分值的集合类型,成员唯一。当分值相同时,Redis 会默认按字典序排序。利用 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$"

2. 查询提示

输入待补全文本后,先用 zrank 定位,再用 zrange 获取后续一段成员,最后过滤出以 $ 结尾的完整词。

# query=a
zrank auto a
0
zrange auto 0 100

1) "a"
2) "au"
3) "aut"
4) "auto$"
keys = set()

for key in res:
    if key.endswith("$"):
        keys.add(key)

print(keys)
# {"auto$"}

这样就可以得到结果为 auto 的输出列表,实现文本自动补全。

二、使用 ZSET 实现热门搜索排序

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 增量值,不存在则新建;zrevrangezrange 类似,但按分值由大到小排序。

发表回复