SpringBoot2.X整合Redis(集万篇之总结)
在学习过程当中偶然遇到了redis,深深感受到他的强大之处。本篇博客就SpringBoot整合redis,
springboot1.X与2.X整合方式略有不同,本篇着重介绍2.X整合方法;
GitHub地址:
https://github.com/Guoxxin/springbootRedis.git
环境配置:
- Springboot 2.0.6
- redis 3.2.100
链接:https://pan.baidu.com/s/1rbZkjd8vtlm9-IHnIbhX8g
提取码:wuly - redis可视化工具
链接:https://pan.baidu.com/s/1RKEkbs2qKQZ3PyABHaPTVQ
提取码:20f4
项目结构图:
代码实现:
- pom.xml引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
2.yml文件配置
spring:
datasource:
username: root
password: root
url: jdbc:mysql://localhost:3306/vueblog?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
driver-class-name: com.mysql.jdbc.Driver
jpa:
show-sql: true
hibernate:
ddl-auto: update
redis:
host: 127.0.0.1
port: 6379
password:
timeout: 3600ms #超时时间
jedis:
pool:
max-active: 8 #最大连接数
max-idle: 8 #最大空闲连接 默认8
max-wait: -1ms #默认-1 最大连接阻塞等待时间
min-idle: 0 #最小空闲连接
- 增加redis配置类 RedisConfig.java
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
// 配置连接工厂
template.setConnectionFactory(factory);
//使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
// 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jacksonSeial.setObjectMapper(om);
// 值采用json序列化
template.setValueSerializer(jacksonSeial);
//使用StringRedisSerializer来序列化和反序列化redis的key值
template.setKeySerializer(new StringRedisSerializer());
// 设置hash key 和value序列化模式
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(jacksonSeial);
template.afterPropertiesSet();
return template;
}
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
// 生成一个默认配置,通过config对象即可对缓存进行自定义配置
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
config = config.entryTtl(Duration.ofMinutes(1)) // 设置缓存的默认过期时间,也是使用Duration设置
.disableCachingNullValues(); // 不缓存空值
// 设置一个初始化的缓存空间set集合
Set<String> cacheNames = new HashSet<>();
cacheNames.add("timeGroup");
cacheNames.add("user");
// 对每个缓存空间应用不同的配置
Map<String, RedisCacheConfiguration> configMap = new HashMap<>();
configMap.put("timeGroup", config);
configMap.put("user", config.entryTtl(Duration.ofSeconds(120)));
RedisCacheManager cacheManager = RedisCacheManager.builder(redisConnectionFactory)// 使用自定义的缓存配置初始化一个cacheManager
.initialCacheNames(cacheNames) // 注意这两句的调用顺序,一定要先调用该方法设置初始化的缓存名,再初始化相关的配置
.withInitialCacheConfigurations(configMap)
.build();
return cacheManager;
}
}
4.redisTemplate具体使用方法
redisTemplate.opsForValue().set("你好啊","你好啊!!!");
ValueOperations vo = redisTemplate.opsForValue();
vo.set("所有的博客",all);
查询缓存中的 “所有的博客” 缓存
@RequestMapping("/getRedisBlog")
public Result getredisBlog(){
ValueOperations operations = redisTemplate.opsForValue();
Object result = operations.get("所有的博客");
return new Result(200,"获取成功",result);
}
ValueOperations接口说明
这个接口的实现类为DefaultValueOperations,default这个类同时继承AbstractOperation,我们来看下这个类的构造函数:
DefaultValueOperations(RedisTemplate<K, V> template) {
super``(template);
}
这个类非公开的,需要传入template来构造。但是我们是无法访问的。不过不要急,在RedisTemplate中,已经提供了一个工厂方法:opsForValue()。这个方法会返回一个默认的操作类。另外,我们可以直接通过ValueOperations operations = redisTemplate.opsForValue();
来进行注入。
opsForValue()集合使用说明
1). set(K key,V value)
新建缓存
redisTemplate.opsForValue().set("key","value");
2). get(Object key)
获取缓存
edisTemplate.opsForValue().get("key");
具体可见 https://357029540.iteye.com/blog/2388965
讲的特别详细!!!