Java使用Redis实现分页功能

分页功能实现应该是比较常见的,对于redis来说,近期刷题就发现了lrange、zrange这些指令,这个指令怎么使用呢?

我们接下来就来讲解下。

目录

指令简介

lrange

lrange 是 Redis 中的一个命令,用于从列表中 获取指定范围内的元素。

语法:lrange key start end

start 和 end是两个整数,表示要从列表中获取元素的起始和结束位置。索引从0开始,所以start和end都应该大于等于0。如果start大于end,交换它们的位置。

lrange 命令将返回一个列表,其中包含从start到end(不包括)位置的元素。

示例:lrange my_list 0 4

zrange

zrange是用于从有序集合中 排序查询(升序)指定范围内的元素。(zrevrange是降序 ,语法同理)

语法:ZRANGE key start stop WITHSCORES (WITHSCORES显示分数)

示例:ZRANGE myzset 0 -1 WITHSCORES(显示全部) 或 ZRANGE myzset 0 2 (显示下标区间0-2)

Java实现Redis实现分页功能

java 复制代码
import redis.clients.jedis.Jedis;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class RedisPagination {

    private Jedis jedis;

    public RedisPagination(Jedis jedis) {
        this.jedis = jedis;
    }

    /**
     * 获取指定页码的列表
     * @param pageNo 页码
     * @param pageSize 每页大小
     * @return
     */
    public List<String> getPageList(String listKey,int pageNo,int pageSize){
        // 计算起始和结束索引
        int start = (pageNo - 1) * pageSize;
        int end = start + pageSize - 1;

        //存储结果
        List<String> result = new ArrayList<>();

        // 使用lrange获取分页数据
        long totalItems = jedis.llen(listKey); // 获取总条目数
        System.out.println("总条目数: " + totalItems);
        if (totalItems > 0) {
            // 确保结束索引不超过总条目数
            end = Math.min(end, (int) (totalItems - 1));
            // 使用lrange进行分页
            result = jedis.lrange(listKey, start, end);
        }

        return result;
    }

    /**
     * 获取指定页码的有序集合
     * @param pageNo 页码
     * @param pageSize 每页大小
     * @return
     */
    public Set<String> getPageSet(String setKey,int pageNo,int pageSize){
        // 计算起始和结束索引
        int start = (pageNo - 1) * pageSize;
        int end = start + pageSize - 1;

        //存储结果
        Set<String> result = new HashSet<>();

        // 使用zrange获取分页数据
        long totalItems = jedis.zcard(setKey); // 获取总条目数
        System.out.println("总条目数: " + totalItems);
        if (totalItems > 0) {
            // 确保结束索引不超过总条目数
            end = Math.min(end, (int) (totalItems - 1));
            // 使用lrange进行分页
            result = jedis.zrange(setKey, start, end);
        }

        return result;
    }


    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost",6379);
        RedisPagination pagination = new RedisPagination(jedis);

        System.out.println("列表分页结果:"+pagination.getPageList("my_list",1,5));
        System.out.println("集合分页结果:"+pagination.getPageSet("myzset",1,5));

        jedis.close();
    }
}

测试结果:

总条目数: 7

列表分页结果:task1, task2, task3, test1, test2

总条目数: 4

集合分页结果:baidu.com, google.com, 360.com, google.com1

相关推荐
叼烟扛炮7 小时前
[LangChain] 学习笔记(03):打破失忆症——对话机制与上下文管理
java·前端·javascript·笔记·学习·langchain
文丑颜不良啊7 小时前
LeetCode2061~2080题目解析
java·leetcode
我不会起名字3227 小时前
Redis 从 0 到 1(二十八):Redis 抖一下,重试把它打挂了——超时/重试/熔断的 Go 封装
redis·go·超时·熔断·重试
特立独行的猫A8 小时前
13MB 单文件、一条命令变服务:把仓颉写的 cjh 内嵌进你的应用,当它的 AI 大脑
java·后端·python
Brookty8 小时前
Java博客项目实战|工程环境与构建:工程目录、PowerShell命令调用与JDK/IDEA/Maven工作机制
java·项目实战
养军博客8 小时前
Spring Boot 3.x + Spring Security 6.x 整合 JWT 实战:jjwt 与 java-jwt 两种工具库详解
java·spring boot·springsecurity
我不会起名字3228 小时前
Redis 从 0 到 1(三十):删了一半数据 RSS 不降——内存碎片与 activedefrag 观测
redis·内存碎片·rss·排查·activedefrag
TeamDev8 小时前
使用 JxBrowser 在桌面应用中集成 Spring
java·前端·后端·spring·混合应用·jxbrowser·浏览器控件
J.YA8 小时前
String字符串[面试题]
java·开发语言
金銀銅鐵18 小时前
为什么枚举类中可以定义抽象方法
java·后端·ai编程