在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 26 Redis
详解Redis基本命令与使用场景
Jun 01 Redis
Redis 哨兵集群的实现
Jun 18 Redis
解析Redis Cluster原理
Jun 21 Redis
浅谈Redis中的RDB快照
Jun 29 Redis
Jedis操作Redis实现模拟验证码发送功能
Sep 25 Redis
redis调用二维码时的不断刷新排查分析
Apr 01 Redis
Redis实现一个账号只能登录一个设备
Apr 19 Redis
Redis基本数据类型List常用操作命令
Jun 01 Redis
Redis keys命令的具体使用
Jun 05 Redis
浅谈Redis变慢的原因及排查方法
Jun 21 Redis
Redis集群的关闭与重启操作
Jul 07 #Redis
redis不能访问本机真实ip地址的解决方案
Jul 07 #Redis
redis客户端实现高可用读写分离的方式详解
使用Redis实现实时排行榜功能
Jul 02 #Redis
redis使用不当导致应用卡死bug的过程解析
Redis主从配置和底层实现原理解析(实战记录)
浅谈Redis中的RDB快照
You might like
PHP实时显示输出
2008/10/02 PHP
php常用表单验证类用法实例
2015/06/18 PHP
Zend Framework实现Zend_View集成Smarty模板系统的方法
2016/03/05 PHP
php中的单引号、双引号和转义字符详解
2017/02/16 PHP
CodeIgniter框架验证码类库文件与用法示例
2017/03/18 PHP
显示、隐藏密码
2006/07/01 Javascript
[IE&amp;FireFox兼容]JS对select操作
2007/01/07 Javascript
JavaScript中的new的使用方法与注意事项
2007/05/16 Javascript
jQuery 表格插件整理
2010/04/27 Javascript
JavaScript对象链式操作代码(jquery)
2010/07/04 Javascript
javascript实现原生ajax的几种方法介绍
2013/09/21 Javascript
JS连接SQL数据库与ACCESS数据库的方法实例
2013/11/21 Javascript
nodejs URL模块操作URL相关方法介绍
2015/03/03 NodeJs
input file上传 图片预览功能实例代码
2016/10/25 Javascript
前端页面文件拖拽上传模块js代码示例
2017/05/19 Javascript
JavaScript解析任意形式的json树型结构展示
2017/07/23 Javascript
JS实现仿微信支付弹窗功能
2018/06/25 Javascript
package.json配置文件构成详解
2019/08/27 Javascript
js+springMVC 提交数组数据到后台的实例
2019/09/21 Javascript
实例讲解React 组件生命周期
2020/07/08 Javascript
Python装饰器decorator用法实例
2014/11/10 Python
Python里disconnect UDP套接字的方法
2015/04/23 Python
python中的错误处理
2016/04/10 Python
利用python模拟实现POST请求提交图片的方法
2017/07/25 Python
python编程培训 python培训靠谱吗
2018/01/17 Python
python plotly绘制直方图实例详解
2019/07/22 Python
学python需要去培训机构吗
2020/07/01 Python
Python中qutip用法示例详解
2020/10/02 Python
HTML5 和小程序实现拍照图片旋转、压缩和上传功能
2018/10/08 HTML / CSS
荷兰之家英文站:Holland at Home
2016/10/26 全球购物
西班牙语在线票务市场:SuperBoletería
2019/06/10 全球购物
贯彻落实“八项规定”思想汇报
2014/09/13 职场文书
结婚通知短信怎么写
2015/04/17 职场文书
公司员工辞职信范文
2015/05/12 职场文书
Django实现聊天机器人
2021/05/31 Python
Python实现Excel文件的合并(以新冠疫情数据为例)
2022/03/20 Python