key设计
1、可读性和可管理性
# 业务名:表名:id
getpersoninfo:person:1
2、简洁性
减少key长度,建议不超过39字节 例子 humanresource:employee:88301 -> hr:emp_88301
3、特色字符
key 不要包含特殊字符(空格,换行,引号),建议使用英文与数字
不同类型的应用场景
序列化
JdkSerializationRedisSerializer
pojo对象的存储场景,使用jdk本身序列化机制,是默认机制,采用ObjectInputsStream/ObjectOutputStream进行序列化
StringRedisSerializer
采用string的方式序列化
Jackson2JsonRedisSerializer
利用jackson-json工具,将pojo序列化成json格式存储
GenericFastJsonRedisSerializer
javabean与json之间的转换,同时需要指定calss类型
springboot中的应用
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; @Configuration public class RedisTemplateConfiguration { /** * @param redisConnectionFactory * @return */ @Bean public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory); // 使用Jackson2JsonRedisSerialize 替换默认序列化 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper objectMapper = new ObjectMapper(); //对于Null值不输出 objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); jackson2JsonRedisSerializer.setObjectMapper(objectMapper); // 设置key和value的序列化规则 redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); // 设置hashKey和hashValue的序列化规则 redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer); //afterPropertiesSet和init-method之间的执行顺序是afterPropertiesSet 先执行, init-method 后执行。 redisTemplate.afterPropertiesSet(); return redisTemplate; }
声明式缓存
@Cacheable/@CacheResult 读取/设置缓存
@CachePut 添加/更新缓存
@CacheEvict/@CacheRemove 移除缓存
springboot 使用
1、引入@EnableCaching
2、使用@Cacheable(value="查询的key",key=“#查询的具体字段”,condition=“#查询条件”,cacheManager=“缓存自定义处理方式-对应下面的cachemangager方法”)
自定义缓存处理方式
使用spring cache 的困扰
1、默认spring cache采用::分割数据,并不是约定俗称的冒号分割
2、默认使用jdk序列化,jdk序列化生成的字节流较大,应该改为json序列化
3、spring cache注解不支持expire过期时间,需要自己编写代码实现
@Configuration public class SpringCacheConfgiration { @Bean @Primary //设置默认的CacheManager public CacheManager cacheManager(LettuceConnectionFactory factory){ //加载默认Spring Cache配置信息 RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig(); //设置有效期为1小时 config = config.entryTtl(Duration.ofHours(1)); //说明缓存Key使用单冒号进行分割 config = config.computePrefixWith(cacheName -> cacheName + ":"); //Redis Key采用String直接存储 config = config.serializeKeysWith(RedisSerializationContext.SerializationPair.from Serializer(new StringRedisSerializer())); //Redis Value则将对象采用JSON形式存储 config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fr omSerializer(new GenericJackson2JsonRedisSerializer())); //不缓存Null值对象 config = config.disableCachingNullValues(); //实例化CacheManger缓存管理器 RedisCacheManager cacheManager = RedisCacheManager.RedisCacheManagerBuilder //绑定REDIS连接工厂 .fromConnectionFactory(factory) //绑定配置对象 .cacheDefaults(config) //与声明式事务注解@Transactional进行兼容 .transactionAware() //完成对象构建 .build(); return cacheManager; } //为不同的TTL创建不同的CacheManager @Bean public CacheManager cacheManager1m(LettuceConnectionFactory factory){ //加载默认Spring Cache配置信息 RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig(); //设置有效期为1小时 config = config.entryTtl(Duration.ofMinutes(1)); //说明缓存Key使用单冒号进行分割 config = config.computePrefixWith(cacheName -> cacheName + ":"); //Redis Key采用String直接存储 config = config.serializeKeysWith(RedisSerializationContext.SerializationPair.from Serializer(new StringRedisSerializer())); //Redis Value则将对象采用JSON形式存储 config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fr omSerializer(new GenericJackson2JsonRedisSerializer())); //不缓存Null值对象 config = config.disableCachingNullValues(); //实例化CacheManger缓存管理器 RedisCacheManager cacheManager = RedisCacheManager.RedisCacheManagerBuilder //绑定REDIS连接工厂 .fromConnectionFactory(factory) //绑定配置对象 .cacheDefaults(config) //与声明式事务注解@Transactional进行兼容 .transactionAware() //完成对象构建 .build(); return cacheManager; } }
标签:缓存,规约,redis,开发,import,new,序列化,config,redisTemplate From: https://www.cnblogs.com/caixiaozi/p/18119705