Spring Boot 통합 Redis 의 전체 절차

22134 단어 springboot통합redis
머리말
실제 개발 에서 캐 시 처 리 는 필수 입 니 다.클 라 이언 트 가 매번 서버 를 요청 할 수 없습니다.서버 는 매번 데이터베이스 에서 찾 아야 합 니 다.왜 캐 시 를 사용 합 니까?결국 시스템 의 운행 속 도 를 높이 기 위해 서다.사용자 가 자주 방문 하 는 내용 을 사용자 와 가장 가 까 운 곳 에 저장 하고 방문 속도 가 가장 빠 른 곳 에 저장 하여 사용자 의 응답 속 도 를 향상 시 킵 니 다.오늘 은 springboot 에서 redis 를 통합 하 는 상세 한 절 차 를 말씀 드 리 겠 습 니 다.
1.Spring Boot 의 Redis 지원
Spring 의 Redis 지원 은 Spring Data Redis 를 사용 하여 이 루어 집 니 다.일반적으로 Jedis 나 lettuce(기본 값)를 사용 합 니 다.Java 클 라 이언 트 는 org.spring from work.boot.autoconfigure.data.redis(Spring Boot 2.x)에서 redis 의 자동 설정 AutoConfigure DataRedis
 
RedisAutoConfiguration 은 RedisTemplate 와 StringRedisTemplate(키 값 만 문자 형 데이터)템 플 릿 을 제공 합 니 다.그 중에서 주 해 는@Conditional OnMissingBean 이 관건 입 니 다.이 Bean 이 Spring 에 이미 존재 한다 면 무시 하고 존재 하지 않 는 다 면 이 곳 에 등록 하여 Spring 에서 관리 할 수 있 습 니 다.즉,우 리 는 이 bean 을 다시 쓸 수 있 습 니 다.자신의 RedisTemplate 와 StringRedisTemplate 를 실현 하려 면 사실 다시 써 야 합 니 다.이 유 는 다음 과 같 습 니 다.
4.567917.우리 가 필요 로 하 는 직렬 화 를 실현 하지 못 했다
  • 범 형 은 항상이 고 대부분의 장면 에서 우 리 는가 필요 합 니 다
  • 
    @Bean
     @ConditionalOnMissingBean(
      name = {"redisTemplate"}
     )
     public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
      RedisTemplate<Object, Object> template = new RedisTemplate();
      template.setConnectionFactory(redisConnectionFactory);
      return template;
     }
    
     @Bean
     @ConditionalOnMissingBean
     public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
      StringRedisTemplate template = new StringRedisTemplate();
      template.setConnectionFactory(redisConnectionFactory);
      return template;
     }
    실전
    1.의존 도 추가
    1)spring-boot-starter-cache 의존,캐 시 관리 가 필요 합 니 다.
    
    <!-- Spring Boot Cache -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>
    2)spring-boot-starter-data-redis 의존(주:spring boot 2.x 는 data 에서)이 필요 합 니 다.redis 지원:주로 Jedis 클 라 이언 트 를 위주 로 하고 기본 lettuce 를 클 라 이언 트 로 하 는 의존 도 를 제외 합 니 다.
    
    <!-- Redis Cache -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-redis</artifactId>
      <!--   lettuce ,  jedis  -->
      <exclusions>
        <exclusion>
          <groupId>io.lettuce</groupId>
          <artifactId>lettuce-core</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    3)jedis-client 의존 이 필요 합 니 다(주:Redis Client 3 버 전 이상 은 spring-boot-starter-data-redis 와 충돌 할 수 있 습 니 다.2.9.x 를 사용 하 는 것 이 좋 습 니 다).jedis 를 클 라 이언 트 로 사용 하 는 것 이 좋 습 니 다.
    
    <!-- Redis Client 3        spring-boot-starter-data-redis   -->
    <dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>2.9.0</version>
    </dependency>
    2,redis 설정
    RedisConfig 설정 클래스 를 만 들 고@Configuration 주 해 를 추가 하 며 캐 시 관리 지원(주석 추가@EnableCashing)을 열 고 CachingConfigurer Support 를 계승 하여 키 생 성 정책 을 다시 작성 합 니 다.
    
    @Configuration
    @EnableCaching
    public class RedisConfig extends CachingConfigurerSupport {
       /**
       *   key   :    +   +             key
       * @return
       */
      @Bean
      @Override
      public KeyGenerator keyGenerator() {
        return (Object target, Method method, Object... 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();
        };
      }
    
    }
    이후 사용 한 application.yml 프로필 중 jedis 를 클 라 이언 트 로 선 택 했 습 니 다.
    
    # redis   
     redis:
       port: 6379
       # Redis       (    )
       password:
       host: xxx.xxx.xxx.xxx
       database: 0
       jedis:
        pool:
         #        (          )
         max-active: 300
         #            
         max-idle: 100
          #            (          )
         max-wait: 10000
         #       (  )
         timeout: 5000
    설정 속성 을 동시에 읽 고 JedisPoolConfig 를 주입 합 니 다.
    
    /**
       * redis      
       */
      @Value("${spring.redis.host}")
      private String host;
      @Value("${spring.redis.port}")
      private int port;
      @Value("${spring.redis.database}")
      private int database;
      @Value("${spring.redis.jedis.pool.max-idle}")
      private int maxIdle;
      @Value("${spring.redis.jedis.pool.max-wait}")
      private long maxWaitMillis;
      @Value("${spring.redis.jedis.pool.max-active}")
      private int maxActive;
    
    
      /**
       * JedisPoolConfig  
       * @return
       */
      @Bean
      public JedisPoolConfig jedisPoolConfig() {
        log.info("   JedisPoolConfig");
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxTotal(maxActive);
        jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
        jedisPoolConfig.setMaxIdle(maxIdle);
        return jedisPoolConfig;
      }
    3.직렬 화 실현
    RedisTemplate 나 StringRedisTemplate 를 정렬 하 는 동시에 등록 Bean 을 다시 씁 니 다.
    RedisTemplate 는 기본적으로 JdkSerializationRedisSerializer 를 사용 하고,StringRedisTmeplate 는 기본적으로 StringRedisSerializer 를 사용 합 니 다.하지만 모두 실제 요구 에 부합 되 지 않 는 다.
    
    /**
       *     RedisTemplate:       
       * @param redisConnectionFactory
       * @return
       */
      @Bean
      @SuppressWarnings({"rawtype", "unchecked"})
      public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
        RedisTemplate<String, Object> template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        //         
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        //     final       
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        log.info("objectMapper: {}", om);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key  String      
        template.setKeySerializer(stringRedisSerializer);
        // hash key  String      
        template.setHashKeySerializer(stringRedisSerializer);
        // value       jackson     
        template.setValueSerializer(jackson2JsonRedisSerializer);
        // hash value       jackson     
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        template.setEnableTransactionSupport(true);
        return template;
      }
    
      /**
       *     StringRedisTmeplate:    String    
       * @param redisConnectionFactory
       * @return
       */
      @Bean
      public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
        StringRedisTemplate template = new StringRedisTemplate();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        template.setConnectionFactory(redisConnectionFactory);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key  String      
        template.setKeySerializer(stringRedisSerializer);
        // hash key  String      
        template.setHashKeySerializer(stringRedisSerializer);
        // value       jackson     
        template.setValueSerializer(jackson2JsonRedisSerializer);
        // hash value       jackson     
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        return template;
      }
    4.Redis 연결 공장 을 설립 하고 Bean 등록
    Spring Boot 1.x 와 Spring Boot 2.x 의 차 이 를 주의 하 십시오.코드 에 설명 되 어 있 으 며,Spring Boot 1.x 는 JedisConnection Factory 를 사용 하고 있 습 니 다.Spring Boot 2.x 는 RedisStandalone Configuration 을 사용 한 후 JedisConnection Factory 에 전송 하여 Bean 으로 돌아 갑 니 다.
    
    /**
       *   RedisConnectionFactory
       * @return
       */
      @Bean
      public RedisConnectionFactory redisConnectionFactory(JedisPoolConfig jedisPoolConfig) {
        log.info("   JedisConnectionFactory");
        /*  Spring Boot 1.x     ,  RedisStandaloneConfiguration  
        JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(jedisPoolConfig);
        jedisConnectionFactory.setHostName(host);
        jedisConnectionFactory.setDatabase(database);*/
    
        // JedisConnectionFactory  hsot、database、password   
        RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
        redisStandaloneConfiguration.setHostName(host);
        redisStandaloneConfiguration.setPort(port);
        redisStandaloneConfiguration.setDatabase(database);
        // JedisConnectionFactory  jedisPoolConfig
        JedisClientConfiguration.JedisPoolingClientConfigurationBuilder jedisPoolConfigBuilder =
            (JedisClientConfiguration.JedisPoolingClientConfigurationBuilder)JedisClientConfiguration.builder();
        jedisPoolConfigBuilder.poolConfig(jedisPoolConfig);
        return new JedisConnectionFactory(redisStandaloneConfiguration);
    
      }
    5.완전한 RedisConfig 설정 클래스
    
    /**
     *
     * @author jian
     * @date 2019/4/14
     * @description
     * 1) RedisTemplate( StringRedisTemplate)        ,     (       ,     <Object, Object>         )
     *       RedisTemplate StringRedisTemplate)
     * 2)   RedisCacheManager       
     *
     */
    
    @Configuration
    @EnableCaching
    public class RedisConfig extends CachingConfigurerSupport {
    
      private static final Logger log = LoggerFactory.getLogger(RedisConfig.class);
    
      /**
       * redis      
       */
      @Value("${spring.redis.host}")
      private String host;
      @Value("${spring.redis.port}")
      private int port;
      @Value("${spring.redis.database}")
      private int database;
      @Value("${spring.redis.jedis.pool.max-idle}")
      private int maxIdle;
      @Value("${spring.redis.jedis.pool.max-wait}")
      private long maxWaitMillis;
      @Value("${spring.redis.jedis.pool.max-active}")
      private int maxActive;
    
    
      /**
       * JedisPoolConfig  
       * @return
       */
      @Bean
      public JedisPoolConfig jedisPoolConfig() {
        log.info("   JedisPoolConfig");
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxTotal(maxActive);
        jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
        jedisPoolConfig.setMaxIdle(maxIdle);
        return jedisPoolConfig;
      }
    
      /**
       *   RedisConnectionFactory
       * @return
       */
      @Bean
      public RedisConnectionFactory redisConnectionFactory(JedisPoolConfig jedisPoolConfig) {
        log.info("   JedisConnectionFactory");
        /*  Spring Boot 1.x     ,  RedisStandaloneConfiguration  
        JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(jedisPoolConfig);
        jedisConnectionFactory.setHostName(host);
        jedisConnectionFactory.setDatabase(database);*/
    
        // JedisConnectionFactory  hsot、database、password   
        RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
        redisStandaloneConfiguration.setHostName(host);
        redisStandaloneConfiguration.setPort(port);
        redisStandaloneConfiguration.setDatabase(database);
        // JedisConnectionFactory  jedisPoolConfig
        JedisClientConfiguration.JedisPoolingClientConfigurationBuilder jedisPoolConfigBuilder =
            (JedisClientConfiguration.JedisPoolingClientConfigurationBuilder)JedisClientConfiguration.builder();
        jedisPoolConfigBuilder.poolConfig(jedisPoolConfig);
        return new JedisConnectionFactory(redisStandaloneConfiguration);
    
      }
    
      /**
       *   RedisCacheManager       
       * @param connectionFactory
       */
      @Bean
      public CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
        RedisCacheManager redisCacheManager = RedisCacheManager.create(connectionFactory);
        return redisCacheManager;
      }
    
    
      /**
       *   key   :    +   +             key
       * @return
       */
      @Bean
      @Override
      public KeyGenerator keyGenerator() {
        return (Object target, Method method, Object... 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();
        };
      }
    
      /**
       *     RedisTemplate:       
       * @param redisConnectionFactory
       * @return
       */
      @Bean
      @SuppressWarnings({"rawtype", "unchecked"})
      public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
        RedisTemplate<String, Object> template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        //         
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        //     final       
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        log.info("objectMapper: {}", om);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key  String      
        template.setKeySerializer(stringRedisSerializer);
        // hash key  String      
        template.setHashKeySerializer(stringRedisSerializer);
        // value       jackson     
        template.setValueSerializer(jackson2JsonRedisSerializer);
        // hash value       jackson     
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        template.setEnableTransactionSupport(true);
        return template;
      }
    
      /**
       *     StringRedisTmeplate:    String    
       * @param redisConnectionFactory
       * @return
       */
      @Bean
      public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
        StringRedisTemplate template = new StringRedisTemplate();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        template.setConnectionFactory(redisConnectionFactory);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key  String      
        template.setKeySerializer(stringRedisSerializer);
        // hash key  String      
        template.setHashKeySerializer(stringRedisSerializer);
        // value       jackson     
        template.setValueSerializer(jackson2JsonRedisSerializer);
        // hash value       jackson     
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        return template;
      }
    
    }
    테스트
    1.redis 도구 류 작성
    RedisTemplate 와 StringRedisTemplate 템 플 릿 은 주요 데이터 접근 방법 을 제공 하지만:
  • ops ForValue():조작 은 간단 한 속성 만 있 는 데이터
  • ops ForList():List 를 포함 한 데 이 터 를 조작 합 니 다
  • opsForSet():set 가 함 유 된 데 이 터 를 조작 합 니 다
  • ops ForHash():hash 가 함 유 된 데 이 터 를 조작 합 니 다
  • ops ForZSet():질서 있 는 set 형식 ZSet 의 데 이 터 를 포함 합 니 다
  • 그러나 관련 이 추상 적 이 고 실현 이 복잡 하 므 로 redisTmeplate 의 간단 한 value get 작업 을 사용 할 필요 가 있다.
    
    Object result = null;
    ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
    result = operations.get(key);
    그러나 패 키 징 후 클 라 이언 트 사용자 에 비해 비교적 명확 하 다.
    
    /**
       *     
       *
       * @param key
       * @return
       */
      public Object get(final String key) {
        Object result = null;
        ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
        result = operations.get(key);
        return result;
      }
    완전한 간단 한 도구 클래스 는 다음 과 같 습 니 다.
    
    @Component
    public class RedisUtils {
    
    
      @Autowired
      private RedisTemplate redisTemplate;
    
      /**
       *        value
       *
       * @param keys
       */
      public void remove(final String... keys) {
        for (String key : keys) {
          remove(key);
        }
      }
    
      /**
       *     key
       *
       * @param pattern
       */
      public void removePattern(final String pattern) {
        Set<Serializable> keys = redisTemplate.keys(pattern);
        if (keys.size() > 0) {
          redisTemplate.delete(keys);
        }
      }
    
      /**
       *      value
       *
       * @param key
       */
      public void remove(final String key) {
        if (exists(key)) {
          redisTemplate.delete(key);
        }
      }
    
      /**
       *            value
       *
       * @param key
       * @return
       */
      public boolean exists(final String key) {
        return redisTemplate.hasKey(key);
      }
    
      /**
       *     
       *
       * @param key
       * @return
       */
      public Object get(final String key) {
        Object result = null;
        ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
        result = operations.get(key);
        return result;
      }
    
      /**
       *     
       *
       * @param key
       * @param value
       * @return
       */
      public boolean set(final String key, Object value) {
        boolean result = false;
        try {
          ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
          operations.set(key, value);
          result = true;
        } catch (Exception e) {
          e.printStackTrace();
        }
        return result;
      }
    
      /**
       *     
       *
       * @param key
       * @param value
       * @return
       */
      public boolean set(final String key, Object value, Long expireTime) {
        boolean result = false;
        try {
          ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();
          operations.set(key, value);
          redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);
          result = true;
        } catch (Exception e) {
          e.printStackTrace();
        }
        return result;
      }
    }
    2.Person 실체 류
    주의해 야 할 것 은 반드시 직렬 화 를 실현 하고 직렬 화 된 버 전 ID 가 있어 야 한 다 는 것 이다.
    
    public class Person implements Serializable {
      private final long serialVersionUID = 1L;
    
      private String id;
      private String name;
      private int age;
      private String gender;
    
      public String getId() {
        return id;
      }
    
      public void setId(String id) {
        this.id = id;
      }
    
      public String getName() {
        return name;
      }
    
      public void setName(String name) {
        this.name = name;
      }
    
      public int getAge() {
        return age;
      }
    
      public void setAge(int age) {
        this.age = age;
      }
    
      public String getGender() {
        return gender;
      }
    
      public void setGender(String gender) {
        this.gender = gender;
      }
    
      @Override
      public String toString() {
        return "Person{" +
            "id='" + id + '\'' +
            ", name='" + name + '\'' +
            ", age=" + age +
            ", gender='" + gender + '\'' +
            '}';
      }
    }
    3.테스트 클래스 작성
    Redis 도구 류 Spring 은 이미 관리(@Compent 주석 추가)를 했 습 니 다.사용 은 간단 합 니 다.RedisUtils 만 주입 하면 됩 니 다.
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class RedisTest {
    
      @Autowired
      private RedisUtils redisUtils;
    
      @Test
      public void test(){
        Person person = new Person();
        person.setAge(23);
        person.setId("001");
        person.setName("Zhangsan");
        redisUtils.set("person-001", person);
        System.out.println(redisUtils.get("person-001"));
      }
    
    }
    4.테스트 결과
    IDE 콘 솔 에서:
     
    클 라 이언 트 로그 인 후 value 값 보기
     
    총결산
    이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.

    좋은 웹페이지 즐겨찾기