一、添加依赖
SpringBoot本身就提供了一个支持redis的jar,因此,首先添加以下依赖
<!--redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
二、配置redis
这里我使用的是application.yml,如使用的是application.properties的话需更改下
redis:
# Redis数据库索引(默认为0)
database: 0
# Redis服务器地址
host:
# Redis服务器连接端口
port:
# Redis服务器连接密码(默认为空)
password: ""
pool:
# 连接池最大连接数(使用负值表示没有限制)
max-active: 8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1
# 连接池中的最大空闲连接
max-idle: 8
# 连接池中的最小空闲连接
min-idle: 0
# 连接超时时间(毫秒)
timeout: 0
配置config的时候,我遇到了个坑,程序报了以下错误:
org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
造成这个异常的原因是,在服务器上配置redis.conf的时候,没把bind 127.0.0.1注释掉,导致外网无法访问,因此这里需要注意下。
然后不知道是因为我电脑原因还是application格式的原因,当配置redis服务器连接密码时,如果不加双引号,会报密码错误,因此如果有报redis密码错误的话,可以尝试把双引号删去试试。
三、创建RedisConfig.java类
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.lang.reflect.Method;
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport{
/**
* 此方法将会根据类名+方法名+所有参数的值生成唯一的一个key,即使@Cacheable中的value属性一样,key也会不一样。
* @return
*/
@Bean
public KeyGenerator keyGenerator(){
return new KeyGenerator(){
@Override
public Object generate(Object target, Method method, Object... params){
//格式化缓存key字符串
StringBuilder sb = new StringBuilder();
//追加类名
sb.append(target.getClass().getName());
//追加方法名
sb.append(method.getName());
//遍历参数并且追加
for(Object object : params){
sb.append(object.toString());
}
return sb;
}
};
}
/**
* 设置缓存过期时间
* @param redisTemplate
* @return
*/
@SuppressWarnings("rawtypes")
@Bean
public CacheManager cacheManager(RedisTemplate redisTemplate) {
RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
//设置缓存过期时间(秒)
rcm.setDefaultExpiration(60*60*24);
return rcm;
}
/**
* RedisTemplate缓存操作类,类似于jdbcTemplate的一个类
*
* @param factory 通过Spring进行注入,参数在application.properties进行配置
* @return
*/
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory){
RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();
redisTemplate.setConnectionFactory(factory);
//key序列化,不然会出现乱码,不能出现long类型的数据,否则会报类型转换错误
//自己实现ObjectRedisSerializer或者JdkSerializationRedisSerializer序列化方式
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(redisSerializer);
redisTemplate.setHashKeySerializer(redisSerializer);
return redisTemplate;
}
}
四、通过key-value形式操作缓存
这里最重要的就是,先要将StringRedisTemplate这个类注入到bean中,当然,除了这个类,还可以调用RedisTemplate这个类
@Resource
private StringRedisTemplate stringRedisTemplate;
@Resource
private RedisTemplate redisTemplate;
//添加缓存
@Test
public void add() {
stringRedisTemplate.opsForValue().set("aaa", "111");
}
//通过key获取缓存
@Test
public void get(){
System.out.println(stringRedisTemplate.opsForValue().get("aaa"));
}
//通过key删除缓存
@Test
public void del(){
stringRedisTemplate.delete("aaa");
}
获取redis里的缓存时,如果key不存在,那么会返回null。
五、通过在方法上加注解的方式,操作redis
@Cacheable()
public User findUser(String name){
User user = userMapper.findUser(name);
retrun user;
}
这里我直接在service层的方法上添加注解,他会自动根据我们在RedisConfig.java这个类中配置的KeyGenerator来进行存储。
网友评论