一、使用 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 增量值,不存在则新建;zrevrange 与 zrange 类似,但按分值由大到小排序。