SpringBoot学习:集成redis

发布于 2019-02-23  2565 次阅读


引入redis依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
 修改项目启动类,增加注解@EnableCaching,开启缓存功能 

application.yml中配置Redis连接信息,如下:

redis:
database:
0
host: 127.0.0.1
port: 6379
password:
jedis:
pool:
# 最大空闲连接
max-idle: 8
# 最小空闲链接
min-idle: 0
# 最大连接数(负数表示没有限制)
max-active: 8
# 链接超时时间(毫秒)
timeout: 5

新建Redis缓存配置类RedisConfig

package com.example.demo.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.cache.RedisCacheWriter;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.time.Duration;


/**
* Redis缓存配置类
*
*
@author szekinwin
*/
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {

@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
@Value("${spring.redis.timeout}")
private int timeout;

//缓存管理器
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration
.defaultCacheConfig()
.entryTtl(Duration.ofHours(1)); // 设置缓存有效期一小时
return RedisCacheManager .builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory))
.cacheDefaults(redisCacheConfiguration)
.build();
}

@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);
}
}
注:springboot2.x中,RedisCacheManager已经没有了单参数的构造方法

Soringboot1.x版本
//缓存管理器
@Bean
public CacheManager cacheManager(@SuppressWarnings("rawtypes")RedisTemplate redisTemplate) { RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate); //设置缓存过期时间
cacheManager.setDefaultExpiration(10000);
return cacheManager;
}

在相应的Mapper上使用@CacheConfig(cacheNames = "XXXX")注解

@Select("select * from sms_system")
public List<System> systemList();

/**
* 根据ID获取系统信息
*
@param id
* @return
*/
@Select("select * from sms_system where id=#{id}")
@Cacheable(key ="#p0")
public System getByid(@Param("id") String id);

//如果指定为 true,则方法调用后将立即清空所有缓存
@CacheEvict(key ="#p0",allEntries=true)
@Delete("delete from sms_system where id=#{id}")
void deleteById(@Param("id")String id);

 @Cacheable将查询结果缓存到redis中,(key="#p0")指定传入的第一个参数作为redis的key。

  @CachePut,指定key,将更新的结果同步到redis中

  @CacheEvict,指定key,删除缓存数据,allEntries=true,方法调用后将立即清除缓存


个人博客,用于记录工作日常的问题。