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

相关推荐
人活一口气36 分钟前
从JVM调优到MCP协议:Java全栈技术体系深度总结与企业级架构实践
java·spring boot
NE_STOP2 小时前
Vibe Coding -- 完整项目案例实操
java
荣码2 小时前
GraphRAG:普通RAG只能回答"点"的问题,我踩了4个坑才搞懂
java·python
SimonKing2 小时前
Google第三方授权登录
java·后端·程序员
明月光8182 小时前
从一行 @Builder 说起:重新拾起 Java 的 Lombok、注解与 Builder 模式
java
考虑考虑12 小时前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯12 小时前
GoF设计模式——中介者模式
java·后端·spring·设计模式
青石路16 小时前
记一次多JDK版本问题的排查,一坑套一坑,差点没爬上来
java
像我这样帅的人丶你还19 小时前
Java 后端详解(五):Redis 缓存
java·后端·全栈
plainGeekDev21 小时前
GreenDAO → Room
android·java·kotlin