在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 15 Redis
详解Redis基本命令与使用场景
Jun 01 Redis
压缩Redis里的字符串大对象操作
Jun 23 Redis
聊一聊Redis与MySQL双写一致性如何保证
Jun 26 Redis
解析redis hash应用场景和常用命令
Aug 04 Redis
Redis集群新增、删除节点以及动态增加内存的方法
Sep 04 Redis
Redis的字符串是如何实现的
Oct 24 Redis
Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
Feb 12 Redis
sentinel支持的redis高可用集群配置详解
Apr 01 Redis
浅谈Redis的事件驱动模型
May 30 Redis
一文教你快速生成MySQL数据库关系图
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
2006/10/09 PHP
Yii学习总结之安装配置
2015/02/22 PHP
PHP实现操作redis的封装类完整实例
2015/11/14 PHP
XHProf报告字段含义的解析
2016/05/17 PHP
thinkPHP多域名情况下使用memcache方式共享session数据的实现方法
2016/07/21 PHP
PHP递归遍历指定文件夹内的文件实现方法
2016/11/15 PHP
Yii框架引入coreseek分页功能示例
2019/02/08 PHP
基于PHP的登录和注册的功能的实现
2020/08/06 PHP
跟着JQuery API学Jquery 之二 属性
2010/04/09 Javascript
asp.net 30分钟掌握无刷新 Repeater
2011/09/16 Javascript
JavaScript中对象属性的添加和删除示例
2014/05/12 Javascript
JavaScript中的ParseInt(&quot;08&quot;)和“09”返回0的原因分析及解决办法
2016/05/19 Javascript
ionic中的$ionicPlatform.ready事件中的通用设置
2017/06/11 Javascript
Python文件操作之合并文本文件内容示例代码
2017/09/19 Python
python django使用haystack:全文检索的框架(实例讲解)
2017/09/27 Python
Python打印“菱形”星号代码方法
2018/02/05 Python
对Python 中矩阵或者数组相减的法则详解
2019/08/26 Python
通过实例学习Python Excel操作
2020/01/06 Python
python实现扫雷游戏
2020/03/03 Python
Python文件读写w+和r+区别解析
2020/03/26 Python
python实现在线翻译
2020/06/18 Python
收集的22款给力的HTML5和CSS3帮助工具
2012/09/14 HTML / CSS
时尚圣经:The Fashion Bible
2019/03/03 全球购物
金鑫耀Java笔试题
2014/09/06 面试题
区域总监的岗位职责
2013/11/21 职场文书
餐饮管理自我介绍信
2014/01/15 职场文书
运动会稿件100字
2014/02/21 职场文书
聚美优品广告词改编
2014/03/14 职场文书
原材料检验岗位职责
2014/03/15 职场文书
数学兴趣小组活动总结
2014/07/08 职场文书
市场营销毕业求职信
2014/08/07 职场文书
开场白怎么写
2015/06/01 职场文书
导游词之黄果树瀑布
2019/09/20 职场文书
golang通过递归遍历生成树状结构的操作
2021/04/28 Golang
python 提取html文本的方法
2021/05/20 Python
用Python爬取某乎手机APP数据
2021/06/15 Python