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

相关推荐
San813_LDD1 小时前
[C语言]《Dev-C++ 报错解决手册(Day0607 精华版)》
java·前端·javascript
Anastasiozzzz2 小时前
从有限状态机到智能体图:传统 FSM 与 Agent Graph的演进
java·人工智能·python·ai
wang09078 小时前
自己动手写一个spring之IOC_2
java·后端·spring
来杯@Java8 小时前
学生选课管理系统(基于springboot+vue前后端分离的项目)计算机毕业设计java
java·spring boot·spring·vue·毕业设计·maven·mybatis
轻刀快马9 小时前
Redis 架构进阶:全景解析 RDB、AOF 与混合持久化机制
redis
不知名的老吴9 小时前
线程的生命周期之线程“插队“
java·开发语言·python
ANnianStriver9 小时前
PetLumina-02-后端开发与前后端联调
java·ai·sa-token
杨了个杨898210 小时前
Keepalived + Nginx + HAProxy 高可用架构部署实战案例
java·nginx·架构
马士兵教育12 小时前
Java还有前景吗?Java+AI大模型学习路线及项目?
java·人工智能·python·学习·机器学习