觉得不错,点个赞吧!你的支持就是我的动力!微信搜索公众号【达摩克利斯之笔】获取更多资源,文末有二维码!
一、smart客户端
1.1、介绍
上片文章我们说到Redis集群的伸缩,提到有一个问题就是如果去操作Redis集群,这个key不在该节点上那么会发生moved重定向,去其他节点上操作,如果集群正在伸缩在做槽的迁移那么会发生ask重定向,会大大影响我们对Redis集群操作的性能,我们可以使用smart客户端完成高性能的操作Redis Cluster。我们通过JedisCluster对象操作Redis集群。
1.2、原理
- 从集群中选择一个可以运行的节点,使用Cluster slots初始化槽和节点映射
- 将这种映射关系存储到本地,为每一个节点创建一个Jedis Pool
- 之后直接连接到Redis节点上去执行命令
- smart客户端将key发送到指定的节点上,如果成功就会得到响应
- 如果出现连接出错,随机找个活跃节点,向其发送命令,大概率会得到 moved 异常,然后重新初始化 slot 和 node 的映射关系,再向目标节点发送命令
- 如果这样的情况连续出现 5 次,报错:
Too many cluster redirection!
二、JedisCluster使用
我们这里使用SpringBoot2.1.12去操作Redis5.0.5 Cluster
- 配置pom文件
- 配置application.yml文件,这里我只做最简单的配置
- 配置RedisConfig类,自定义RedisTemplate
- 测试
2.1、pom文件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.2、application.yml文件
spring:
redis:
cluster:
nodes: 192.168.11.101:8000,192.168.11.101:8001,192.168.11.101:8002,192.168.11.101:8003,192.168.11.101:8004,192.168.11.101:8005
timeout: 5000ms
2.3、RedisConfig类
这个类在我的《解锁Redis系列3》中写过,以及Redis的工具类都在里边,大家可以去看看
package com.stt.rediscluster.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
@Bean
@SuppressWarnings("all")
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
// hash的key也采用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// value序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash的value序列化方式采用jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
2.4、测试
这里的测试就是做了个简单的数据添加和查询
package com.stt.rediscluster.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class RedisController {
@Autowired
private RedisTemplate<String,Object> redisTemplate;
@GetMapping(value = "add")
public Object add(){
redisTemplate.opsForValue().set("stt","石添添");
Object stt = redisTemplate.opsForValue().get("stt");
return stt;
}
@GetMapping(value = "get")
public Object get(){
return redisTemplate.opsForValue().get("stt");
}
}
到这我们就完成对Redis的基本操作,如果你用的不是SpringBoot而是传统的springMVC框架那么这里会复杂点
未完待续... ...
写在最后:
各位的支持和认可(点赞)是我最大的动力,请不要轻轻的来,用力留下你的足迹!
本篇文章有任何错误希望不吝指出,不胜感激!我们下篇再见!
求知并无捷径,如果有,那就是放弃这个幼稚的想法,静下心来多读书、总结