【Redis】redis 存储的列表如何分页和检索

ops/2025/2/9 14:00:53/

博主介绍:✌全网粉丝22W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌

技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等设计与开发。

感兴趣的可以先关注收藏起来,在工作中、生活上等遇到相关问题都可以给我留言咨询,希望帮助更多的人。

redis 存储的列表如何分页和检索

  • 一、Redis 列表的基本操作
  • 二、分页实现
  • 三、检索实现
    • 3.1 方法 1:客户端过滤
    • 3.2 方法 2:使用 Redis 的 SCAN 命令(适用于大数据量)
  • 四、分页 + 检索结合
  • 五、性能优化建议
  • 六、总结

在 Redis 中,列表(List)是一种有序的数据结构,通常用于存储一系列元素。由于列表是有序的,可以通过索引来访问元素,因此可以很方便地实现分页和检索功能。

以下是 Redis 列表的分页和检索的实现方法:

一、Redis 列表的基本操作

在实现分页和检索之前,先回顾一下 Redis 列表的常用命令:

  • LPUSH key value: 在列表左侧插入一个元素。

  • RPUSH key value: 在列表右侧插入一个元素。

  • LRANGE key start stop: 获取列表中指定范围的元素(闭区间)。

  • LLEN key: 获取列表的长度。

  • LINDEX key index: 获取列表中指定索引的元素。

二、分页实现

Redis 的 LRANGE 命令可以用于分页。假设每页显示 pageSize 条数据,当前页为 page,则分页的逻辑如下:

  • 起始索引: start = (page - 1) * pageSize

  • 结束索引: end = start + pageSize - 1

示例代码

