在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实现秒杀功能的简单方法
May 08 Redis
浅谈Redis的几个过期策略
May 27 Redis
详解Redis复制原理
Jun 04 Redis
redis使用不当导致应用卡死bug的过程解析
Jul 01 Redis
在redisCluster中模糊获取key方式
Jul 09 Redis
redis 存储对象的方法对比分析
Aug 02 Redis
Redis 操作多个数据库的配置的方法实现
Mar 23 Redis
 Redis 串行生成顺序编码的方法实现
Apr 03 Redis
Redis实战高并发之扣减库存项目
Apr 14 Redis
关于Redis的主从复制及哨兵问题
Jun 16 Redis
Redis唯一ID生成器的实现
Jul 07 Redis
Redis实战之Lettuce的使用技巧详解
Dec 24 Redis
Redis集群的关闭与重启操作
Jul 07 #Redis
redis不能访问本机真实ip地址的解决方案
Jul 07 #Redis
redis客户端实现高可用读写分离的方式详解
使用Redis实现实时排行榜功能
Jul 02 #Redis
redis使用不当导致应用卡死bug的过程解析
Redis主从配置和底层实现原理解析(实战记录)
浅谈Redis中的RDB快照
You might like
php include类文件超时问题处理
2015/02/06 PHP
php实现json编码的方法
2015/07/30 PHP
PHP类和对象相关系统函数与运算符小结
2016/09/28 PHP
Laravel利用gulp如何构建前端资源详解
2018/06/03 PHP
PHP实现正则匹配所有括号中的内容
2018/06/22 PHP
Yii2压缩PHP中模板代码的输出问题
2018/08/28 PHP
Laravel中错误与异常处理的用法示例
2018/09/16 PHP
Laravel框架基础语法与知识点整理【模板变量、输出、include引入子视图等】
2019/12/03 PHP
jQuery数据显示插件整合实现代码
2011/10/24 Javascript
cookie 最近浏览记录(中文escape转码)具体实现
2013/06/08 Javascript
实例代码详解jquery.slides.js
2015/11/16 Javascript
javascript HTML+CSS实现经典橙色导航菜单
2016/02/16 Javascript
Bootstrap源码解读网格系统(3)
2016/12/22 Javascript
想用好React的你必须要知道的一些事情
2017/07/24 Javascript
使用Vuex实现一个笔记应用的方法
2018/03/13 Javascript
详解webpack import()动态加载模块踩坑
2018/07/17 Javascript
vue与原生app的对接交互的方法(混合开发)
2018/11/28 Javascript
详解如何用webpack4从零开始构建react开发环境
2019/01/27 Javascript
原生javascript制作贪吃蛇小游戏的方法分析
2020/02/26 Javascript
Sublime Text3 配置 NodeJs 环境的方法
2020/05/20 NodeJs
vue单文件组件无法获取$refs的问题
2020/06/24 Javascript
如何手动实现一个 JavaScript 模块执行器
2020/10/16 Javascript
浅谈Matplotlib简介和pyplot的简单使用——文本标注和箭头
2018/01/09 Python
python3 中文乱码与默认编码格式设定方法
2018/10/31 Python
Pycharm新建模板默认添加个人信息的实例
2019/07/15 Python
Python3之字节串bytes与字节数组bytearray的使用详解
2019/08/27 Python
使用opencv中匹配点对的坐标提取方式
2020/06/04 Python
Python实现ElGamal加密算法的示例代码
2020/06/19 Python
CSS3教程(8):CSS3透明度指南
2009/04/02 HTML / CSS
美国知名平价彩妆品牌:e.l.f. Cosmetics
2017/11/20 全球购物
理肤泉美国官网:La Roche-Posay
2018/01/17 全球购物
Guess美国官网:美国知名服装品牌
2019/04/08 全球购物
创先争优标语
2014/06/27 职场文书
2014教师党员自我评议(5篇)
2014/09/20 职场文书
银行求职信怎么写
2019/06/20 职场文书
CI Games宣布《堕落之王2》使用虚幻引擎5制作 预计将于2023年正式发售
2022/04/11 其他游戏