前提
首先要搭建一个springboot项目并引入基础依赖,可以通过IDEA创建springboot项目也可以通过[spring官网搭建springboot项目连接](https://start.spring.io/)来构建项目。若果不会搭建请自行百度。
引入Redis依赖以及spring缓存依赖
下面是笔者引入的依赖,直接在pom文件中引入即可 。
<!-- spring-boot redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--spring缓存-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
配置yum(properties)文件
redis:
# Redis数据库索引(默认为0)
database: 0
# Redis服务器地址
host: redis地址IP
# Redis服务器连接端口
port: 6379
pool:
# 连接池最大连接数(使用负值表示没有限制)
max-active: 8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1
# 连接池中的最大空闲连接
max-idle: 8
# 连接池中的最小空闲连接
min-idle: 0
# 连接超时时间(毫秒)
timeout: 0
password: redis密码
注:笔者这里只配置了redis,代码也是伪代码,若果涉及数据库请自行添加orm框架依赖以及数据源
编写redis配置类
创建一个RedisConfig类来配置redis,配置文件继承CachingConfigurerSupport类,重写该类中的方法下面会详细解读重写方法。
缓存key生成策略重写
下面是具体代码。
// 自定义缓存key生成策略
@Bean
public KeyGenerator keyGenerator() {
return new KeyGenerator() {
@Override
public Object generate(Object target, java.lang.reflect.Method method, Object... params) {
//定义key值字符串
StringBuffer sb = new StringBuffer();
//将类的全限定名+代理模式+方法名+全部参数作为key值
sb.append(target.getClass().getName());
sb.append(method.getName());
for (Object obj : params) {
sb.append(obj.toString());
}
return sb.toString();
}
};
}
注:重写该方法用于使用@Cacheable注解时没有声明key值的情景,如若注解声明key值则缓存中的key为声明的key
使用自定义key值策略在缓存中的key值形式为下图所示:
缓存管理器重写
// 缓存管理器
@Bean
public CacheManager cacheManager(@SuppressWarnings("rawtypes") RedisTemplate redisTemplate) {
RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
// 设置缓存过期时间
cacheManager.setDefaultExpiration(10000);
return cacheManager;
}
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
StringRedisTemplate template = new StringRedisTemplate(factory);
setSerializer(template);// 设置序列化工具
template.afterPropertiesSet();
return template;
}
private void setSerializer(StringRedisTemplate template) {
@SuppressWarnings({ "rawtypes", "unchecked" })
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);
template.setValueSerializer(jackson2JsonRedisSerializer);
}
注:redis是要求对象进行序列化的,不进行序列化则会出现乱码形式
到此redis的配置文件全部结束,下面是使用阶段
代码演示
在service层写方法
package com.springboot.service;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.Cacheable;
@CacheConfig(cacheNames = "student")
public interface StudentService {
/**
* 在缓存中取key为name值的键如若取不到将结果存储在缓存中,如果取到直接在缓存中获取不走接下来的代码块
* @param name
* @return
*/
@Cacheable(key = "#name")
String getName(String name);
}
serviceImpl层实现service接口
package com.springboot.service.impl;
import com.springboot.service.StudentService;
@Service
public class StudentServiceImpl implements StudentService{
/**
* 这里是伪代码并没有连接数据库,只是简单做一下测试
* @param name
* @return
*/
@Override
public String getName(String name) {
try {
//这里将线程休眠5s可以通过相应时间直观的感受缓存
//如果缓存中有对应的key不走代码块中的代码直接返回结果
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return name;
}
}
controller层编写接口
package com.springboot.controller;
import com.springboot.service.StudentService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @Author 张佳奇
* @Description
* @Date 2020-05-12 09:24
*/
@RestController
public class Controller {
@Resource
StudentService studentService;
@RequestMapping("test")
public String ngetname(String name){
return studentService.getName(name);
}
}
至此可以进行测试,启动springboot项目,在地址栏输入接口路径访问
由于线程休眠5秒,所以页面在加载5秒后出现结果如下图所示:
可以在redis客户端看到缓存结果
然后再次访问该地址,页面直接刷新出结果,不用等待5秒,说明缓存起效,也可以在代码中加入输出语句,通过控制台测试。