当前主流的Redis部署成集群方案有以下几种:
- 客户端分片
- 国内开源Codis
- Twitter开源的Twemproxy
- Redis官方 Cluster集群模式(服务端sharding)
这里只讲解官方的去中心化的cluster集群模式。
当redis的服务器集群搭建好了,对于Java客户端的调用(这里只针对使用了Springboot 的项目的客户端的配置),该怎么配置和显示的调用呢?
对于springboot的用户,使用redis的客户端还是比较方便的,首先第一步是要选择redis的java客户端,redis的java客户端又好几种,官方推荐的有三种:Jedis、Redisson和lettuce
jedis是最简单好用的,功能相对较少,Redisson相对高级点,支持分布式事务,lettuce基于netty,并发能力更强点,但是使用相对复杂,有点学习成本。因此,这里只介绍使用jedis的客户端的配置。
1、 依赖配置(pom文件)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<exclusions>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
</exclusions>
</dependency>
2、property文件的配置
spring.redis.cluster.max-redirects=3
#一般集群模式是采用经典的3主3从,则需要将所有的节点都配置上,jedis自动做分片和路由
spring.redis.cluster.nodes=127.0.0.1:6379,127.0.0.2:6379,127.0.0.3:6379,127.0.0.4:6379,127.0.0.5:6379,127.0.0.6:6379
spring.redis.timeout=5000ms
spring.redis.jedis.pool.max-active=8
spring.redis.jedis.pool.max-idle=8
spring.redis.jedis.pool.max-wait=-1
spring.redis.jedis.pool.min-idle=0
spring.redis.database=0
#如果有配置密码,这里必须要写上密码值
spring.redis.password=
3、配置springboot内置的RedisTemplate类的序列化和反序列化方式
这里需要写一个配置类:
@Configuration
@EnableCaching
public class RedisConfiguration {
@Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
//这里选择使用阿里的fastjson作为序列化和反序列化的方式
FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer(Object.class);
template.setValueSerializer(fastJsonRedisSerializer);
template.setHashValueSerializer(fastJsonRedisSerializer);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
// hash的key也采用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// value序列化方式采用fastjson
template.setValueSerializer(fastJsonRedisSerializer);
// hash的value序列化方式采用fastjson
template.setHashValueSerializer(fastJsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
4、在需要使用redis的地方,先注入RedisTemplate
@Autowired
private RedisTemplate redisTemplate;
然后,在需要使用的时候,使用RedisTemplate 自带的api,则可以实现curd的操作:
eg:
redisTemplate.hasKey(token);
RedisTemplate的api包含以下方法,可参考下:
如果觉得Redistemplate的api不够用或者不好用,可以自定义覆盖这些api则可以,这里不做详细介绍,自行上网上查例子。