在redisCluster中模糊获取key方式


Posted in Redis onJuly 09, 2021

在一个集群中,显然不能通过keys方法通过pattern直接获取key的集合;

鉴于这种问题,产生了两种思路,如下:

方案1:

已知相同的tag的KV会在一个节点上,所以只要key带有相同的hashtag,则会在一个节点上,所以只要扫描该节点即可,这样就将集群转化为了单点。

@RequestMapping(value = "/ceshi", method = RequestMethod.GET)
    @ResponseBody
    public void Rediskeys() {
        /**
         * 模糊匹配
         * @param pattern key的正则表达式
         * @param count 每次扫描多少条记录,值越大消耗的时间越短,但会影响redis性能。建议设为一千到一万
         * @return 匹配的key集合
         */
        try{
            jedisCluster.getClusterNodes();
            ScanParams scanParams = new ScanParams();
            scanParams.match("{operatingSystem}*");
            scanParams.count(1000);
            ScanResult<String> result = jedisCluster.scan("0", scanParams);
            List<String> keyList = result.getResult();
            System.out.println("keyList======="+keyList);
        }finally{
        }
    }
//scanParams.match("*{zmc}*");//success
//scanParams.match("ZMC_text:{zmc}*");//success

上述match方法中:括号中的参数也可以按照如上方式编写;

其关键在于 key 上传到redis中,命名方式里面,必须含有 {};

并且{}前面、后面有无参数必须指定;若key为 ZMC_text: {zmc}:1

scanParams.match("{zmc}*");查不出结果

方案2:

获取所有的节点,分别扫描每个节点,根据pattern获取节点中的key,整合起来即可;

注意:cluster模式执行多key操作的时候,这些key必须在同一个slot上,不然会报JedisDataException异常;

@RequestMapping(value = "/ceshi3", method = RequestMethod.GET)
@ResponseBody
public void RedisKeys() {
    String redisKeyStartWith="Ad:ads:id:";
    try {
        Map<String, JedisPool> clusterNodes = jedisCluster.getClusterNodes();
        for (Map.Entry<String, JedisPool> entry : clusterNodes.entrySet()) {
            Jedis jedis = entry.getValue().getResource();
            // 判断非从节点(因为若主从复制,从节点会跟随主节点的变化而变化)
            if (!jedis.info("replication").contains("role:slave")) {
                Set<String> keys = jedis.keys(redisKeyStartWith + "*");
                if (keys.size() > 0) {
                    Map<Integer, List<String>> map = new HashMap<>();
                    for (String key : keys) {
                        // cluster模式执行多key操作的时候,这些key必须在同一个slot上,不然会报:JedisDataException:
                        // CROSSSLOT Keys in request don't hash to the same slot
                        int slot = JedisClusterCRC16.getSlot(key);
                        // 按slot将key分组,相同slot的key一起提交
                        if (map.containsKey(slot)) {
                            map.get(slot).add(key);
                        } else {
                            map.put(slot, Lists.newArrayList(key));
                        }
                    }
                    for (Map.Entry<Integer, List<String>> integerListEntry : map.entrySet()) {
                        System.out.println("integerListEntry="+integerListEntry);
                        //jedis.del(integerListEntry.getValue().toArray(new String[integerListEntry.getValue().size()]));
                    }
                }
            }
        }
        logger.info("success redisKeys:{}", redisKeyStartWith);
    } finally {
    }
}

redis集群获取所有的key

redis单机查询所有key命令

keys *

查询结果示例:

在redisCluster中模糊获取key方式

redis集群查所有key命令:

如果使用keys *,那么查询的仍旧是本服务器的所有key,不是集群的(结合本图结果以及参考上图,都是插入后查询,无心插入或者删除key)

正确的命令是

./redis-cli -c --cluster call 192.168.168.161:7001 keys \*

注意:

1.不能去掉\;

2.换成你redis集群的一个节点的ip和端口

3.如果集群有密码加上参数 -a password(你的redis集群密码) 如本地测试环境查询结果:

