Redis Cluster的查询不到Vlaue的原因

1,421 阅读2分钟

Redis Cluster的查询不到Vlaue的原因

redis 是什么

什么是Cluster

背景:

​ 公司的Redis使用的架构是Cluster的模式,如下图模式,也是为了可扩展,还有HA,之前的生产环境都是正常的,没有任何问题的,但是最近突然发现,部分KEY 查询不到Redis数据,进行了数据库查询,量级也不是很大的,但是有个部门的新老业务进行替换的过程中,由于为了敏捷开发,快速迭代(省事,偷懒),最新的操作直接对缓存修改,没有更新数据库,如果查询不到noSql数据,就会产生脏数据,很是头疼的问题,所以要快速定位问题并解决,业务上解决也是很简单的.

解决方案

  1. 本地缓存数据 ->Redis ->Mysql
  2. Redis查询不到数据-再次查询数据->Mysql
  3. Redis查询不到数据->Nocos/(Apollo)->Mysql

业务上是可以解决问题了,但是为什么会发生查询不到的情况呢,客户端我们使用的是

[github.com/xetorthio/j…,]:

官方首选推荐的客户端,Maven 的包是

Jedis 介绍

在这里插入图片描述

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
    <type>jar</type>
    <scope>compile</scope>
</dependency>

官方的提供的Demo

    @Test
    public void ConnectionTest(){
        //1. Connecting to Redis server on localhost
        Jedis jedis = new Jedis("localhost");
        System.out.println("Connection to server sucessfully");
        //2. set the data in redis string
        jedis.set("username", "Roxin");
        //3. Get the stored data and print it
        System.out.println("Stored string in redis:: "+ jedis.get("username"));
        //4. Close the Redis connection;
        jedis.close();
   }

池化的连接

    @Test
    public void ConnectionPoolTest(){
        //连接池设定
        JedisPoolConfig config = new JedisPoolConfig();
        //设定最大连接数
        config.setMaxTotal(30);
        //设置最大空闲连接数
        config.setMaxIdle(10);
        //创建连接池
        JedisPool jedisPool = new JedisPool(config, "127.0.0.1");
        //获得服务资源
        Jedis jedis = jedisPool.getResource();
        jedis.select(1);
        jedis.set("username", "Roxin By Jedis Pool");
        System.out.println(jedis.get("username"));
        jedis.close();
        jedisPool.close();
    }

Jedis 示例代码

   @Test
    public void SetTest(){
        Jedis jedis = jedisPool.getResource();
        String setKey1 = "SETKEY-1";
        for (int i = 0; i < 10; i++) {
            //添加一个元素
            jedis.sadd(setKey1,"value-"+i);
        }
        assert 10 == jedis.scard(setKey1); //获得元素个数
        jedis.sadd(setKey1,"value-1");//添加重复的元素将失效
        assert 10 == jedis.scard(setKey1);
        String s= jedis.srandmember(setKey1);//随机获取一个元素
        assert jedis.sismember(setKey1,s);//是否为集合成员
        String setKey2 = "SETKEY-2";
        for (int i = 1; i < 11; i++) {
            jedis.sadd(setKey2,"value-"+i);
        }
        assert jedis.sdiff(setKey1,setKey2).size() == 1;//补集
        assert jedis.sinter(setKey1,setKey2).size() == 9;//交集
        assert jedis.sunion(setKey1,setKey2).size() == 11;//并集
        jedis.del(setKey1,setKey2);
        jedis.close();
    }

cluster 架构 Cluster 架构 Cluster查询的过程是这样的

查询过程

查询不到数据大概会出现的原因是

  1. 序列化问题
  2. Jedis问题 并发的情况socket 查询不到
  3. RedisTemplate 的问题
  4. Redis Cluster 的问题
  5. 从新分配卡槽
  6. 连接超时了
  7. Bigkey
  8. 网卡问题