springboot与redis缓存集成的两种使用方式:
1.调用式 com.beyondsoft.rdc.cloud.fnb.service.sys.RedisService类 提供了基本的缓存设置读取使用方法
/** * redis接口 * * @author xupengfei02@beyondsoft.com * @date 2018-05-25 * @version: 1.0 */ public interface RedisService { /** * 添加字符串 * * @param key key * @param value value */ void set(String key, String value); /** * 获取 * * @param key key * @return String */ String get(String key); /** * 删除 * * @param key key */ void delete(String key); /** * 设置key的超时时间 * * @param key key * @param expire expire * @return boolean */ boolean expire(String key, long expire); /** * 添加对象 * * @param key key * @param obj obj必须实现Serializable接口 */ void setObj(String key, Object obj); /** * 获取对象 * * @param key key * @param clazz clazz类必须实现Serializable接口 */ Object getObj(String key, Class clazz); /** * 获取list * * @param key key * @param clazz clazz类必须实现Serializable接口 */ Object getList(String key, Class clazz); }
2.注解式
@Cacheable:主要用作查询,如果根据key从redis中没查到就去mysql查并且把返回结果插入redis,下次直接从redis取;
@CachePut:主要用作更新,如果根据key从redis中没查到就去mysql查并且把返回结果插入redis,如果从redis查到那么也去mysql查一遍,所以不管redis中有没有都去查mysql,所以主要用作更新
@CacheEvict:主要用作删除,根据key从redis中删除数据
参考网址:https://www.cnblogs.com/imyijie/p/6518547.html
3.key的定义 RedisConstant.VER+业务名称(+业务参数)
例:找回密码业务发送的验证码的缓存key: FNB:VERIFY:100108:xupengfei (产品名称:业务名称:商户号:帐号)
Redis 配置原理:
SpringBoot自动装配是指SpringBoot根据classpath里的jar包,推断用户会用到的技术,会自动把一些必要组件装配到IOC容器当中。
需要自动装配的组件需要定义到classpath的jar包中的META-INFO/spring.factories文件。
SpringBoot自己的是在
这个properties文件中的EnableAutoConfiguration的值,就是要自动装配的组件。和Redis相关的是:
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration
@Configuration
@ConditionalOnClass({ JedisConnection.class, RedisOperations.class, Jedis.class })
@EnableConfigurationProperties(RedisProperties.class)
public class RedisAutoConfiguration {
RedisAutoConfiguration声明了3个注解。
Configuration:说明该类可以声明受IOC容器控制的Bean
ConditionalOnClass: 在classpath中存在JedisConnection RedisOperations Jedis
EnableConfigurationProperties: 配置参数在RedisProperties中定义,RedisProperties负责读取在配置文件中和redis相关的配置
@ConfigurationProperties(prefix = “spring.redis”)
public class RedisProperties {
RedisProperties会读取并存储配置文件中spring.redis开始的配置
@Bean
@ConditionalOnMissingBean(RedisConnectionFactory.class)
public JedisConnectionFactory redisConnectionFactory()
throws UnknownHostException {
return applyProperties(createJedisConnectionFactory());
}
自动装配类中定义了RedisConnectionFactory的实现:JedisConnectionFactory
所以我们可以在外部直接Autowired它。
@Bean
@ConditionalOnMissingBean(name = "redisTemplate")
public RedisTemplate<Object, Object> redisTemplate(
RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
@Bean
@ConditionalOnMissingBean(StringRedisTemplate.class)
public StringRedisTemplate stringRedisTemplate(
RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
同时也定义了stringRedisTemplate,如果不需要额外的配置,那就可以直接使用自动装配的。
如果要扩展它,就在自定义的config中声明相同的覆盖它。
因为自动装配是在自定义装配后面,所以下面的条件就不满足了
@ConditionalOnMissingBean(name = “redisTemplate”)
当容器里没有name=“redisTemplate”的时候, 也就是说,我们自定义的bean的名字必须叫redisTemplate,否则就不会覆盖
我们之所以要覆盖自动装配定义的:redisTemplate
是因为它默认的存储序列化方式是jdk的序列化方式,传入一个对象时,序列化后的格式不可读。
我们想把json的序列化方式设置进去。
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;