import redis.clients.jedis.Jedis;
import java.util.List;public class RedisListPagination {public static void main(String[] args) {// 连接 RedisJedis jedis = new Jedis("localhost", 6379);// 列表的 keyString key = "myList";// 每页显示的数量int pageSize = 5;// 当前页码(从 1 开始)int page = 2;// 计算分页的起始和结束索引int start = (page - 1) * pageSize;int end = start + pageSize - 1;// 使用 LRANGE 获取分页数据List<String> pageData = jedis.lrange(key, start, end);// 输出分页结果System.out.println("第 " + page + " 页数据: " + pageData);// 关闭连接jedis.close();}
}

三、检索实现

Redis 列表本身不支持直接的条件检索(如 SQL 中的 WHERE 语句),但可以通过以下方式实现检索:

3.1 方法 1:客户端过滤

使用 LRANGE 获取整个列表或分页数据,然后在客户端代码中进行过滤。

示例代码

import redis.clients.jedis.Jedis;
import java.util.List;
import java.util.stream.Collectors;public class RedisListSearch {public static void main(String[] args) {// 连接 RedisJedis jedis = new Jedis("localhost", 6379);// 列表的 keyString key = "myList";// 获取整个列表List<String> allData = jedis.lrange(key, 0, -1);// 在客户端进行过滤(例如:查找包含 "foo" 的元素)List<String> result = allData.stream().filter(item -> item.contains("foo")).collect(Collectors.toList());// 输出检索结果System.out.println("检索结果: " + result);// 关闭连接jedis.close();}
}

3.2 方法 2:使用 Redis 的 SCAN 命令(适用于大数据量)

如果列表数据量非常大,可以使用 SCAN 命令逐步遍历列表并进行过滤。

四、分页 + 检索结合

如果需要同时支持分页和检索,可以先在客户端进行过滤,然后对过滤后的结果进行分页。

示例代码:

import redis.clients.jedis.Jedis;
import java.util.List;
import java.util.stream.Collectors;public class RedisListPaginationAndSearch {public static void main(String[] args) {// 连接 RedisJedis jedis = new Jedis("localhost", 6379);// 列表的 keyString key = "myList";// 获取整个列表List<String> allData = jedis.lrange(key, 0, -1);// 在客户端进行过滤(例如:查找包含 "foo" 的元素)List<String> filteredData = allData.stream().filter(item -> item.contains("foo")).collect(Collectors.toList());// 分页参数int pageSize = 5;int page = 2;// 计算分页的起始和结束索引int start = (page - 1) * pageSize;int end = Math.min(start + pageSize, filteredData.size());// 获取分页数据List<String> pageData = filteredData.subList(start, end);// 输出分页结果System.out.println("第 " + page + " 页数据: " + pageData);// 关闭连接jedis.close();}
}

五、性能优化建议

  • 数据量较大时:

避免一次性获取整个列表(如 LRANGE key 0 -1),可以使用分步遍历(如 SCAN 命令)。

如果检索条件复杂,可以考虑使用 Redis 的其他数据结构(如 Sorted Set)或结合外部存储(如 Elasticsearch)。

  • 频繁检索时:

可以将列表数据同步到其他支持高效检索的存储中(如数据库或搜索引擎)。

  • 分页时:

如果列表数据量较大,尽量避免频繁分页操作,可以通过缓存分页结果来提高性能。

六、总结

  • 分页: 使用 LRANGE 命令实现分页。

  • 检索: 在客户端进行过滤,或使用 SCAN 命令逐步遍历。

  • 结合分页和检索: 先过滤,再对过滤后的结果进行分页。

  • 性能优化: 对于大数据量或复杂检索场景,考虑使用其他数据结构或外部存储。

通过以上方法,可以高效地实现 Redis 列表的分页和检索功能。


好了,今天分享到这里。希望你喜欢这次的探索之旅!不要忘记 “点赞” 和 “关注” 哦,我们下次见!🎈

本文完结!

祝各位大佬和小伙伴身体健康,万事如意,发财暴富,扫下方二维码与我一起交流!!!在这里插入图片描述


http://www.ppmy.cn/ops/156989.html

相关文章

PCDN 搭建的常见问题与答疑

一&#xff0e;PCDN基本概念与原理 Q1: 什么是PCDN&#xff1f; A1: PCDN是一种基于P2P&#xff08;Peer-to-Peer&#xff09;技术的内容分发网络&#xff0c;通过利用用户终端设备的空闲资源和带宽&#xff0c;实现内容的快速分发和共享。它能够在不增加服务器负载的情况下&…

【RabbitMQ重试】重试三次转入死信队列

以下是基于RabbitMQ死信队列实现消息重试三次后转存的技术方案&#xff1a; 方案设计要点 队列定义改造&#xff08;核心参数配置&#xff09; Bean public Queue auditQueue() {Map<String, Object> args new HashMap<>();args.put("x-dead-letter-exchan…

本地缓存 Caffeine 中的时间轮(TimeWheel)是什么?

大家好&#xff0c;我是 方圆。在前文 缓存之美&#xff1a;万文详解 Caffeine 实现原理 中&#xff0c;我们详细介绍了 Caffeine 缓存添加元素和读取元素的流程&#xff0c;并详细解析了配置固定元素数量驱逐策略的实现原理。在本文中我们将主要介绍 配置元素过期时间策略的实…

opencv打开摄像头出现读取帧错误问题

打不开摄像头原因&#xff1a; 手动开启一下&#xff0c;右下角摄像头亮了说明开启了 读取帧错误原因&#xff1a; usb协议错了导致画质损坏&#xff0c;调成3.1即可解决

docker多个容器的相互通信

在同一台宿主机上运行多个 Docker 容器时&#xff0c;容器之间可以通过以下几种方式实现通信&#xff1a; 1. 使用 Docker 默认网络&#xff08;Bridge 网络&#xff09; Docker 默认会为每个容器分配一个 bridge 网络&#xff0c;容器可以通过 IP 地址或容器名称互相通信。 …

大模型Dense、MoE 与 Hybrid-MoE 架构的比较

在大模型架构设计中&#xff0c;Dense&#xff08;全连接&#xff09;、MoE&#xff08;混合专家&#xff09;和Hybrid-MoE&#xff08;混合式MoE&#xff09;是三种主流的参数组织方式&#xff0c;它们在模型容量、计算效率和应用场景上存在显著差异。以下从核心原理、技术特点…

使用服务器部署DeepSeek-R1模型【详细版】

文章目录 引言deepseek-r1IDE或者终端工具算力平台体验deepseek-r1模型总结 引言 在现代的机器学习和深度学习应用中&#xff0c;模型部署和服务化是每个开发者面临的重要任务。无论是用于智能推荐、自然语言处理还是图像识别&#xff0c;如何高效、稳定地将深度学习模型部署到…

21.2.7 综合示例

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 【例 21.7】【项目&#xff1a;code21-007】填充职员表并打印。 本例使用到的Excel文件为&#xff1a;职员信息登记表.xlsx&#x…