Sring Redis实现分页查询key keytemplate列表

方法一:

实现分页查询可以在方法参数中增加两个参数:pageNum和pageSize。其中,pageNum表示要查询第几页,pageSize表示每页显示的数据条数。

private Set<String> getKeyDefineList0(String keyTemplate, int pageNum, int pageSize) {
    // key 格式化
    String key = StrUtil.replace(keyTemplate, "%[s|c|b|d|x|o|f|a|e|g]", parameter -> "*");
    // 计算起始位置和结束位置
    int startIndex = (pageNum - 1) * pageSize;
    int endIndex = startIndex + pageSize - 1;
    // scan 扫描 key
    Set<String> keys = new LinkedHashSet<>();
    stringRedisTemplate.execute((RedisCallback<Set<String>>) connection -> {
        try (Cursor<byte[]> cursor = connection.scan(ScanOptions.scanOptions().match(key).count(100).build())) {
            int index = 0;
            while (cursor.hasNext()) {
                byte[] value = cursor.next();
                if (index >= startIndex && index <= endIndex) {
                    keys.add(StrUtil.utf8Str(value));
                }
                if (index > endIndex) {
                    break;
                }
                index++;
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return keys;
    });
    return keys;
}

对代码得解析:

这是一个Java方法,其输入参数为keyTemplate、pageNum和pageSize,返回类型为Set<String>。

首先,该方法将keyTemplate中的占位符(%[s|c|b|d|x|o|f|a|e|g])替换为星号,得到格式化后的key。然后,根据传入的页码和页大小计算出查询的起始位置和结束位置。接着,通过Redis的SCAN命令扫描符合条件的key,并将结果存放在一个LinkedHashSet中。最后,返回该集合。

具体实现过程如下:

1、字符串keyTemplate中的占位符被星号替换,生成格式化后的key。

String key = StrUtil.replace(keyTemplate, "%[s|c|b|d|x|o|f|a|e|g]", parameter -> "*");

2、根据传入的pageNum和pageSize计算查询的起始位置和结束位置。

int startIndex = (pageNum - 1) * pageSize;
int endIndex = startIndex + pageSize - 1;

3、通过Redis的SCAN命令扫描符合条件的key,并将结果存放在一个LinkedHashSet中,只获取[startIndex, endIndex]范围内的key 

Set<String> keys = new LinkedHashSet<>();
stringRedisTemplate.execute((RedisCallback<Set<String>>) connection -> {
    try (Cursor<byte[]> cursor = connection.scan(ScanOptions.scanOptions().match(key).count(100).build())) {
        int index = 0;
        while (cursor.hasNext()) {
            byte[] value = cursor.next();
            if (index >= startIndex && index <= endIndex) {
                keys.add(StrUtil.utf8Str(value));
            }
            if (index > endIndex) {
                break;
            }
            index++;
        }
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
    return keys;
});

4、返回得到的key集合

return keys;

方法二:

用于检索与指定模式匹配的Redis键列表,并基于提供的pageNum和pageSize仅返回特定范围的键。

public List<String> findKeysForPage(String patternKey, int pageNum, int pageSize) {
    ScanOptions options = ScanOptions.scanOptions().match(patternKey).build();
    RedisConnectionFactory factory = stringRedisTemplate.getConnectionFactory();
    RedisConnection rc = factory.getConnection();
    Cursor<byte[]> cursor = rc.scan(options);
    List<String> result = new ArrayList<String>(pageSize);
    int tmpIndex = 0;
    int startIndex = (pageNum - 1) * pageSize;
    int end = pageNum * pageSize;
    while (cursor.hasNext()) {
      if (tmpIndex >= startIndex && tmpIndex < end) {
        result.add(new String(cursor.next()));
        tmpIndex++;
        continue;
      }
 
      // 获取到满足条件的数据后,就可以退出了
      if(tmpIndex >=end) {
          break;
      }
 
      tmpIndex++;
      cursor.next();
    }
 
    try {
      // cursor.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
 
    try {
      RedisConnectionUtils.releaseConnection(rc, factory);
    } catch (Exception e) {
      e.printStackTrace();
    }
    return result;
  }

对代码得解析:

该方法接受三个参数:patternKey,即要匹配Redis键的模式,pageNum,请求的页码,以及pageSize,每页的项目数。

使用给定模式创建一个ScanOptions对象。

从StringRedisTemplate对象获取RedisConnectionFactory。

使用工厂打开Redis连接。

使用scan方法获取符合给定模式的所有键的游标。

初始化结果列表和一些索引变量。

循环遍历游标,直到没有更多项目或已达到所需页面大小为止。

如果当前项目满足分页条件,则将其添加到结果列表中。

如果向结果列表中添加了足够的项目,则退出循环。

关闭游标并释放Redis连接。

返回包含所选Redis键的结果列表。

请注意,出于安全考虑,代码被注释为关闭游标和释放Redis连接。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
必备 官网: https://gitee.com/topfox/topfox 文中例子源码: https://gitee.com/topfox/topfox-sample TopFox技术交流群 QQ: 874732179 2.2. topfox 介绍 在 srpingboot2.x.x 和MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 编程规范参考《阿里巴巴Java开发手册》 借鉴 mybaties plus 部分思想 特性: 无侵入:只做增强不做改变,引入它不会对现有工程产生影响 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作 集成Redis缓存: 自带Redis缓存功能, 支持多主键模式, 自定义redis-key. 实现数据库的所有操作, 自动更新到Redis, 而不需要你自己写任何代码; 当然也可以针对某个表关闭. 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错 支持主键自动生成:可自由配置,充分利用Redis提高性能, 完美解决主键问题. 支持多主键查询、修改等 内置分页实现:基于 MyBatis 物理分页,开发者无需关心具体操作,写分页等同于普通查询 支持devtools/jrebel热部署 热加载 支持在不使用devtools/jrebel的情况下, 热加载 mybatis的mapper文件 内置全局、局部拦截插件:提供delete、update 自定义拦截功能 拥有预防Sql注入攻击功能 无缝支持spring cloud: 后续提供分布式调用的例子
请仔细阅读 README.md ## 1.1. 必备 - 文中涉及的例子源码网址: https://gitee.com/topfox/topfox-sample - TopFox技术交流群 QQ: 874732179 ## 1.2. topfox 介绍 在 srpingboot2.x.x 和MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 编程规范参考《阿里巴巴Java开发手册》 借鉴mybaties plus部分思想 特性: - **无侵入**:只做增强不做改变,引入它不会对现有工程产生影响 - **损耗小**:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作 - **集成Redis缓存**: 自带Redis缓存功能, 支持多主键模式, 自定义redis-key. 实现数据库的所有操作, 自动更新到Redis, 而不需要你自己写任何代码; 当然也可以针对某个表关闭. - **强大的 CRUD 操作**:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求 - **支持 Lambda 形式调用**:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错 - **支持主键自动生成**:可自由配置,充分利用Redis提高性能, 完美解决主键问题. 支持多主键查询、修改等 - **内置分页实现**:基于 MyBatis 物理分页,开发者无需关心具体操作,写分页等同于普通查询 - **支持devtools/jrebel热部署** - **热加载** 支持在不使用devtools/jrebel的情况下, 热加载 mybatis的mapper文件 - 内置全局、局部拦截插件:提供delete、update 自定义拦截功能 - **拥有预防Sql注入攻击功能** - **无缝支持spring cloud**: 后续提供分布式调用的例子

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值