Redis的客户端有很多,如Jedis,Jredis,Spring Data Redis….,所以SpringBOOT用了Spring Data Redis为了Redis提供了一种自动化的配置,我们只要添加相关依赖和相关配置就行。这里将说明如何整合redis单机和整合redis集群。
一 SpringBoot整合Redis单机
1.添加相关依赖
org.springframework.boot
spring-boot-starter-data-redis
org.springframework.boot
spring-boot-starter-web
默认的时候spring-boot-starter-data-redis使用的Redis工具是Lettuce,但是你要改成Jedis,只要去除Lettuce引用Jedis,其他不变。
org.springframework.boot
spring-boot-starter-data-redis
io.lettuce
lettuce-core
redis.clients
jedis
2.配置Redis
接下来我们只要在配置文件application.properties中配置Redis连接信息就行。如:
spring.redis.database=0 #redis有16库
spring.redis.host=l92.168.174.10 #redis的IP
spring.redis.port=6379 #redis的端口
spring.edis.password=l23@123 #redis的密码
spring.redis.jedis.pool.max-active=8 #redis的连接池最大连接数
spring.redis.jedis.pool.max-idle=8 #redis的连接池中最大连接空闲数
spring.redis.jedis.pool.max-wait=-1ms #redis的连接池中最大等待时间,-1,表示没有限制
spring.redis.jedis.pool.min-idle=0 #redis的连接池中最小连接空闲数
我们只要配置这2个,其他的springboot就能帮我们自动配置了,我们就能直接用了。如springboot的自动配置源码:
@Configuration
@ConditionalOnClass({RedisOperations.class})
@EnableConfigurationProperties({RedisProperties.class})
@Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})
public class RedisAutoConfiguration {
public RedisAutoConfiguration() {
}
@Bean
@ConditionalOnMissingBean(
name = {"redisTemplate"}
)
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
RedisTemplate<Object, Object> template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
@Bean
@ConditionalOnMissingBean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
我们可以从这个注解@EnableConfigurationProperties({RedisProperties.class})看出springboot把我们的application.properties配置信息注入到RedisProperties中,从下面的2个Java配置方法可以看出,如果我们没有提供redisTemplate,stringRedisTemplate的实例,SpringBoot就会帮我们创建者2个实例。而这2个正是提供操作Redis的基本方法。
redisTemplate,stringRedisTemplate操作Redis
public class Book implements Serializable {
private Integer id;
private String name;
private String author;
//省略getter/setter
}
@Rest Controller public class BookController {
@Autowired
RedisTemplate redisTemplate;
@Autowired StringRedisTemplate stringRedisTemplate;
@GetMapping(”/testl”)
public void testl(){
//使用stringRedisTemplate
ValueOperations<String,String> opsl=stringRedisTemplate.opsForValue();
opsl.set(”name”,”三国演义”);//向Redis中存储一条记录
String name=opsl.get(”name”); //将之读取出来
System.out.println(name);
//使用redisTemplate
ValueOperationsops2=redisTemplate.opsForValue();
Bookbl=newBook();
bl.setid(l);
bl.setName(”红楼梦”);
bl.setAuthor(”曹雪芹”);
ops2.set(”bl”,bl);//向Redis中存储一个对象
Bookbook=(Book)ops2.get(”bl”); //将之读取出来
System.out.println(book);
}
}
StringRedisTemplate和RedisTemplate的区别
StringRedisTemplate是RedisTemplate的子类,StringRedisTemplate中的问和value都是字符串,采用的序列化方案是StringRedisSerializer,而RedisTemplate则可以用来操作对象,RedisTemplate采用的序列化方案是JdkSerializationRedisSerializer。无论是StringRedisTemplate还是RedisTemplate,操作Redis的方法都是一致的.StringRedisTemplate和RedisTemplate都是通过opsForValue、opsForZSet或者opsForSet等方法首先获取一个操作对象,再使用该操作对象完成数据的读写。
二 SpringBoot整合Redis集群
集群和单机的差不多,但是默认的自动配置是单机的,就是配置类要我们自己配置,创建StringRedisTemplate和RedisTemplate,其他操作方法是一样的。
修改配置文件
由于有多个节点,我们最好用application.yml的配置文件。
spring:
redis:
cluster:
ports:
-8001
-8002
-8003
-8004
-8005
-8006
host: 192.168.174.10
poolConfig:
max-total: 8
max-idle: 8
max-wait-millis: -1
min-idle: 0
我这里的集群是在一台机器的,所以Ip就一个,而端口是一个数组,配置这样,我们等下好获取。
配置Reids信息,创建StringRedisTemplate和RedisTemplate
@Configuration
@ConfigurationProperties("spring.redis.cluster") //
public class RedisConfig {
List<Integer> ports;
String host;
JedisPoolConfig poolConfig;
@Bean
RedisClusterConfiguration redisClusterConfguration(){
RedisClusterConfiguration configuration=newRedisClusterConfiguration();
List<RedisNode>nodes=newArrayList<>();
for(Integerport:ports){
nodes.add(newRedisNode(host,port));
}
configuration.setPassword(RedisPassword.of("123@123"));
configuration.setClusterNodes(nodes);
return configuration;
}
@Bean
JedisConnectionFactory jedisConnectionFactory(){
JedisConnectionFactory factory=newJedisConnectionFactory(redisClusterConfiguration(),poolConfig);
return factory;
}
@Bean
RedsTemplate redisTemplate(){
RedisTemplate redisTemplate=new RedisTemplate();
redisTemplate.setConnectionFactory(jedisConnectionFactory());
redisTemplate.setKeySerializer(newStringRedisSerializer());
redisTemplate.setValueSerializer(newJdkSerializationRedisSerializer());
return redisTemplate;
}
@Bean StringRedisTemplate stringRedisTemplate(){
StringRedisTemplate stringRedisTemplate=new StringRedisTemplate(jedisConnectionFactory());
stringRedisTemplate.setKeySerializer(newStringRedisSerializer());
stringRedisTemplate.setKeySerializer(newStringRedisSerializer());
return stringRedisTemplate;
//省set和get方法
}
}
代码说明:
通过@CorrfigurationProperties注解声明直文件前缀,配直文中定义的ports数组、host以及连接池配直信息都将被注入ports、host、poolConfig三个属性中。
配直RedisClusterConfiguration实例,设直Redis登录密码以及Redis节点信息。
根据RedisClusterConfiguration实例以及连接池配直信息创建JedisJedisConnectionFactory.
根据JedisConnectionFactory创建RedisTemplate和StringRedisTemplate,同时配直key和value的序列化方式。
有了RedisTemplate和StringRedisTemplate,剩下的用法就和上面的一样了
在这引用Redis的安装和配置方法:Redis的下载和安装与集群的配置解决redis requiresRuby version >= 2.2.2的问题
原创来源:滴一盘技术