【Redis】redis 存储的列表怎样分页和检索

鼠扑  金牌会员 | 2025-2-21 05:12:22 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 918|帖子 918|积分 2754

博主介绍:✌全网粉丝22W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌
  技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等筹划与开发。
  感兴趣的可以先关注收藏起来,在工作中、生存上等遇到相关问题都可以给我留言咨询,希望资助更多的人。
  
  
在 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
示例代码
  1. import redis.clients.jedis.Jedis;
  2. import java.util.List;
  3. public class RedisListPagination {
  4.     public static void main(String[] args) {
  5.         // 连接 Redis
  6.         Jedis jedis = new Jedis("localhost", 6379);
  7.         // 列表的 key
  8.         String key = "myList";
  9.         // 每页显示的数量
  10.         int pageSize = 5;
  11.         // 当前页码(从 1 开始)
  12.         int page = 2;
  13.         // 计算分页的起始和结束索引
  14.         int start = (page - 1) * pageSize;
  15.         int end = start + pageSize - 1;
  16.         // 使用 LRANGE 获取分页数据
  17.         List<String> pageData = jedis.lrange(key, start, end);
  18.         // 输出分页结果
  19.         System.out.println("第 " + page + " 页数据: " + pageData);
  20.         // 关闭连接
  21.         jedis.close();
  22.     }
  23. }
复制代码
三、检索实现

Redis 列表自己不支持直接的条件检索(如 SQL 中的 WHERE 语句),但可以通过以下方式实现检索:
3.1 方法 1:客户端过滤

利用 LRANGE 获取整个列表或分页数据,然后在客户端代码中进行过滤。
示例代码
  1. import redis.clients.jedis.Jedis;
  2. import java.util.List;
  3. import java.util.stream.Collectors;
  4. public class RedisListSearch {
  5.     public static void main(String[] args) {
  6.         // 连接 Redis
  7.         Jedis jedis = new Jedis("localhost", 6379);
  8.         // 列表的 key
  9.         String key = "myList";
  10.         // 获取整个列表
  11.         List<String> allData = jedis.lrange(key, 0, -1);
  12.         // 在客户端进行过滤(例如:查找包含 "foo" 的元素)
  13.         List<String> result = allData.stream()
  14.                 .filter(item -> item.contains("foo"))
  15.                 .collect(Collectors.toList());
  16.         // 输出检索结果
  17.         System.out.println("检索结果: " + result);
  18.         // 关闭连接
  19.         jedis.close();
  20.     }
  21. }
复制代码
3.2 方法 2:利用 Redis 的 SCAN 下令(适用于大数据量)

假如列表数据量非常大,可以利用 SCAN 下令逐步遍历列表并进行过滤。
四、分页 + 检索联合

假如需要同时支持分页和检索,可以先在客户端进行过滤,然后对过滤后的效果进行分页。
示例代码:
  1. import redis.clients.jedis.Jedis;
  2. import java.util.List;
  3. import java.util.stream.Collectors;
  4. public class RedisListPaginationAndSearch {
  5.     public static void main(String[] args) {
  6.         // 连接 Redis
  7.         Jedis jedis = new Jedis("localhost", 6379);
  8.         // 列表的 key
  9.         String key = "myList";
  10.         // 获取整个列表
  11.         List<String> allData = jedis.lrange(key, 0, -1);
  12.         // 在客户端进行过滤(例如:查找包含 "foo" 的元素)
  13.         List<String> filteredData = allData.stream()
  14.                 .filter(item -> item.contains("foo"))
  15.                 .collect(Collectors.toList());
  16.         // 分页参数
  17.         int pageSize = 5;
  18.         int page = 2;
  19.         // 计算分页的起始和结束索引
  20.         int start = (page - 1) * pageSize;
  21.         int end = Math.min(start + pageSize, filteredData.size());
  22.         // 获取分页数据
  23.         List<String> pageData = filteredData.subList(start, end);
  24.         // 输出分页结果
  25.         System.out.println("第 " + page + " 页数据: " + pageData);
  26.         // 关闭连接
  27.         jedis.close();
  28.     }
  29. }
复制代码
五、性能优化建议



  • 数据量较大时:
   避免一次性获取整个列表(如 LRANGE key 0 -1),可以利用分步遍历(如 SCAN 下令)。
  假如检索条件复杂,可以考虑利用 Redis 的其他数据结构(如 Sorted Set)或联合外部存储(如 Elasticsearch)。
  

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

  • 分页时:
   假如列表数据量较大,只管避免频仍分页操纵,可以通过缓存分页效果来进步性能。
  六、总结



  • 分页: 利用 LRANGE 下令实现分页。
  • 检索: 在客户端进行过滤,或利用 SCAN 下令逐步遍历。
  • 联合分页和检索: 先过滤,再对过滤后的效果进行分页。
  • 性能优化: 对于大数据量或复杂检索场景,考虑利用其他数据结构或外部存储。
通过以上方法,可以高效地实现 Redis 列表的分页和检索功能。

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

鼠扑

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表