springboot 使用 RedisTemplate
虽然springboot有提供一些封装好的redis 但有一些复制的情景还是得用RedisTemplate来解决.首先是redisConfig 注册与实现 复制黏贴@Componentpublic class RedisCacheConfig {@Beanpublic RedisTemplate<String, ?> redisTemplate(RedisConnectionFacto
·
虽然springboot有提供一些封装好的redis 但有一些复制的情景还是得用RedisTemplate来解决.
首先是redisConfig 注册与实现 复制黏贴
@Component
public class RedisConfig {
public static final Duration DEFAULT_ENTRY_TTL = Duration.ofMinutes(10);
@Bean
@ConditionalOnMissingBean(name = "redisTemplate")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
return redisTemplateConfig(connectionFactory);
}
public RedisTemplate<String, Object> redisTemplateConfig(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
//使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
Jackson2JsonRedisSerializer<Object> serializer = jsonRedisSerializer();
StringRedisSerializer stringSerializer = stringRedisSerializer();
template.setKeySerializer(stringSerializer);
template.setHashKeySerializer(stringSerializer);
template.setValueSerializer(serializer);
template.setHashValueSerializer(serializer);
template.afterPropertiesSet();
return template;
}
private Jackson2JsonRedisSerializer<Object> jsonRedisSerializer() {
Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
//解决jackson2无法反序列化LocalDateTime的问题
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
mapper.registerModule(new JavaTimeModule());
serializer.setObjectMapper(mapper);
return serializer;
}
private StringRedisSerializer stringRedisSerializer() {
return new StringRedisSerializer();
}
@Bean
public RedisCacheManager redisCacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(DEFAULT_ENTRY_TTL)
.disableCachingNullValues()
//修改 结构 树化显示 默认是两个冒号有问题
.computePrefixWith(cacheName -> cacheName + ":")
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(stringRedisSerializer()))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jsonRedisSerializer()));
// if (cacheProperties.getRedis().getTimeToLive() != null) {
// config = config.entryTtl(cacheProperties.getRedis().getTimeToLive());
// }
return RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(config).build();
}
}
springboot默认用的就是用@Cacheable 封装redisTemplate
@Cacheable 会自动将value属性和key属性用两个冒号拼接
由于上方配置中将其重写一个冒号,就会有树化结构
需要借助一些工具类,比如mac可以使用RDM(Redis Desktop Manager), 设置打开树化结构即可
大概就是这样
拼接参数时,key用冒号连接即可, 不过要有两个同样的key才会这样分层.
在redis里原本是这样滴 如果只有一条数据 他就不会分层.
像这个结构 接下来两条数据都是false:2:5 所以不会再细分
因为前面配置重写过了, 可以直接注入使用redisTemplate
@Resource
private RedisTemplate redisTemplate;
即可使用
//写入数据
redisTemplate.boundValueOps("StringKey").set("StringValue");
//读取数据
String stringValue = (String) redisTemplate.boundValueOps("StringKey").get();
//删除数据
Boolean result = redisTemplate.delete("StringKey");
虽然支持模糊搜索不过比较麻烦
默认只支持用前缀模糊搜索, 也就是@Cacheable的value
Set keys = redisTemplate.keys("prefix:*");
这样就能获取到模糊搜索捞到的所有key,再去看要删除还是读取.
hash类型:
在类中使用, 先注入(前面配置类中有注册了这个bean)
@Resource
private RedisTemplate redisTemplate;
再使用
HashOperations<String, String, Object> hashOperations = redisTemplate.opsForHash();
//获取数据
Object cacheValue = hashOperations.get(hashKey, key);
//获取hashKey下所有的键值对
Set<Map.Entry<String, Integer>> entries = hashOperations.entries(hashKey).entrySet();
//放入数据
hashOperations.put(hashKey,key, newValue);
//删除数据
hashOperations.delete(hashKey, key);
更多推荐
已为社区贡献5条内容
所有评论(0)