虽然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);
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