在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遍历所有key的两个命令(KEYS 和 SCAN)
Apr 12 Redis
在K8s上部署Redis集群的方法步骤
Apr 27 Redis
浅谈Redis的几个过期策略
May 27 Redis
5分钟教你docker安装启动redis全教程(全新方式)
May 29 Redis
浅谈redis整数集为什么不能降级
Jul 25 Redis
为什么RedisCluster设计成16384个槽
Sep 25 Redis
Jedis操作Redis实现模拟验证码发送功能
Sep 25 Redis
浅谈Redis跟MySQL的双写问题解决方案
Feb 24 Redis
Redis实现一个账号只能登录一个设备
Apr 19 Redis
Redis基本数据类型Zset有序集合常用操作
Jun 01 Redis
Redis集群的关闭与重启操作
Jul 07 #Redis
redis不能访问本机真实ip地址的解决方案
Jul 07 #Redis
redis客户端实现高可用读写分离的方式详解
使用Redis实现实时排行榜功能
Jul 02 #Redis
redis使用不当导致应用卡死bug的过程解析
Redis主从配置和底层实现原理解析(实战记录)
浅谈Redis中的RDB快照
You might like
php学习之 循环结构实现代码
2011/06/09 PHP
从PHP $_SERVER相关参数判断是否支持Rewrite模块
2013/09/26 PHP
控制打印时页眉角的代码
2007/02/08 Javascript
javascript中的undefined 与 null 的区别  补充篇
2010/03/17 Javascript
关于JavaScript中的关联数组分析
2013/04/09 Javascript
Jquery:ajax实现翻页无刷新功能代码
2013/08/05 Javascript
纯js简单日历实现代码
2013/10/05 Javascript
js的flv视频播放器插件使用方法
2015/06/23 Javascript
javascript简单比较日期大小的方法
2016/01/05 Javascript
js入门之Function函数的使用方法【新手必看】
2016/11/22 Javascript
vue.js入门(3)——详解组件通信
2016/12/02 Javascript
原生js实现可爱糖果数字时间特效
2016/12/30 Javascript
jquery编写日期选择器
2017/03/16 Javascript
JavaScript制作简单的框选图表
2017/05/15 Javascript
react学习笔记之state以及setState的使用
2017/12/07 Javascript
layui table设置前台过滤转义等方法
2018/08/17 Javascript
微信小程序自定义组件传值 页面和组件相互传数据操作示例
2019/05/05 Javascript
javascript中call,apply,callee,caller用法实例分析
2019/07/24 Javascript
JavaScript中如何调用Java方法
2020/09/16 Javascript
Python实现冒泡,插入,选择排序简单实例
2014/08/18 Python
django使用xlwt导出excel文件实例代码
2018/02/06 Python
python数据分析数据标准化及离散化详解
2018/02/26 Python
PyQt5每天必学之带有标签的复选框
2018/04/19 Python
用Python逐行分析文件方法
2019/01/28 Python
在python里协程使用同步锁Lock的实例
2019/02/19 Python
使用Python实现毫秒级抢单功能
2019/06/06 Python
Python 控制终端输出文字的实例
2019/07/12 Python
Python传递参数的多种方式(小结)
2019/09/18 Python
python实现七段数码管和倒计时效果
2019/11/23 Python
解决启动django,浏览器显示“服务器拒绝访问”的问题
2020/05/13 Python
Python中如何引入第三方模块
2020/05/27 Python
python3实现名片管理系统(控制台版)
2020/11/29 Python
护士长2015年终工作总结
2015/04/24 职场文书
经营场所使用证明
2015/06/19 职场文书
Spring Boot mybatis-config 和 log4j 输出sql 日志的方式
2021/07/26 Java/Android
移除Selenium中window.navigator.webdriver值
2022/06/10 Python