探索Redis的List数据结构及其分页实现

        首先,让我们了解一下Redis的List数据结构。List是一个链表,每个元素都分配了一个唯一的索引。我们可以通过索引来访问和操作列表中的元素。Redis提供了一系列的命令来操作List,如LPUSHRPUSHLPOPRPOP等。这些命令可以用于在列表的头部或尾部添加、删除元素,也可以用于获取列表的长度、获取指定范围内的元素等操作。

假设有一个存储数据的 List,每个元素代表一个记录,例如 myList。

  1. 按页存储数据: 每页存储一定数量的记录。例如,第一页存储索引 0 到 N-1 的记录,第二页存储索引 N 到 2N-1 的记录,以此类推。
  2. 分页查询: 当需要查询某一页的数据时,可以使用 Redis 的 LRANGE 命令来获取指定范围内的记录。例如,对于第一页,可以使用 LRANGE myList 0 (pageSize-1)。
  3. 分页信息存储: 可以使用一个额外的数据结构存储分页信息,例如总记录数和每页记录数。这可以是 Redis 的 Hash 结构,将分页信息存储为字段。

实现过程 

   1、添加对应的依赖坐标:

<!--redis-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

   2、配置redis参数(根据自己的具体实际情况来填):

spring:
  data:
    redis:
      password: 123456
      host: 192.168.0.9
      port: 6379

   3、插入模拟数据: 

public void addToList() {
        ListOperations<String, String> op = redisTemplate.opsForList();
        for (int i = 1; i <= 100; i++) {
            op.rightPush("myList", "Value" + i);
        }
    }

addToList方法模拟插入了100条记录到名为myList的Redis列表中

   4、 分页查询:

/**
 * 分页功能
 */
public void page(Integer pageIndex,Integer pageSize){
    ListOperations<String, String> op = redisTemplate.opsForList();

    List<String> values = op.range("myList",pageIndex,pageSize-1);
    for (String value : values) {
        ystem.out.println(value);
    }
}
@Test
public void test(){
    page(0,10);
}

从前端获取对应的pageIndex和pageSize传给page()方法从Redis列表中获取指定页面的元素,并将它们打印输出。这里只是简单的小demo没有涉及到前端页面的实现,只是简单的调用了一下这个函数

下面提供一个完整的示例:


package com.example.springboot_redis;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;

import java.util.List;

@SpringBootTest
public class Redis {

    @Autowired
    private StringRedisTemplate redisTemplate;

    /**
     * 模拟数据
     */
    @Test
    public void addToList() {
        ListOperations<String, String> op = redisTemplate.opsForList();
        for (int i = 1; i <= 100; i++) {
            op.rightPush("myList", "Value" + i);
        }
    }

    /**
     * 查看全部数据
     */
    @Test
    public void viewList() {
        ListOperations<String, String> op = redisTemplate.opsForList();
        List<String> values = op.range("myList", 0, -1);
        for (String value : values) {
            System.out.println(value);
        }
    }

    /**
     * 分页功能
     */
    public void page(Integer pageIndex,Integer pageSize){
        ListOperations<String, String> op = redisTemplate.opsForList();

        List<String> values = op.range("myList",pageIndex,pageSize-1);
        for (String value : values) {
            System.out.println(value);
        }
    }
    /**
     * 测试分页功能
     */
    @Test
    public void test(){
        page(0,10);
    }

    /**
     * 删除之前myList里的数据
     */
    @Test
    public void delList() {
        redisTemplate.delete("myList");

    }

}

效果展示

 

  • 21
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值