spingboot2.2x + redis2.2 使用 @Cacheable、@CacheEvict、@CachePut 零侵入式使用redis缓存数据

<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.2.5.RELEASE</version>
	</parent>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>

新增RedisConfig.java 

@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {

   @Autowired
   private RedisProperties redisProperties;

   /** JEDIS默认槽 **/
   public static final int  MASTER_REDIS_INDEX = 2;

   @Bean
   public KeyGenerator keyGenerator() {
      return (target, method, params) -> {
         StringBuilder sb = new StringBuilder();
         sb.append(target.getClass().getName());
         sb.append(method.getName());
         for (Object obj : params) {
            sb.append(obj.toString());
         }
         return sb.toString();
      };
   }
   /**
    * redis缓存管理器
    */
   @Bean
   @Primary
   public CacheManager cacheManager(RedisConnectionFactory factory) {
      return RedisCacheManager.builder(factory)
              .cacheDefaults(this.cacheConfiguration(Duration.ofHours(6)))
              .withInitialCacheConfigurations(this.cacheConfigurationMap())
              .build();
   }

   /**
    * redis缓存管理器配置列表;
    * 可以根据业务需要配置不同的过期时间;
    */
   private Map<String, RedisCacheConfiguration> cacheConfigurationMap() {
      Map<String, RedisCacheConfiguration> configurationMap = new HashMap<>();
      configurationMap.put("tokenInfo", this.cacheConfiguration(Duration.ofSeconds(21600L)));
      configurationMap.put("online", this.cacheConfiguration(Duration.ofSeconds(1800L)));
      configurationMap.put("userInfo", this.cacheConfiguration(Duration.ofSeconds(21600L)));
      configurationMap.put("user_ext", this.cacheConfiguration(Duration.ofSeconds(21600L)));
      configurationMap.put("userBank", this.cacheConfiguration(Duration.ofSeconds(21600L)));
      configurationMap.put("open_info_cur", this.cacheConfiguration(Duration.ofSeconds(5L)));
      configurationMap.put("lottery_info", this.cacheConfiguration(Duration.ofSeconds(1800L)));
      configurationMap.put("input_result_ft", this.cacheConfiguration(Duration.ofSeconds(3600L)));
      configurationMap.put("input_result_bk", this.cacheConfiguration(Duration.ofSeconds(3600L)));
      return configurationMap;
   }

   /**
    * redis缓存管理器的默认配置;
    * @param ttl 设置默认的过期时间,防止 redis 内存泄漏
    */
   private RedisCacheConfiguration cacheConfiguration(Duration ttl) {
      RedisSerializer<String> redisSerializer = new StringRedisSerializer();
      GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
      RedisCacheConfiguration config=RedisCacheConfiguration.defaultCacheConfig();
      config= config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
              .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer));
      return config.entryTtl(ttl).disableCachingNullValues().
              computePrefixWith(s -> s+"_");
   }

   @Bean
   public RedisTemplate<String, Object> redisTemplate(@Qualifier("jedisConnectionFactory")JedisConnectionFactory connectionFactory) {
      GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
      RedisTemplate<String, Object> template = new RedisTemplate<>();
      template.setConnectionFactory(connectionFactory);
      template.setValueSerializer(jackson2JsonRedisSerializer);
      // 使用StringRedisSerializer来序列化和反序列化redis的key值
      template.setKeySerializer(new StringRedisSerializer());
      template.afterPropertiesSet();
//      RedisUtil.setRedisTemplate(template);
//		RedisMsg.setRedisTemplate(template);
      return template;
   }

   @Bean
   public StringRedisTemplate stringRedisTemplate(@Qualifier("jedisConnectionFactory")JedisConnectionFactory connectionFactory) {
      GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
      StringRedisTemplate template = new StringRedisTemplate();
      template.setConnectionFactory(connectionFactory);
      template.setValueSerializer(jackson2JsonRedisSerializer);
      // 使用StringRedisSerializer来序列化和反序列化redis的key值
      template.setKeySerializer(new StringRedisSerializer());
      template.afterPropertiesSet();
      return template;
   }

   @Bean("jedisConnectionFactory")
   JedisConnectionFactory jedisConnectionFactory(){
      RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
      redisStandaloneConfiguration.setHostName(redisProperties.getHost());
      redisStandaloneConfiguration.setPort(redisProperties.getPort());
      redisStandaloneConfiguration.setDatabase(MASTER_REDIS_INDEX);
      redisStandaloneConfiguration.setPassword(redisProperties.getPassword());
      JedisClientConfiguration.JedisPoolingClientConfigurationBuilder jpcf = (JedisClientConfiguration.JedisPoolingClientConfigurationBuilder) JedisClientConfiguration.builder();
      //修改我们的连接池配置
      jpcf.poolConfig(jedisPoolConfig());
      //通过构造器来构造jedis客户端配置
      JedisClientConfiguration jedisClientConfiguration = jpcf.build();
      return new JedisConnectionFactory(redisStandaloneConfiguration,jedisClientConfiguration);
   }


   /**
    * 连接池配置信息
    */
   @Bean
   public JedisPoolConfig jedisPoolConfig(){
      return new JedisPoolConfig();
   }

   @Bean
   RedisSentinelConfiguration getSentinelConfig() {
      Sentinel sentinelProperties = redisProperties.getSentinel();
      if (sentinelProperties != null) {
         RedisSentinelConfiguration config = new RedisSentinelConfiguration();
         config.master(sentinelProperties.getMaster());
         config.setSentinels(this.createSentinels(sentinelProperties));
         return config;
      } else {
         return null;
      }
   }

   private List<RedisNode> createSentinels(Sentinel sentinel) {
      ArrayList<RedisNode> sentinels = new ArrayList<>();
      String nodes = sentinel.getNodes().get(0); //String nodes = sentinel.getNodes()
      String[] var4 = StringUtils.commaDelimitedListToStringArray(nodes);
      for (String node : var4) {
         try {
            String[] ex = StringUtils.split(node, ":");
            assert ex != null;
            sentinels.add(new RedisNode(ex[0], Integer.parseInt(ex[1])));
         } catch (RuntimeException var9) {
            throw new IllegalStateException("Invalid redis sentinel property '" + node + "'", var9);
         }
      }
      return sentinels;
   }
   @Bean
   CountDownLatch latch() {
      return new CountDownLatch(1);
   }

}

这时候来看如何使用

 @Caching(put = {
           @CachePut(value = {"tokenInfo"},key = "'admin_' + #result.uid",condition = "#result != null"),
           @CachePut(value = {"online"}, key = "'admin_' + #result.uid", condition = "#result != null")
   })
   public TokenInfo login(String account, String password, String requestIp, UserEquipmentVO equipment) throws Exception, TransactionException {
      Admin admin = this.adminDao.get(account);
       return admin;
}

该方法返回不为空则会自动添加到redis里面去。

发布了35 篇原创文章 · 获赞 1 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/u010494101/article/details/104609915
今日推荐