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]

相关推荐
野犬寒鸦2 分钟前
Redis热点key问题解析与实战解决方案(附大厂实际方案讲解)
服务器·数据库·redis·后端·缓存·bootstrap
我是大猴子9 分钟前
事务失效的几种情况以及是为什么(详解)
java·开发语言
mldlds27 分钟前
Windows安装Redis图文教程
数据库·windows·redis
Nyarlathotep011341 分钟前
Redis的对象(5):有序集合对象
redis·后端
feng68_1 小时前
Redis架构实践
linux·运维·redis·架构·bootstrap
wertyuytrewm1 小时前
Java面试——Java基础
java·jvm·面试
czlczl200209251 小时前
RAG实现思路流程
java·jvm
带娃的IT创业者1 小时前
WeClaw_40_系统监控与日志体系:多层次日志架构与Trace追踪
java·开发语言·python·架构·系统监控·日志系统·链路追踪
Y001112361 小时前
JDBC原理
java·开发语言·数据库·jdbc
程序员侠客行1 小时前
Tomcat 从陌生到熟悉
java·tomcat·web