Redis Cluster的查询不到Vlaue的原因
redis 是什么
什么是Cluster
背景:
公司的Redis使用的架构是Cluster的模式,如下图模式,也是为了可扩展,还有HA,之前的生产环境都是正常的,没有任何问题的,但是最近突然发现,部分KEY 查询不到Redis数据,进行了数据库查询,量级也不是很大的,但是有个部门的新老业务进行替换的过程中,由于为了敏捷开发,快速迭代(省事,偷懒),最新的操作直接对缓存修改,没有更新数据库,如果查询不到noSql数据,就会产生脏数据,很是头疼的问题,所以要快速定位问题并解决,业务上解决也是很简单的.
解决方案
- 本地缓存数据 ->Redis ->Mysql
- Redis查询不到数据-再次查询数据->Mysql
- Redis查询不到数据->Nocos/(Apollo)->Mysql
业务上是可以解决问题了,但是为什么会发生查询不到的情况呢,客户端我们使用的是
官方首选推荐的客户端,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查询的过程是这样的
查询不到数据大概会出现的原因是
- 序列化问题
- Jedis问题 并发的情况socket 查询不到
- RedisTemplate 的问题
- Redis Cluster 的问题
- 从新分配卡槽
- 连接超时了
- Bigkey
- 网卡问题