在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五大数据结构和使用场景
Apr 12 Redis
Java Socket实现Redis客户端的详细说明
May 26 Redis
Redis Cluster 字段模糊匹配及删除
May 27 Redis
浅谈Redis主从复制以及主从复制原理
May 29 Redis
Redis三种集群模式详解
Oct 05 Redis
SpringBoot集成Redis的思路详解
Oct 16 Redis
redis数据一致性的实现示例
Mar 18 Redis
在Centos 8.0中安装Redis服务器的教程详解
Mar 21 Redis
Redis实战高并发之扣减库存项目
Apr 14 Redis
一文教你快速生成MySQL数据库关系图
Jun 28 Redis
Redis sentinel哨兵集群的实现步骤
Jul 15 Redis
基于Redission的分布式锁实战
Aug 14 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
Zend Framework入门教程之Zend_View组件用法示例
2016/12/09 PHP
Yii输入正确验证码却验证失败的解决方法
2017/06/06 PHP
Laravel 实现密码重置功能
2018/02/23 PHP
Linux下安装Memcached服务器和客户端与PHP使用示例
2019/04/15 PHP
jQuery图片预加载 等比缩放实现代码
2011/10/04 Javascript
jQuery动画与特效详解
2015/02/01 Javascript
jQuery实现字符串按指定长度加入特定内容的方法
2015/03/11 Javascript
深入探寻seajs的模块化与加载方式
2015/04/14 Javascript
微信小程序多张图片上传功能
2017/06/07 Javascript
对Angular中单向数据流的深入理解
2018/03/31 Javascript
从vue源码解析Vue.set()和this.$set()
2018/08/30 Javascript
vue实现axios图片上传功能
2019/08/20 Javascript
[02:57]2014DOTA2国际邀请赛 选手辛苦解说更辛苦
2014/07/10 DOTA
python类定义的讲解
2013/11/01 Python
Python的Django框架中从url中捕捉文本的方法
2015/07/20 Python
python实现井字棋游戏
2020/03/30 Python
Python中turtle作图示例
2017/11/15 Python
python内置函数:lambda、map、filter简单介绍
2017/11/16 Python
Python代码缩进和测试模块示例详解
2018/05/07 Python
如何使用Python抓取网页tag操作
2020/02/14 Python
python使用paramiko实现ssh的功能详解
2020/03/06 Python
Html5原创俄罗斯方块(基于canvas)
2019/01/07 HTML / CSS
意大利体育用品网上商城:Nencini Sport
2016/08/18 全球购物
Herschel美国官网:背包、手提袋及配件
2020/03/10 全球购物
摄影实习自我鉴定
2013/09/20 职场文书
餐饮加盟计划书
2014/01/10 职场文书
群众路线剖析材料范文
2014/10/09 职场文书
小学庆六一主持词
2015/06/30 职场文书
2015年统计员个人工作总结
2015/07/23 职场文书
2016秋季幼儿园开学寄语
2015/12/03 职场文书
2016大学生就业指导课心得体会
2016/01/15 职场文书
2016年万圣节活动总结
2016/04/05 职场文书
《西游记》读后感(3篇)
2019/09/20 职场文书
python某漫画app逆向
2021/03/31 Python
Ruby处理YAML和json数据
2022/04/18 Ruby