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

- 原文地址：https://www.kuddy.cn/archives/122
- 发布时间：2022-07-01 12:11:14
- 更新时间：2026-05-18 02:41:28
- 分类：数据库
- 标签：Redis

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