广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >在redisCluster中模糊获取key方式
  • 1024
分享到

在redisCluster中模糊获取key方式

2024-04-02 19:04:59 1024人浏览 八月长安
摘要

在一个集群中,显然不能通过keys方法通过pattern直接获取key的集合; 鉴于这种问题,产生了两种思路,如下: 方案1: 已知相同的tag的KV会在一个节点上,所以只要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)
@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 *

查询结果示例:

redis集群查所有key命令:

如果使用keys *,那么查询的仍旧是本服务器的所有key,不是集群的(结合本图结果以及参考上图,都是插入后查询,无心插入或者删除key)

正确的命令是

./redis-cli -c --cluster call 192.168.168.161:7001 keys \*

注意:

1.不能去掉\;

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

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 在redisCluster中模糊获取key方式

本文链接: https://www.lsjlt.com/news/129997.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 在redisCluster中模糊获取key方式
    在一个集群中,显然不能通过keys方法通过pattern直接获取key的集合; 鉴于这种问题,产生了两种思路,如下: 方案1: 已知相同的tag的KV会在一个节点上,所以只要key带...
    99+
    2022-11-12
  • 如何在redisCluster中模糊获取key方式
    本篇内容介绍了“如何在redisCluster中模糊获取key方式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在一个集群中,显然不能通过k...
    99+
    2023-06-20
  • java中获取hashmap中的所有key方式
    目录如何获取hashmap中的所有keyHashMap在获得Key的Hash值的时候用的是什么算法JDK hashCode总结如何获取hashmap中的所有key 在 Java 中,...
    99+
    2023-03-22
    java获取hashmap的key java hashmap key 获取hashmap所有key
  • thinkphp5如何在模板中获取方法名
    这篇文章主要介绍“thinkphp5如何在模板中获取方法名”,在日常操作中,相信很多人在thinkphp5如何在模板中获取方法名问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”thinkphp5如何在模板中获取...
    99+
    2023-06-26
  • Vue3在Setup中使用axios请求获取的值方式
    目录Setup中使用axios请求获取的值Vue3+Setup使用知识点Setup中使用axios请求获取的值 上次我们使用axios给项目搞上了网络请求,从此项目数据不再是静态的。...
    99+
    2022-11-13
  • 在C++中获取文件大小的方式有哪些
    这篇文章给大家介绍在C++中获取文件大小的方式有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。C++获取文件大小代码示例:#include < iostream> #inc...
    99+
    2023-06-06
  • vue如何通过props方式在子组件中获取相应的对象
    目录方法一所以就可以直接拿取方法二有时候会获取不到,可以用一个定时器来获取方法三深拷贝方法四利用watch监听这些方法主要是在这次做项目的过程中发现总结的来的,感觉也挺常用的,所以就...
    99+
    2022-11-13
  • vue怎么通过props方式在子组件中获取相应的对象
    本文小编为大家详细介绍“vue怎么通过props方式在子组件中获取相应的对象”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue怎么通过props方式在子组件中获取相应的对象”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作