Redis是目前使用最为广泛的缓存中间件,也是排名热度最高的KV型Nosql,这里着重记录一下在SpringBoot中如何快速集成Redis,以及一些基本的操作用法。

Spring Boot 提供了对 Redis 集成的组件包:spring-boot-starter-data-redis,它依赖于 spring-data-redis 和 lettuce。Spring Boot 1.0 默认使用的是 Jedis 客户端,2.0 替换成了Lettuce。
Redis集成
1.依赖与配置
SpringBoot中集成Redis只需要添加两个依赖项即可,其中commons-pool2是为创建Redis的连接池。
<!-- redis支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
application配置Redis的环境信息
# Redis 数据库索引(默认为 0)
spring.redis.database=0
# Redis 服务器器地址
spring.redis.host=localhost
# Redis 服务器器连接端⼝口
spring.redis.port=6379
# Redis 服务器器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制) 默认 8
spring.redis.lettuce.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
spring.redis.lettuce.pool.max-wait=-1
# 连接池中的最大空闲连接默认 8
spring.redis.lettuce.pool.max-idle=8
# 连接池中的最小空闲连接默认 0
spring.redis.lettuce.pool.min-idle=0
以上就可以完成了对Redis的环境配置。
2.Redis开发使用
Redis 支持多种数据类型,实体、哈希、列列表、集合、有序集合,现在就把对常用的数据类型操作进行逐一展示:
- Pojo类型,支持对象的直接存储:
@Test
public void testObj(){
User user=new User("Micheal", "JorDon", 44, "American");
ValueOperations<String, User> operations=redisTemplate.opsForValue();
operations.set("com.example", user);
User u=operations.get("com.example");
System.out.println("user: "+u.toString());
}
对于每一个数据的时候都可以设置一个超时时间:
operations.set("expire", user,100,TimeUnit.MILLISECONDS);
- HASH,一般传入三个参数,第一个为Key,后面两个才是Hash对。
@Test
public void testHash() {
HashOperations<String, Object, Object> hash = redisTemplate.opsForHash();
hash.put("hash","you","you");
String value=(String) hash.get("hash","you");
System.out.println("hash value :"+value);
}
除了单个Hash操作还可以利用putAll()
批量存入:
Map<Object, Object> userMap= Maps.newHashMap();
userList.forEach( user-> {
userMap.put(user.getId(), user.getName());
});
redisTemplate.opsForHash().putAll(redisKey, userMap);
- List类型,Redis的List类型是双向链表实现,可支持左右方向的操作。
@Test
public void testList() {
ListOperations<String, String> list = redisTemplate.opsForList();
list.leftPush("list","1");
list.leftPush("list","2");
list.leftPush("list","3");
String value=(String)list.leftPop("list");
System.out.println("list value :"+value.toString());
}
- Set类型,无序自动排重
SetOperations<String, String> set = redisTemplate.opsForSet();
- ZSet,有序自动排重
ZSetOperations<String, String> zset = redisTemplate.opsForZSet();
Redis的多源配置
在一些业务场景上,有可能会使用到多源Redis的情景,这个时候需要提供一些区别数据源的配置来声明使用对应的Redis。
1.声明一个抽象Redis配置类:
public abstract class AbstractRedisConfig {
//redis集群节点 redis-1:4307,redis-2:4744格式,以英文逗号为分隔
private String nodes;
//redis集群密码
private String password;
public String getNodes(){
return nodes;
}
public void setNodes(String nodes){
this.nodes = nodes;
}
public String getPassword(){
return password;
}
public void setPassword(String password){
this.password = password;
}
public RedisConnectionFactory connectionFactory() throws Exception{
RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration(Arrays.asList(nodes.split(",")));
redisClusterConfiguration.setPassword(RedisPassword.of(password));
LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(redisClusterConfiguration);
// 需要手动调用下才会初始化
lettuceConnectionFactory.afterPropertiesSet();
return lettuceConnectionFactory;
}
/**
* 定义模板多数据源方法
* @return
*/
public abstract StringRedisTemplate getRedisTemplate() throws Exception;
}
2.代码实现不同Redis数据源的读取
不同源的写法在下面都一样,主Redis源会比其他的多一个@Primary注解,其他写法都是仿照来配置,在前缀和Bean声明上来区分即可:
主Redis源代码:
@ConfigurationProperties(prefix = "spring.redis.cluster.one")
@Configuration
public class FirstRedisConfig extends AbstractRedisConfig {
/**
* 生成redis集群操作diversityRedisTemplate<br/>
* 注意使用 @Resource 注解,如果是用@Autoware时 需要@Qualifier指定别名
*/
@Bean(name = "firstRedisTemplate")
@Primary
@Override
public StringRedisTemplate getRedisTemplate() throws Exception
{
return new StringRedisTemplate(connectionFactory());
}
}
第二套Redis源代码:
@ConfigurationProperties(prefix = "spring.redis.cluster.second")
@Configuration
public class SecondRedisConfig extends AbstractRedisConfig {
/**
* 生成redis集群操作moRedisTemplate<br/>
* 注意使用 @Resource 注解,如果是用@Autoware时 需要@Qualifier 指定别名
*/
@Bean(name = "secondRedisTemplate")
@Override
public StringRedisTemplate getRedisTemplate() throws Exception{
return new StringRedisTemplate(connectionFactory());
}
}
3.配置文件声明
在application配置文件里写好两套Redis的环境信息,密码如果无可以空白。
spring.redis.cluster.first.nodes=redis-1:6379,redis-1:6380,redis-1:6381
spring.redis.cluster.first.password=
spring.redis.cluster.second.nodes=redis-2:6379,redis-2:6380,redis-2:6381
spring.redis.cluster.second.password=
4.注入使用
在别的类中,声明使用Redis的方法,即可通过在数据源中@Bean中指定的名称直接注入使用即可:
@Resource
private StringRedisTemplate firstRedisTemplate;
网友评论