1、在springboot项目中引入redis的包,即在pom.xml文件中导入一下依赖,刷新maven可看见右侧依赖 2、使用缓存前在项目启动类(Demo1Application)中开启缓存 3、启动redis 4、配置application.properties文件以连接redis 5、导入redis配置类
/** * Redis配置类 * @author xiaoshu */ @Configuration public class RedisConfig { // ${cache} 获取配置文件的配置信息 #{}是spring表达式,获取Bean对象的属性 @Value("${spring.cache.ttl}") //${spring.cache.ttl}:绝对路径 private int ttlParams; /** * @param redisConnectionFactory * @功能描述 redis作为缓存时配置缓存管理器CacheManager,主要配置序列化方式、自定义 * <p> * 注意:配置缓存管理器CacheManager有两种方式: * 方式1:通过RedisCacheConfiguration.defaultCacheConfig()获取到默认的RedisCacheConfiguration对象, * 修改RedisCacheConfiguration对象的序列化方式等参数【这里就采用的这种方式】 * 方式2:通过继承CachingConfigurerSupport类自定义缓存管理器,覆写各方法,参考: * https://blog.csdn.net/echizao1839/article/details/102660649 * <p> * 切记:在缓存配置类中配置以后,yaml配置文件中关于缓存的redis配置就不会生效,如果需要相关配置需要通过@value去读取 */ @Bean public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig(); redisCacheConfiguration = redisCacheConfiguration // 设置key采用String的序列化方式 .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(StringRedisSerializer.UTF_8)) //设置value序列化方式采用jackson方式序列化 .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(serializer())) //当value为null时不进行缓存 .disableCachingNullValues() // 配置缓存空间名称的前缀 .prefixCacheNameWith("demo:") //全局配置缓存过期时间【可以不配置】 .entryTtl(Duration.ofMinutes(30L)); //专门指定某些缓存空间的配置,如果过期时间【主要这里的key为缓存空间名称】 Map<String, RedisCacheConfiguration> map = new HashMap<>(); map.put("user", redisCacheConfiguration.entryTtl(Duration.ofSeconds(ttlParams))); return RedisCacheManager .builder(redisConnectionFactory) .cacheDefaults(redisCacheConfiguration) //默认配置 .withInitialCacheConfigurations(map) //某些缓存空间的特定配置 .build(); } /** * 自定义缓存的redis的KeyGenerator【key生成策略】 * 注意: 该方法只是声明了key的生成策略,需在@Cacheable注解中通过keyGenerator属性指定具体的key生成策略 * 可以根据业务情况,配置多个生成策略 * 如: @Cacheable(value = "key", keyGenerator = "cacheKeyGenerator") */ @Bean public KeyGenerator keyGenerator() { /** * target: 类 * method: 方法 * params: 方法参数 */ return (target, method, params) -> { //获取代理对象的最终目标对象 StringBuilder sb = new StringBuilder(); sb.append(target.getClass().getSimpleName()).append(":"); sb.append(method.getName()).append(":"); //调用SimpleKey的key生成器 Object key = SimpleKeyGenerator.generateKey(params); return sb.append(key); }; } /** * @param redisConnectionFactory:配置不同的客户端,这里注入的redis连接工厂不同: JedisConnectionFactory、LettuceConnectionFactory * @功能描述 :配置Redis序列化,原因如下: * (1) StringRedisTemplate的序列化方式为字符串序列化, * RedisTemplate的序列化方式默为jdk序列化(实现Serializable接口) * (2) RedisTemplate的jdk序列化方式在Redis的客户端中为乱码,不方便查看, * 因此一般修改RedisTemplate的序列化为方式为JSON方式【建议使用GenericJackson2JsonRedisSerializer】 */ @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = serializer(); RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); // key采用String的序列化方式 redisTemplate.setKeySerializer(StringRedisSerializer.UTF_8); // value序列化方式采用jackson redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer); // hash的key也采用String的序列化方式 redisTemplate.setHashKeySerializer(StringRedisSerializer.UTF_8); //hash的value序列化方式采用jackson redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer); redisTemplate.setConnectionFactory(redisConnectionFactory); return redisTemplate; } /** * 此方法不能用@Ben注解,避免替换Spring容器中的同类型对象 */ public GenericJackson2JsonRedisSerializer serializer() { return new GenericJackson2JsonRedisSerializer(); } }
6、自动装配cache对象 7、缓存注解使用 注解 作用 参数 @EnableCaching 开启缓存 / @Cacheable 对方法返回结果进行缓存 cacheNames / value / key / keyGenerator @CacheEvict 清空缓存 cacheNames / value / key / keyGenerator @CachePut 保证方法被调用,又希望结果被缓存 cacheNames / value / key/ keyGenerator 8、安装redis helper并连接redis 9、使用RESTED查询一个用户 10、回到IDEA刷新缓存对象