Redis由于数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1),支持丰富数据类型,也支持事务,操作都是原子性,还具有其他丰富的特性,如可按key设置过期时间,过期后将会自动删除.因此我们通常使用redis来作为缓存,下面我根据实际项目经验总结了SpringBoot整合Redis做缓存的步骤.
1.pom.xml中引入依赖jar包:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2、修改项目启动类,增加注解@EnableCaching,开启缓存功能
@SpringBootApplication() @EnableCaching //开启缓存 public class AppStart { public static void main(String[] args) { SpringApplication.run(AppStart.class, args); } }
3、application.properties中配置Redis连接信息(也可以在application.yml或者使用JavaBean的形式设置配置信息),如下:
# Redis数据库索引(默认为0) spring.redis.database=0 # Redis服务器地址 spring.redis.host=172.31.19.222 # Redis服务器连接端口 spring.redis.port=6379 # Redis服务器连接密码(默认为空) spring.redis.password= # 连接池最大连接数(使用负值表示没有限制) spring.redis.pool.max-active=8 # 连接池最大阻塞等待时间(使用负值表示没有限制) spring.redis.pool.max-wait=-1 # 连接池中的最大空闲连接 spring.redis.pool.max-idle=8 # 连接池中的最小空闲连接 spring.redis.pool.min-idle=0 # 连接超时时间(毫秒) spring.redis.timeout=0
4、新建Redis缓存配置类RedisConfig,如下:
import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; 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.cache.interceptor.SimpleKeyGenerator; 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.core.StringRedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import java.lang.reflect.Method; /** * 注解式环境管理 * @author dongchuan * @date 2018/4/18 */ @Configuration @EnableCaching public class RedisConfig extends CachingConfigurerSupport { /**缓存全局有效时间,默认30分钟.*/ private static final int CACHE_EXPIRATION = 30 * 60; /** * 在使用@Cacheable时,如果不指定key,则使用找个默认的key生成器生成的key */ @Override public KeyGenerator keyGenerator() { return new SimpleKeyGenerator() { /** * 对参数进行拼接后MD5 */ @Override public Object generate(Object target, Method method, Object... params) { StringBuilder sb = new StringBuilder(); sb.append(target.getClass().getName()); sb.append(".").append(method.getName()); StringBuilder paramsSb = new StringBuilder(); for (Object param : params) { // 如果不指定,默认生成包含到键值中 if (param != null) { paramsSb.append(param.toString()); } } if (paramsSb.length() > 0) { sb.append("_").append(paramsSb); } return sb.toString(); } }; } // 定制缓存管理器的属性,默认提供的CacheManager对象可能不能满足需要 // 因此建议依赖业务和技术上的需求,自行做一些扩展和定制 @Bean public CacheManager cacheManager(@SuppressWarnings("rawtypes") RedisTemplate redisTemplate) { RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate); //设置缓存默认过期时间(全局的) redisCacheManager.setDefaultExpiration(CACHE_EXPIRATION); return redisCacheManager; } //序列化 @Bean public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) { StringRedisTemplate template = new StringRedisTemplate(factory); 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); template.afterPropertiesSet(); return template; } }