当前位置: 首页 > article >正文

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

博主介绍:✌全网粉丝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) {
        // 连接 Redis
        Jedis jedis = new Jedis("localhost", 6379);

        // 列表的 key
        String 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) {
        // 连接 Redis
        Jedis jedis = new Jedis("localhost", 6379);

        // 列表的 key
        String 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) {
        // 连接 Redis
        Jedis jedis = new Jedis("localhost", 6379);

        // 列表的 key
        String 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.kler.cn/a/537509.html

相关文章:

  • 全程Kali linux---CTFshow misc入门(38-50)
  • LVGL4种输入设备详解(触摸、键盘、实体按键、编码器)
  • 【Ai】--- 可视化 DeepSeek-r1 接入 Chatbox(超详细)
  • C++单例模式
  • 使用Python实现PDF与SVG相互转换
  • OpenCV:特征检测总结
  • 【机器学习】超参数的选择,以kNN算法为例
  • 使用wireshark抓取python发起的https请求包
  • 海思的一站式集成环境Hispark Studio更新了
  • 机试题——第k大字母
  • 【stm32学习】STM32F103实操primary(FlyMCU)
  • 解锁 DeepSeek 模型高效部署密码:蓝耘平台全解析
  • Oracle中与 NLS(National Language Support,国家语言支持) 相关的参数
  • 【AI学习】关于 DeepSeek-R1的几个流程图
  • 使用 Docker 和 PM2 构建高并发 Node.js API 网关
  • 基于java的美食信息推荐系统的设计与实现(LW+源码+讲解)
  • Linux C++语言函数调用栈打印
  • MySQL 8.0.41安装教程(2025年2月8号)
  • Spring Boot和SpringMVC的关系
  • kafka消费端之消费者协调器和组协调器
  • 2023 Java 面试题精选30道
  • 【ROS2】【2025】Simulate a 6DoF Robotic Arm in Gazebo and ROS2
  • Vue 入门到实战 八
  • Oracle Database Free版本的各项许可限制
  • Windows 实用设置工具 v3.6.5:一键优化系统设置
  • TCP三次握手全方面详解