在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数据结构之链表与字典的使用
May 11 Redis
Redis延迟队列和分布式延迟队列的简答实现
May 13 Redis
为Java项目添加Redis缓存的方法
May 18 Redis
redis实现排行榜功能
May 24 Redis
redis实现共同好友的思路详解
May 26 Redis
Django使用redis配置缓存的方法
Jun 01 Redis
Redis做数据持久化的解决方案及底层原理
Jul 15 Redis
Redisson实现Redis分布式锁的几种方式
Aug 07 Redis
SpringBoot集成Redis的思路详解
Oct 16 Redis
Springboot/Springcloud项目集成redis进行存取的过程解析
Dec 04 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
一个可以删除字符串中HTML标记的PHP函数
2006/10/09 PHP
迪菲-赫尔曼密钥交换(Diffie?Hellman)算法原理和PHP实现版
2015/05/12 PHP
php实现基于openssl的加密解密方法
2016/09/30 PHP
Laravel重写用户登录简单示例
2016/10/08 PHP
BOOM vs RR BO5 第二场 2.14
2021/03/10 DOTA
javascript淡入淡出效果的实现思路
2012/03/31 Javascript
简单几行JS Code实现IE邮件转发新浪微博
2013/07/03 Javascript
浅析Node.js中使用依赖注入的相关问题及解决方法
2015/06/24 Javascript
jQuery的Scrollify插件实现滑动到页面下一节点
2015/07/05 Javascript
跨域请求的完美解决方法(JSONP, CORS)
2016/06/12 Javascript
怎样判断jQuery当前元素是隐藏还是显示
2016/11/23 Javascript
AngularJS开发教程之控制器之间的通信方法分析
2016/12/25 Javascript
node.js中EJS 模板快速入门教程
2017/05/08 Javascript
BootStrap Fileinput插件和Bootstrap table表格插件相结合实现文件上传、预览、提交的导入Excel数据操作步骤
2017/08/07 Javascript
浅谈vue的props,data,computed变化对组件更新的影响
2018/01/16 Javascript
jQuery实现通过方向键控制div块上下左右移动的方法【测试可用】
2018/04/26 jQuery
JS拖拽排序插件Sortable.js用法实例分析
2019/02/20 Javascript
vscode+gulp轻松开发小程序的完整步骤
2020/10/18 Javascript
[43:33]EG vs Spirit Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
Python中zfill()方法的使用教程
2015/05/20 Python
利用Python的Django框架生成PDF文件的教程
2015/07/22 Python
打包发布Python模块的方法详解
2016/09/18 Python
几种实用的pythonic语法实例代码
2018/02/24 Python
Python查找第n个子串的技巧分享
2018/06/27 Python
Python用5行代码写一个自定义简单二维码
2018/10/21 Python
python实现事件驱动
2018/11/21 Python
Python getattr()函数使用方法代码实例
2020/08/10 Python
Django框架请求生命周期实现原理
2020/11/13 Python
canvas实现按住鼠标移动绘制出轨迹的示例代码
2018/02/05 HTML / CSS
建筑工程技术应届生自荐信
2013/09/27 职场文书
农场厂长岗位职责
2013/12/28 职场文书
中学生励志演讲稿
2014/04/26 职场文书
关于运动会的广播稿
2014/09/22 职场文书
环卫工作个人总结
2015/03/04 职场文书
4S店客服专员岗位职责
2015/04/07 职场文书
CPU不支持Windows11系统怎么办
2021/11/21 数码科技