文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何在redisCluster中模糊获取key方式

2023-06-20 14:10

关注

本篇内容介绍了“如何在redisCluster中模糊获取key方式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

在一个集群中,显然不能通过keys方法通过pattern直接获取key的集合;

鉴于这种问题,产生了两种思路,如下:

方案1:

已知相同的tag的KV会在一个节点上,所以只要key带有相同的hashtag,则会在一个节点上,所以只要扫描该节点即可,这样就将集群转化为了单点。

@RequestMapping(value = "/ceshi", method = RequestMethod.GET)    @ResponseBody    public void Rediskeys() {                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)@ResponseBodypublic 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 \*

注意:

不能去掉\;

换成你redis集群的一个节点的ip和端口

如果集群有密码加上参数 -a password(你的redis集群密码) 如本地测试环境查询结果:

如何在redisCluster中模糊获取key方式

“如何在redisCluster中模糊获取key方式”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