精华内容
下载资源
问答
  • Redis集群的重定向

    2021-04-29 00:52:33
    本文主要来介绍redis集群的重定向问题。一、重定向产生的原因对于Redis的集群来说,因为集群节点不能代理(proxy)命令请求, 所以客户端应该在节点返回-MOVED或者-ASK...

    本文主要来介绍redis集群的重定向问题。

    一、重定向产生的原因

    对于Redis的集群来说,因为集群节点不能代理(proxy)命令请求, 所以客户端应该在节点返回 -MOVED 或者 -ASK 转向(redirection)错误时, 自行将命令请求转发至其他节点。

    使用时候的常用优化方法: 客户端可以将键和节点之间的映射信息保存起来, 可以有效地减少可能出现的转向次数, 籍此提升命令执行的效率。

    当节点需要让一个客户端长期地(permanently)将针对某个槽的命令请求发送至另一个节点时, 节点向客户端返回 MOVED 转向。这个情况一般是,客户端请求了不存在与当前节点上的操作的时候,我们通常可以通过在客户端维护一个节点和键值的映射关系来解决。

    另一方面, 当节点需要让客户端仅仅在下一个命令请求中转向至另一个节点时, 节点向客户端返回 ASK 转向。这里重定向一般是redis集群不同节点间正在迁移数据的时候,才会使用这个ASK转向,例如redis集群的扩容或者缩容的时候。

    二、MOVED转向

    一个 Redis 客户端可以向集群中的任意节点(包括从节点)发送命令请求。如果所查找的槽不是由该节点处理的话, 节点将查看自身内部所保存的哈希槽到节点 ID 的映射记录, 并向客户端回复一个 MOVED 错误。

        来自: https://www.huaweicloud.com/articles/38e2316d01880fdbdd63d62aa26b31b4.html)

    执行过程:

    1.Redis的单个节点通过socket通讯,
    会共享Redis Cluster中槽和集群中对应节点的关系。
    2.客户端向Redis Cluster的任意节点发送命令,
    接收命令的节点会根据CRC16规则进行hash运算与16383取余,
    计算自己的槽和对应节点 。
    3.如果保存数据的槽被分配给当前节点,则去槽中执行命令,
    并把命令执行结果返回给客户端。
    4.如果保存数据的槽不在当前节点的管理范围内,
    则向客户端返回moved重定向异常 。
    5.客户端接收到节点返回的结果,如果是moved异常,
    则从moved异常中获取目标节点的信息。
    6.客户端向目标节点发送命令,获取命令执行结果。
    

    三、ASK转向

    当节点需要让客户端仅仅在下一个命令请求中转向至另一个节点时, 节点向客户端返回 ASK 转向,往往发生在数据从节点A迁移到节点B的时候。

    来自: https://www.huaweicloud.com/articles/38e2316d01880fdbdd63d62aa26b31b4.html)

    执行过程:

    1.当客户端向集群中某个节点发送命令,
    节点向客户端返回moved异常,告诉客户端数据对应目标槽的节点信息。
    2.客户端再向目标节点发送命令,
    目标节点中的槽已经迁移出别的节点上了,此时目标节点会返回ask重定向给客户端。
    3.客户端向新的target节点发送Asking命令,
    然后再次向新节点发送请求请求命令。
    4.新节点target执行命令,把命令执行结果返回给客户端。
    

    例子:

    在我们上一节列举的槽 8 的例子中, 因为槽 8 所包含的各个键分散在节点 A 和节点 B 中, 所以当客户端在节点 A 中没找到某个键时, 它应该转向到节点 B 中去寻找, 但是这种转向应该仅仅影响一次命令查询, 而不是让客户端每次都直接去查找节点 B : 在节点 A 所持有的属于槽 8 的键没有全部被迁移到节点 B 之前, 客户端应该先访问节点 A , 然后再访问节点 B 。

    参考文档:

    http://redisdoc.com/topic/cluster-spec.html

    https://www.huaweicloud.com/articles/38e2316d01880fdbdd63d62aa26b31b4.html

    展开全文
  • ask重定向现象请参考...1.使用mget批量获取,如果存在重定向问题,会抛出异常。 @Test public void testMget(){ JedisCluster jedis = RedisClusterUtil.getJedis(); List<String> results =...

    ask重定向现象请参考【传送门

    分别使用mget和pipline做批处理
    1.使用mget批量获取,如果存在重定向问题,会抛出异常。

        @Test
        public void testMget(){
            JedisCluster jedis = RedisClusterUtil.getJedis();
            List<String> results = null;
            results = jedis.mget("user:{info}:id","user:{info}:age");
            for(String res:results){
                System.out.println(res);
            }
            results = jedis.mget("user:{info}:id","user:{info}:age","user:{info}:name","user:{info}:email");
            for(String res:results){
                System.out.println(res);
            }
        }
    

    返回结果如下所示,第一次mget执行成功,是因为两个键都迁移完成,第二次获取失败是因为存在ask重定向问题。

    232132
    20
    
    redis.clients.jedis.exceptions.JedisDataException: TRYAGAIN Multiple keys request during rehashing of slot
    

    2.使用pipline做批量处理

    @Test
        public void testPiplione(){
            //创建JedisCluster时,节点地址可以只填写部分,集群内部可以通过cluster nodes获取所有节点信息
            JedisSlotBasedConnectionHandler connectionHandler = new JedisCluster(new HostAndPort("192.168.0.31",6380),1000,1000,5,"1234@abcd",new JedisPoolConfig()){
                public JedisSlotBasedConnectionHandler getConnectionHandler() {
                    return (JedisSlotBasedConnectionHandler) super.connectionHandler;
                }
            }.getConnectionHandler();
            List<String> keys = Arrays.asList("user:{info}:id","user:{info}:age","user:{info}:name","user:{info}:email");
            Jedis jedis = connectionHandler.getConnectionFromSlot(JedisClusterCRC16.getSlot(keys.get(3)));
            try {
                Pipeline pipelined = jedis.pipelined();
                for (String key : keys) {
                    pipelined.get(key);
                }
                List<Object> results = pipelined.syncAndReturnAll();
                for (Object result : results) {
                    System.out.println(result);
                }
            } finally {
                jedis.close();
            }
        }
    

    批处理结果如下,当存在重定向问题时,pipline不会抛出异常,而是直接返回异常对象,并且成功迁移的键能获取到值。

    redis.clients.jedis.exceptions.JedisAskDataException: ASK 5642 192.168.0.33:6380
    redis.clients.jedis.exceptions.JedisAskDataException: ASK 5642 192.168.0.33:6380
    peter
    132132@163.com
    

    基于异常结果对象,可以获取到对应的重定向节点信息,根据获取到的节点信息获取连接再次发送请求。

    @Test
        public void testPiplione2(){
            JedisSlotBasedConnectionHandler connectionHandler = new JedisCluster(new HostAndPort("192.168.0.31",6380),1000,1000,5,"1234@abcd",new JedisPoolConfig()){
                public JedisSlotBasedConnectionHandler getConnectionHandler() {
                    return (JedisSlotBasedConnectionHandler) super.connectionHandler;
                }
            }.getConnectionHandler();
            List<String> keys = Arrays.asList("user:{info}:id","user:{info}:age","user:{info}:name","user:{info}:email");
            Jedis jedis = connectionHandler.getConnectionFromSlot(JedisClusterCRC16.getSlot(keys.get(3)));
            try {
                Pipeline pipelined = jedis.pipelined();
                for (String key : keys) {
                    pipelined.get(key);
                }
                List<Object> results = pipelined.syncAndReturnAll();
                for (int i =0 ; i<keys.size() ; i++) {
                    // 键顺序和结果顺序,Pipeline严格按照键发送的顺序返回结果,即使出现异常也是如此
                    Object result = results.get(i);
                    //判断是否是异常结果对象
                    if (result != null && result instanceof JedisAskDataException) {
                        JedisAskDataException askException = (JedisAskDataException) result;
                        //根据异常结果对象获取节点信息
                        HostAndPort targetNode = askException.getTargetNode();
                        //根据节点信息获取jedis连接
                        Jedis targetJedis = connectionHandler.getConnectionFromNode(targetNode);
                        try {
                            // 执行asking
                            targetJedis.asking();
                            // 获取key并执行
                            String key = keys.get(i);
                            String targetResult = targetJedis.get(key);
                            System.out.println(targetResult);
                        } finally {
                            targetJedis.close();
                        }
                    } else {
                        System.out.println(result);
                    }
                }
            }finally {
                jedis.close();
            }
        }
    

    以下是执行结果,可以看出pipline可以根据返回的异常结果对象,获取ask重定向节点信息,发送ask请求,获取返回结果,这点和mget不一样,mget出现ask重定向问题时会直接抛出异常。

    232132
    20
    peter
    132132@163.com
    

    集群环境下的批量操作场景,建议优先选择pipline,这样不仅可以处理slot迁移过程的ask重定向问题,还可以提高redis的IO效率。

    展开全文
  • 1.使用mget批量获取,如果存在重定向问题,会抛出异常。 @Test public void testMget(){ JedisCluster jedis = RedisClusterUtil.getJedis(); List<String> results = null; results = jedis.mget("user:...

    原文:https://riclee.blog.csdn.net/article/details/87603547

    分别使用mget和pipline做批处理
    1.使用mget批量获取,如果存在重定向问题,会抛出异常。

        @Test
        public void testMget(){
            JedisCluster jedis = RedisClusterUtil.getJedis();
            List<String> results = null;
            results = jedis.mget("user:{info}:id","user:{info}:age");
            for(String res:results){
                System.out.println(res);
            }
            results = jedis.mget("user:{info}:id","user:{info}:age","user:{info}:name","user:{info}:email");
            for(String res:results){
                System.out.println(res);
            }
        }
    
    

    返回结果如下所示,第一次mget执行成功,是因为两个键都迁移完成,第二次获取失败是因为存在ask重定向问题。

    232132
    20
    
    redis.clients.jedis.exceptions.JedisDataException: TRYAGAIN Multiple keys request during rehashing of slot
    
    

    2.使用pipline做批量处理

    @Test
        public void testPiplione(){
            //创建JedisCluster时,节点地址可以只填写部分,集群内部可以通过cluster nodes获取所有节点信息
            JedisSlotBasedConnectionHandler connectionHandler = new JedisCluster(new HostAndPort("192.168.0.31",6380),1000,1000,5,"1234@abcd",new JedisPoolConfig()){
                public JedisSlotBasedConnectionHandler getConnectionHandler() {
                    return (JedisSlotBasedConnectionHandler) super.connectionHandler;
                }
            }.getConnectionHandler();
            List<String> keys = Arrays.asList("user:{info}:id","user:{info}:age","user:{info}:name","user:{info}:email");
            Jedis jedis = connectionHandler.getConnectionFromSlot(JedisClusterCRC16.getSlot(keys.get(3)));
            try {
                Pipeline pipelined = jedis.pipelined();
                for (String key : keys) {
                    pipelined.get(key);
                }
                List<Object> results = pipelined.syncAndReturnAll();
                for (Object result : results) {
                    System.out.println(result);
                }
            } finally {
                jedis.close();
            }
        }
    
    

    批处理结果如下,当存在重定向问题时,pipline不会抛出异常,而是直接返回异常对象,并且成功迁移的键能获取到值。

    redis.clients.jedis.exceptions.JedisAskDataException: ASK 5642 192.168.0.33:6380
    redis.clients.jedis.exceptions.JedisAskDataException: ASK 5642 192.168.0.33:6380
    peter
    132132@163.com
    
    

    基于异常结果对象,可以获取到对应的重定向节点信息,根据获取到的节点信息获取连接再次发送请求。

    @Test
        public void testPiplione2(){
            JedisSlotBasedConnectionHandler connectionHandler = new JedisCluster(new HostAndPort("192.168.0.31",6380),1000,1000,5,"1234@abcd",new JedisPoolConfig()){
                public JedisSlotBasedConnectionHandler getConnectionHandler() {
                    return (JedisSlotBasedConnectionHandler) super.connectionHandler;
                }
            }.getConnectionHandler();
            List<String> keys = Arrays.asList("user:{info}:id","user:{info}:age","user:{info}:name","user:{info}:email");
            Jedis jedis = connectionHandler.getConnectionFromSlot(JedisClusterCRC16.getSlot(keys.get(3)));
            try {
                Pipeline pipelined = jedis.pipelined();
                for (String key : keys) {
                    pipelined.get(key);
                }
                List<Object> results = pipelined.syncAndReturnAll();
                for (int i =0 ; i<keys.size() ; i++) {
                    // 键顺序和结果顺序,Pipeline严格按照键发送的顺序返回结果,即使出现异常也是如此
                    Object result = results.get(i);
                    //判断是否是异常结果对象
                    if (result != null && result instanceof JedisAskDataException) {
                        JedisAskDataException askException = (JedisAskDataException) result;
                        //根据异常结果对象获取节点信息
                        HostAndPort targetNode = askException.getTargetNode();
                        //根据节点信息获取jedis连接
                        Jedis targetJedis = connectionHandler.getConnectionFromNode(targetNode);
                        try {
                            // 执行asking
                            targetJedis.asking();
                            // 获取key并执行
                            String key = keys.get(i);
                            String targetResult = targetJedis.get(key);
                            System.out.println(targetResult);
                        } finally {
                            targetJedis.close();
                        }
                    } else {
                        System.out.println(result);
                    }
                }
            }finally {
                jedis.close();
            }
        }
    
    

    以下是执行结果,可以看出pipline可以根据返回的异常结果对象,获取ask重定向节点信息,发送ask请求,获取返回结果,这点和mget不一样,mget出现ask重定向问题时会直接抛出异常。

    232132
    20
    peter
    132132@163.com
    
    

    集群环境下的批量操作场景,建议优先选择pipline,这样不仅可以处理slot迁移过程的ask重定向问题,还可以提高redis的IO效率。

    展开全文
  • ssm+cas+shiro+maven多次重定向问题,报错Caused by: java.io.FileNotFoundException,追踪源码发现是conn.getInputStream()执行时报的错, this.getResponseCode()=410,410代表删除了文件.。怎么解决 ...
  • 有同事反馈通过连接predixy可以成功插入数据,且能连接redis集群中的任意节点重定向查询到该数据,但却无法通过predixy查到刚插入的数据。 且经过多次测试(插入不同的key),发现只有落到其中一个节点(这里的ip:端口...

    一 问题描述

    有同事反馈通过连接predixy可以成功插入数据,且能连接redis集群中的任意节点重定向查询到该数据,但却无法通过predixy查到刚插入的数据。

    且经过多次测试(插入不同的key),发现只有落到其中一个节点(这里的ip:端口是192.168.119.206:6386)上的key的value无法通过predixy查询到。

    predixy节点和该节点的日志也都没有任何报错,该节点的从库倒是有报错:unable to connect to master:no such file or directory。

    二 排查思路

    predixy支持读写分离:

    当从库出问题后,predixy可能会无法读取到数据。

    三 解决办法

    这里通过重启了从库(可以正常识别到自己的主库了),问题得以解决的,哈哈。

    展开全文
  • Redis Cluster本身提供了自动将数据分散到Redis Cluster不同节点的能力,分区实现的关键点问题包括:如何将数据自动地打散到不同的节点,使得不同节点的存储数据相对均匀;如何保证客户端能够访问到正确的节点和数据...
  • 2021-01-18-Redis问题

    2021-01-18 16:09:07
    1.跳表的设计好处? 2.redis部署方式,版本之间差异 3.redis集群/原子性(key会不会在设置时同时分布在不同的redis-server,这时怎么...而是分到某个节点上后找不到值再move,重定向??set的时候,可以利用hashtag ...
  • 之前学习了 Redis 哨兵机制和 Redis 哨兵集群建立过程,当主库发生故障时,Redis 哨兵可以将合适的从库切换成主库,这样就可以保证 Redis 的高可用了,但如果 Redis 数据量变大了就会面临扩容的问题,集群的实例增减...
  •  提醒(Notification):当被监控的某个 Redis出现问题时, 哨兵(sentinel) 可以通过 API 向管理员或者其他应用程序发送通知。  自动故障迁移(Automatic failover):当一个Master不能正常工作时,哨兵(sentinel) ...
  • 自己在阿里云的ECS(配置是1G ,1核)上搭建了一个redis集群(端口7000-7005),在服务器上测试redis-cli -c -ip -p 7000执行set,get方法的时候能够正确的重定向slot(定向到公网ip+端口,创建的时候是用公网ip创建的)...
  • ${redis.keyPrefix}_session_" /> </bean> <!-- </bean>--> <!-- 定义授权缓存管理器 --> <!-- </bean> --> <!-- 保证实现了Shiro内部lifecycle函数的bean执行 --> ...
  • moved异常,ask重定向

    2019-05-05 10:43:40
    1:moved异常集群的问题 ...计算该key的槽位 redis-cli -c -p 7000 会自动跳转到指定的端口 2:ask重定向,迁移过程遇到的问题 重定向解决的类似问题 3:区别 moved槽已结确定迁移 ask槽实在迁移中的 ...
  • 自己在阿里云的ECS(配置是1G ,1核)上搭建了一个redis集群(端口7000-7005),在服务器上测试redis-cli -c -ip -p 7000执行set,get方法的时候能够正确的重定向slot(定向到公网ip+端口,创建的时候是用公网ip创建的)...
  • 一:安装 1安装tp6需要参考官网... ... 2安装composer需要指定当前php版本的php.ini位置,如果不让选择位置 固定老版本软件的php位置,这个问题可以选择安装的第一步 选择上面这个就可以解决!(如果php版本不是7.1~
  • 转载自背景知识我们知道后端是通过session来维持用户的会话的,每当用户发起一个请求的时候,用户的浏览器就会将用户的...否则重定向到授权页面或者返回错误码。因为是NodeJS是单线程的,为了充分利用CPU的多核特性...
  •  架构:nginx+php5.6+redis+mysql5.7 问题  网站使用的是tinkphp,搭建测试环境时,遇到许多问题,此处记录一下nginx配置导致的一些问题  环境搭建完成之后(配置未做任何修改之前),代码放置网站目录下,...
  • 前后端分离 ajax请求后台重定向

    万次阅读 2018-04-12 17:42:15
    最近在做的一个前后端分离的一个项目,这就涉及到登录验证的问题。我用的是token加上filter。... 3,判断token是否有效,有效则放行,无效则重定向到登录页面。 这就存在一个问题,ajax请求返回的jso
  • 10-25 Redis Cluster常见开发运维问题-目录.mp4 10-24 故障模拟.mp4 10-23 故障恢复.mp4 10-22 故障发现.mp4 10-21 故障转移-目录.mp4 10-20 批量操作优化.mp4 10-2 集群伸缩原理.mp4 10-19 多节点操作命令....
  • Redis Cluster集群中的从节点,官方默认设置的是不分担读请求的、只作备份和故障转移用,当有请求读向从节点时,会被重定向对应的主节点来处理 三 解决办法 在get数据之前先使用命令readonly,这个readonly告诉 ...
  • 测试过程中,通过IP通过,没有任何问题,部署到生产环境中,出现了网址重复的重定向错误。类似于http://example.com/http://example.com的重定向错误,页面显示如下图所示。 解决方案 方案一:定位在config.json...
  • 最近做一个sprngboot+springsecurity+mybatis+redis后台(method鉴权表达式),vue前端后台管理 我在postman测试的时候没问题,写到vue的时候就给我报code 302, 然后就在网上查code 302,看了很多搞了很长时间,依旧...
  • 问题:crontab 启动的PHP消费REDIS键过期通知时消息不能正常入库 环境:PHP5.6 THINKPHP3 REDIS2.8 分析: 在SSH终端启动PHP消费进程可以正常消费,而通过crontab 命令定时检测消费进程是否存活的方式启动i消费...
  • 采用了Redis作为缓存,我的sessionDao大概是这样这个时候出现了两个非常令我苦恼和想不通的问题,shiro的过滤在最后设置 /*=authc后登录的时候debug发现用户名密码都是对的但是返回的页面进行的重定向回到了登录页面...
  • 遇到过的问题

    2020-05-06 19:42:00
    这样就可以把可能存在的数据删除掉,确保每一个插槽是没被占用的,最后重新尝试创建redis集群服务器,创建成功,而且服务器之间也可以实现自动重定向:对每一个节点都这样做, 然后创建集群服务器 ./redis-trib.rb ...
  • 面试问题集锦

    2018-09-06 10:37:10
    jdbc操作数据库过程 可重入锁和synchronized锁区别 synchronized的上锁机制。 1. Redis实现分布式锁 ...制除了用过redis 还有没有用过其他的缓存技术?...转发和重定向的区别? Linux...
  • Cluster 中关于读写分离的特性 Cluster 中的 slave 不接受任何读写请求; 对 slave 的读请求会重定向到负责 slot 的 master; 可以使用连接级别的命令 readonly 从...[root@redis3_0_7 config]# redis-cli -c -p 70...
  • //重定向到 /index return response.encodeRedirectURL("/index"); } @RequestMapping(value = "/showredisstutas" , method = RequestMethod.GET) public String addCourse(HttpServletResponse response, ...
  • 我发现的一个问题就是删除时由于程序内使用了绝对路径会导致重定向的路径出错,直接访问了根目录(本来应该是example.com/dir/file/delete/结果重定向到example.com/file/delete/),而且在...
  • v4.0.181024 更新日志程序功能修改缓存增加j2cache实现增加日文语言文件取消redis缓存固定容量取内容时从缓存取得最新点击数增加缓存清理的同步保护BUG与缺陷修复特定环境下页面与菜单国际化不一致BUG修复ie ...
  • java各种集合的线程安全 一,大访问量,高并发网站优化 大访问量,高并发网站优化 ...分布式Redis面试常见问题及知识点归纳 四,缓存框架 缓存重点知识总结以及分布式缓存框架redis和Memca...

空空如也

空空如也

1 2 3
收藏数 58
精华内容 23
关键字:

redis重定向问题

redis 订阅