Redis自我整理

springboot与redis缓存集成的两种使用方式:

1.调用式 com.beyondsoft.rdc.cloud.fnb.service.sys.RedisService类 提供了基本的缓存设置读取使用方法

/**
 * redis接口
 *
 * @author [email protected]
 * @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自己的是在
image.png
这个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相关的配置

扫描二维码关注公众号,回复: 1870237 查看本文章

@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;


猜你喜欢

转载自blog.csdn.net/mynah886/article/details/80507139