Redis 从入门到精通之实现自动补全功能

本文涉及的产品
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
简介: Redis 可以很方便地实现自动补全功能,即根据用户输入的部分关键字,自动补全匹配的候选项。下面是一个使用 Redis 实现自动补全功能的示例,假设我们要实现一个搜索引擎的自动补全功能,根据用户输入的关键字,自动补全匹配的搜索词: 将搜索词存储到有序集合中:对于每个搜索词,可以将其拆分成多个前缀(prefix),然后将每个前缀作为有序集合的成员(member),并将搜索词的权重作为成员的分数(score)。例如,对于搜索词 "apple",可以将其拆分成 "a"、"ap"、"app"、"appl" 和 "apple" 这五个前缀,然后将它们分别作为有序集合的成员,权重设置为搜索词的权重。可以使

1.实现自动补全功能场景

Redis 可以很方便地实现自动补全功能,即根据用户输入的部分关键字,自动补全匹配的候选项。下面是一个使用 Redis 实现自动补全功能的示例,假设我们要实现一个搜索引擎的自动补全功能,根据用户输入的关键字,自动补全匹配的搜索词:

  1. 将搜索词存储到有序集合中:对于每个搜索词,可以将其拆分成多个前缀(prefix),然后将每个前缀作为有序集合的成员(member),并将搜索词的权重作为成员的分数(score)。例如,对于搜索词 "apple",可以将其拆分成 "a"、"ap"、"app"、"appl" 和 "apple" 这五个前缀,然后将它们分别作为有序集合的成员,权重设置为搜索词的权重。可以使用 Redis 的 ZADD 命令将前缀添加到有序集合中。

  2. 根据用户输入的关键字,从有序集合中取出匹配的前缀:对于用户输入的关键字,可以将其拆分成多个前缀,然后分别使用 ZRANGEBYLEX 命令取出有序集合中匹配的前缀。由于有序集合中的成员是按字典序排序的,因此可以使用 [min max] 形式的参数来指定搜索范围,例如,使用 [a (b" +")" 表示搜索所有以 "a" 开头并且以 "b" 结尾的前缀。

  3. 将匹配的前缀返回给用户:将匹配的前缀返回给用户,作为自动补全的候选项。可以使用 Redis 的 ZRANGE 命令来取出前 N 个匹配的前缀,其中 N 是自动补全的候选项数。

2.Java 和 Jedis 实现自动补全功能

2.1示例1

假设有序集合的键名为 "search:autocomplete"。对于每个搜索词,可以调用 addKeyword 方法将其拆分成前缀并添加到有序集合中,权重可以根据搜索词的热度来设置。对于用户输入的关键字,可以调用 autocomplete 方法从有序集合中取出匹配的前缀

import redis.clients.jedis.Jedis;
import java.util.Set;

public class AutocompleteExample {
   

    private static final int MAX_RESULTS = 10;

    public static Set<String> autocomplete(String prefix) {
   
        Jedis jedis = new Jedis("localhost");
        String min = prefix + "-";
        String max = prefix + "+";
        // 使用 ZRANGEBYLEX 命令取出匹配的前缀
        Set<String> prefixes = jedis.zrangeByLex("search:autocomplete", "[" + min, "[" + max, 0, MAX_RESULTS);
        return prefixes;
    }

    public static void addKeyword(String keyword, int weight) {
   
        Jedis jedis = new Jedis("localhost");
        for (int i = 1; i <= keyword.length(); i++) {
   
            String prefix = keyword.substring(0, i);
            // 使用 ZADD 命令将前缀添加到有序集合中
            jedis.zadd("search:autocomplete", weight, prefix);
        }
    }

}

2.2 示例2

实现的是将单词拆分成前缀,然后将前缀作为有序集合的成员,单词作为有序集合成员对应的分数。对于每个前缀,将匹配的单词按照分数从小到大排序,然后取出前 N 个作为自动补全的候选项。
2.使用有序集合保存输入结果:

ZADD word:a 0 apple 0 application 0 acfun 0 adobe
ZADD word:ap 0 apple 0 application
ZADD word:app 0 apple 0 application
ZADD word:appl 0 apple 0 application
ZADD word:apple 0 apple
ZADD word:appli 0 application

2.2.2 Jedis 示例:

import redis.clients.jedis.Jedis;
import java.util.Set;

public class AutocompleteExample {
   

    private static final int MAX_RESULTS = 10;

    public static Set<String> autocomplete(String prefix) {
   
        Jedis jedis = new Jedis("localhost");
        // 使用 ZRANGEBYSCORE 命令取出匹配的单词
        Set<String> words = jedis.zrangeByScore("word:" + prefix, 0, Double.POSITIVE_INFINITY, 0, MAX_RESULTS);
        return words;
    }

    public static void addWord(String word, int weight) {
   
        Jedis jedis = new Jedis("localhost");
        for (int i = 1; i <= word.length(); i++) {
   
            String prefix = word.substring(0, i);
            // 使用 ZADD 命令将单词添加到有序集合中
            jedis.zadd("word:" + prefix, weight, word);
        }
    }

}

有序集合的键名是 "word:" + 前缀。对于每个单词,可以调用 addWord 方法将其拆分成前缀并添加到有序集合中,权重可以根据单词的热度来设置。对于用户输入的前缀,可以调用 autocomplete 方法从对应的有序集合中取出匹配的单词。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
2月前
|
存储 NoSQL PHP
如何用Redis高效实现点赞功能?用Set?还是Bitmap?
在众多软件应用中,点赞功能几乎成为标配。本文从实际需求出发,探讨如何利用 Redis 的 `Set` 和 `Bitmap` 数据结构设计高效点赞系统,分析其优缺点,并提供 PHP 实现示例。通过对比两种方案,帮助开发者选择最适合的存储方式。
46 3
|
3月前
|
缓存 NoSQL Java
springboot的缓存和redis缓存,入门级别教程
本文介绍了Spring Boot中的缓存机制,包括使用默认的JVM缓存和集成Redis缓存,以及如何配置和使用缓存来提高应用程序性能。
133 1
springboot的缓存和redis缓存,入门级别教程
|
3月前
|
存储 消息中间件 NoSQL
Redis 入门 - C#.NET Core客户端库六种选择
Redis 入门 - C#.NET Core客户端库六种选择
77 8
|
3月前
|
缓存 分布式计算 NoSQL
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
41 2
|
3月前
|
SQL 分布式计算 NoSQL
大数据-42 Redis 功能扩展 发布/订阅模式 事务相关的内容 Redis弱事务
大数据-42 Redis 功能扩展 发布/订阅模式 事务相关的内容 Redis弱事务
34 2
|
3月前
|
缓存 NoSQL Java
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
90 2
|
5月前
|
NoSQL 安全 Java
Redis6入门到实战------ 三、常用五大数据类型(字符串 String)
这篇文章深入探讨了Redis中的String数据类型,包括键操作的命令、String类型的命令使用,以及String在Redis中的内部数据结构实现。
Redis6入门到实战------ 三、常用五大数据类型(字符串 String)
|
5月前
|
NoSQL 关系型数据库 Redis
Redis6入门到实战------ 九、10. Redis_事务_锁机制_秒杀
这篇文章深入探讨了Redis事务的概念、命令使用、错误处理机制以及乐观锁和悲观锁的应用,并通过WATCH/UNWATCH命令展示了事务中的锁机制。
Redis6入门到实战------ 九、10. Redis_事务_锁机制_秒杀
|
5月前
|
NoSQL Java Redis
Redis6入门到实战------ 八、Redis与Spring Boot整合
这篇文章详细介绍了如何在Spring Boot项目中整合Redis,包括在`pom.xml`中添加依赖、配置`application.properties`文件、创建配置类以及编写测试类来验证Redis的连接和基本操作。
Redis6入门到实战------ 八、Redis与Spring Boot整合