在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 14 Redis
使用Redis实现秒杀功能的简单方法
May 08 Redis
Redis高级数据类型Hyperloglog、Bitmap的使用
May 24 Redis
浅谈Redis位图(Bitmap)及Redis二进制中的问题
Jul 15 Redis
Redisson实现Redis分布式锁的几种方式
Aug 07 Redis
Redis字典实现、Hash键冲突及渐进式rehash详解
Sep 04 Redis
Redis高并发防止秒杀超卖实战源码解决方案
Nov 01 Redis
分布式Redis Cluster集群搭建与Redis基本用法
Feb 24 Redis
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
Mar 16 Redis
Redis分布式锁的7种实现
Apr 01 Redis
Redis特殊数据类型Geospatial地理空间
Jun 01 Redis
Redis批量生成数据的实现
Jun 05 Redis
Redis集群的关闭与重启操作
Jul 07 #Redis
redis不能访问本机真实ip地址的解决方案
Jul 07 #Redis
redis客户端实现高可用读写分离的方式详解
使用Redis实现实时排行榜功能
Jul 02 #Redis
redis使用不当导致应用卡死bug的过程解析
Redis主从配置和底层实现原理解析(实战记录)
浅谈Redis中的RDB快照
You might like
Trying to clone an uncloneable object of class Imagic的解决方法
2012/01/11 PHP
PHP生成指定随机字符串的简单实现方法
2015/04/01 PHP
php实现图片等比例缩放代码
2015/07/23 PHP
PHP中的Session对象如何使用
2015/09/25 PHP
PHP架构及原理知识点详解
2019/12/22 PHP
javascript里模拟sleep(两种实现方式)
2013/01/25 Javascript
Javascript实现真实字符串剩余字数提示的实例代码
2013/10/22 Javascript
javascript不同类型数据之间的运算的转换方法
2014/02/13 Javascript
jquery.mousewheel实现整屏翻屏效果
2015/08/30 Javascript
jQuery ajax全局函数处理session过期后的ajax跳转问题
2016/06/03 Javascript
浅谈layer的iframe弹窗给里面的标签赋值的问题
2016/11/10 Javascript
vue组件实现弹出框点击显示隐藏效果
2020/10/26 Javascript
node.js自动上传ftp的脚本分享
2018/06/16 Javascript
vue使用ElementUI时导航栏默认展开功能的实现
2018/07/04 Javascript
深入浅出 Vue 系列 -- 数据劫持实现原理
2019/04/23 Javascript
JavaScript基于用户照片姓名生成海报
2020/05/29 Javascript
[45:50]完美世界DOTA2联赛PWL S3 CPG vs Forest 第二场 12.16
2020/12/17 DOTA
下载安装setuptool和pip linux安装pip    
2014/01/24 Python
以一个投票程序的实例来讲解Python的Django框架使用
2016/02/18 Python
Python入门_浅谈字符串的分片与索引、字符串的方法
2017/05/16 Python
Python爬豆瓣电影实例
2018/02/23 Python
用python中的matplotlib绘制方程图像代码
2019/11/21 Python
python图形用户接口实例详解
2019/12/16 Python
tensorflow之变量初始化(tf.Variable)使用详解
2020/02/06 Python
HTML5的文档结构和新增标签完全解析
2017/04/21 HTML / CSS
优秀毕业生推荐信范文
2014/03/07 职场文书
个人存款证明书
2014/10/18 职场文书
2014年防汛工作总结
2014/12/08 职场文书
销售督导岗位职责
2015/04/10 职场文书
2015年安全生产管理工作总结
2015/05/25 职场文书
婚育证明格式
2015/06/17 职场文书
给校长的建议书作文400字
2015/09/14 职场文书
小学信息技术教学反思
2016/02/16 职场文书
2016年度创先争优活动总结
2016/04/05 职场文书
详解redis在微服务领域的贡献
2021/10/16 Redis
浅谈Node的内存泄露问题
2022/05/06 NodeJs