在redisCluster中模糊获取key方式

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Redis 相关文章推荐
Redis延迟队列和分布式延迟队列的简答实现
May 13 Redis
深入浅析Redis 集群伸缩原理
May 15 Redis
5分钟教你docker安装启动redis全教程(全新方式)
May 29 Redis
redis 存储对象的方法对比分析
Aug 02 Redis
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
Mar 16 Redis
redis数据一致性的实现示例
Mar 18 Redis
Redis 异步机制
May 15 Redis
Redis基本数据类型List常用操作命令
Jun 01 Redis
Redis入门基础常用操作命令整理
Jun 01 Redis
浅谈Redis变慢的原因及排查方法
Jun 21 Redis
Redis+AOP+自定义注解实现限流
Jun 28 Redis
Redis集群的关闭与重启操作
Jul 07 #Redis
redis不能访问本机真实ip地址的解决方案
Jul 07 #Redis
redis客户端实现高可用读写分离的方式详解
使用Redis实现实时排行榜功能
Jul 02 #Redis
redis使用不当导致应用卡死bug的过程解析
Redis主从配置和底层实现原理解析(实战记录)
浅谈Redis中的RDB快照
You might like
PHP生成excel时单元格内换行问题的解决方法
2010/08/26 PHP
windows服务器中检测PHP SSL是否开启以及开启SSL的方法
2014/04/25 PHP
CodeIgniter框架URL路由总结
2014/09/03 PHP
PHP PDO数据库操作预处理与注意事项
2019/03/16 PHP
javascript 学习之旅 (3)
2009/02/05 Javascript
jquery ajax 登录验证实现代码
2009/09/23 Javascript
jQuery为iframe的body添加click事件的实现代码
2011/04/07 Javascript
如何用JavaScript动态呼叫函数(两种方式)
2013/05/03 Javascript
JQuery调用WebServices的方法和4个实例
2014/05/06 Javascript
javascript 小数取整简单实现方式
2014/05/30 Javascript
使用GruntJS构建Web程序之Tasks(任务)篇
2014/06/06 Javascript
基于jQuery和hwSlider实现内容左右滑动切换效果附源码下载(一)
2016/06/22 Javascript
js利用正则表达式检验输入内容是否为网址
2016/07/05 Javascript
微信小程序 实战小程序实例
2016/10/08 Javascript
vue.js开发实现全局调用的MessageBox组件实例代码
2017/11/22 Javascript
vue 动态改变静态图片以及请求网络图片的实现方法
2018/02/07 Javascript
基于vue-cli vue-router搭建底部导航栏移动前端项目
2018/02/28 Javascript
JavaScript Canvas实现验证码
2020/08/02 Javascript
Spring boot 和Vue开发中CORS跨域问题解决
2018/09/05 Javascript
vue-cli2 构建速度优化的实现方法
2019/01/08 Javascript
简单了解微信小程序的目录结构
2019/07/01 Javascript
JS运算符简单用法示例
2020/01/19 Javascript
VUE实时监听元素距离顶部高度的操作
2020/07/29 Javascript
python 正则式 概述及常用字符
2009/05/07 Python
Python搭建代理IP池实现接口设置与整体调度
2019/10/27 Python
python怎么对数字进行过滤
2020/07/05 Python
Python实现扫码工具的示例代码
2020/10/09 Python
pandas 按日期范围筛选数据的实现
2021/02/20 Python
Marriott中国:万豪国际酒店查询预订
2016/09/02 全球购物
会计与审计专业自荐信范文
2014/03/15 职场文书
高中国旗下的演讲稿
2014/08/28 职场文书
公司授权委托书范本
2014/09/18 职场文书
农村党支部书记四风问题个人对照检查材料
2014/09/21 职场文书
党员转正申请报告
2015/05/15 职场文书
2019学子的答谢词范本!
2019/07/05 职场文书
创业计划书之便利店
2019/09/05 职场文书