在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 sentinel 频繁主备切换的问题
Apr 12 Redis
redis限流的实际应用
Apr 24 Redis
redis 限制内存使用大小的实现
May 08 Redis
Redis 配置文件重要属性的具体使用
May 20 Redis
redis cluster支持pipeline的实现思路
Jun 23 Redis
Redis字典实现、Hash键冲突及渐进式rehash详解
Sep 04 Redis
Redis RDB技术底层原理详解
Sep 04 Redis
详解redis在微服务领域的贡献
Oct 16 Redis
SpringBoot整合Redis入门之缓存数据的方法
Nov 17 Redis
redis复制有可能碰到的问题汇总
Apr 03 Redis
Redis基本数据类型Set常用操作命令
Jun 01 Redis
Redis实现分布式锁的五种方法详解
Jun 14 Redis
Redis集群的关闭与重启操作
Jul 07 #Redis
redis不能访问本机真实ip地址的解决方案
Jul 07 #Redis
redis客户端实现高可用读写分离的方式详解
使用Redis实现实时排行榜功能
Jul 02 #Redis
redis使用不当导致应用卡死bug的过程解析
Redis主从配置和底层实现原理解析(实战记录)
浅谈Redis中的RDB快照
You might like
收音机鉴频器对声音的影响和频偏分析
2021/03/02 无线电
PHP基础学习之流程控制的实现分析
2013/04/28 PHP
PHP中上传多个文件的表单设计例子
2014/11/19 PHP
fsockopen pfsockopen函数被禁用,SMTP发送邮件不正常的解决方法
2015/09/20 PHP
Yii框架弹出窗口组件CJuiDialog用法分析
2017/01/07 PHP
浅谈php中fopen不能创建中文文件名文件的问题
2017/02/06 PHP
php实现与python进行socket通信的方法示例
2017/08/30 PHP
jQuery 打造动态渐变按钮 详细图文教程
2010/04/25 Javascript
基于jQuery的试卷自动排版系统实现代码
2011/01/06 Javascript
两种方法解决javascript url post 特殊字符转义 + &amp; #
2016/04/13 Javascript
angularJS 如何读写缓冲的方法(推荐)
2016/08/06 Javascript
JS实现的简单轮播图运动效果示例
2016/12/22 Javascript
Agularjs妙用双向数据绑定实现手风琴效果
2017/05/26 Javascript
jQuery序列化后的表单值转换成Json
2017/06/16 jQuery
jQuery 1.9版本以上的浏览器判断方法代码分享
2017/08/28 jQuery
vue+iview/elementUi实现城市多选
2019/03/28 Javascript
小程序实现左滑删除效果
2019/07/25 Javascript
vue动态绘制四分之三圆环图效果
2019/09/03 Javascript
两个使用Python脚本操作文件的小示例分享
2015/08/27 Python
Python中如何优雅的合并两个字典(dict)方法示例
2017/08/09 Python
python DataFrame获取行数、列数、索引及第几行第几列的值方法
2018/04/08 Python
Python3实现购物车功能
2018/04/18 Python
Python OOP类中的几种函数或方法总结
2019/02/22 Python
Python PyQt5 Pycharm 环境搭建及配置详解(图文教程)
2019/07/16 Python
Django Aggregation聚合使用方法解析
2019/08/01 Python
python模块导入的方法
2019/10/24 Python
python中pop()函数的语法与实例
2020/12/01 Python
python热力图实现简单方法
2021/01/29 Python
用html5实现语音搜索框的方法
2014/03/18 HTML / CSS
墨西哥皇宫度假村预订:Palace Resorts
2018/06/16 全球购物
英国最大的在线快递公司之一:ParcelHero
2019/11/04 全球购物
店长岗位的工作内容
2013/11/12 职场文书
导游词之澳门玫瑰圣母堂
2019/12/03 职场文书
Node与Python 双向通信的实现代码
2021/07/16 Javascript
python中tkinter复选框使用操作
2021/11/11 Python
《遗弃》开发商删推文要跑路?官方回应:还在开发
2022/04/03 其他游戏