在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 08 Redis
redis实现的四种常见限流策略
Jun 18 Redis
Redis集群新增、删除节点以及动态增加内存的方法
Sep 04 Redis
Redis中缓存穿透/击穿/雪崩问题和解决方法
Dec 04 Redis
redis的list数据类型相关命令介绍及使用
Jan 18 Redis
Redis分布式锁的7种实现
Apr 01 Redis
redis sentinel监控高可用集群实现的配置步骤
Apr 01 Redis
 Redis 串行生成顺序编码的方法实现
Apr 03 Redis
Redis高并发缓存架构性能优化
May 15 Redis
Redis 限流器
May 15 Redis
Redis集群的关闭与重启操作
Jul 07 #Redis
redis不能访问本机真实ip地址的解决方案
Jul 07 #Redis
redis客户端实现高可用读写分离的方式详解
使用Redis实现实时排行榜功能
Jul 02 #Redis
redis使用不当导致应用卡死bug的过程解析
Redis主从配置和底层实现原理解析(实战记录)
浅谈Redis中的RDB快照
You might like
动态新闻发布的实现及其技巧
2006/10/09 PHP
使用PHP实现二分查找算法代码分享
2011/06/24 PHP
php+mysql实现简单登录注册修改密码网页
2016/11/30 PHP
浅谈PHP中new self()和new static()的区别
2017/08/11 PHP
COM中获取JavaScript数组大小的代码
2009/11/22 Javascript
IE JS无提示关闭窗口不提示的方法
2010/04/29 Javascript
javascript 全等号运算符使用说明
2010/05/31 Javascript
Node.js中的模块机制学习笔记
2014/11/04 Javascript
javascript实现列表切换效果
2016/05/02 Javascript
JavaScript常用正则验证函数实例小结【年龄,数字,Email,手机,URL,日期等】
2017/01/23 Javascript
vue.js 实现点击按钮动态添加li的方法
2018/09/07 Javascript
layui实现鼠标移动到单元格上显示数据的方法
2019/09/11 Javascript
[02:56]DOTA2英雄基础教程 巨魔战将
2013/12/10 DOTA
Python中的choice()方法使用详解
2015/05/15 Python
python web框架学习笔记
2016/05/03 Python
简单掌握Python中glob模块查找文件路径的用法
2016/07/05 Python
解决phantomjs截图失败,phantom.exit位置的问题
2018/05/17 Python
python将一组数分成每3个一组的实例
2018/11/14 Python
Django 中间键和上下文处理器的使用
2019/03/17 Python
wxPython绘图模块wxPyPlot实现数据可视化
2019/11/19 Python
python循环输出三角形图案的例子
2019/11/22 Python
python对接ihuyi实现短信验证码发送
2020/05/10 Python
PyQt5实现仿QQ贴边隐藏功能的实例代码
2020/05/24 Python
基于python实现百度语音识别和图灵对话
2020/11/02 Python
日本乐天德国站:Rakuten.de
2019/05/16 全球购物
新西兰最大的连锁超市:Countdown
2020/06/04 全球购物
TCP/IP模型的分界线
2012/12/01 面试题
趣味游戏活动方案
2014/02/07 职场文书
2014年医学生毕业自我鉴定
2014/03/26 职场文书
农村葬礼主持词
2014/03/31 职场文书
学生干部培训方案
2014/06/12 职场文书
小学教师师德整改措施
2014/09/29 职场文书
2014年优秀党员材料
2014/12/18 职场文书
100句拼搏进取的名言警句,值得一读!
2019/10/07 职场文书
Python+Selenium实现抖音、快手、B站、小红书、微视、百度好看视频、西瓜视频、微信视频号、搜狐视频、一点号、大风号、趣头条等短视频自动发布
2022/04/13 Python
Windows Server 2022 超融合部署(图文教程)
2022/06/25 Servers