Spring 에서 Redis 사용 하기

18604 단어 Java자바springredis
끌어들이다
  • Maven
  • 
        org.springframework.data
        spring-data-redis
        2.0.9.RELEASE
    
    

    Redis 연결 사용Lettuce또는Jedis
  • Lettuce Connector
  • @Configuration
    class AppConfig {
    
        @Bean
        public LettuceConnectionFactory redisConnectionFactory() {
            return new LettuceConnectionFactory(new RedisStandaloneConfiguration("server", 6379));
        }
    }
    
  • Jedis Connector
  • @Configuration
    class AppConfig {
    
        @Bean
        public JedisConnectionFactory redisConnectionFactory() {
            return new LettuceConnectionFactory(new RedisStandaloneConfiguration("server", 6379));
        }
    }
    

    보초병 모드 사용
    /**
     * jedis
     */
    @Bean
    public RedisConnectionFactory jedisConnectionFactory() {
      RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration()
      .master("mymaster")
      .sentinel("127.0.0.1", 26379)
      .sentinel("127.0.0.1", 26380);
      return new JedisConnectionFactory(sentinelConfig);
    }
    
    /**
     * Lettuce
     */
    @Bean
    public RedisConnectionFactory lettuceConnectionFactory() {
      RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration()
      .master("mymaster")
      .sentinel("127.0.0.1", 26379)
      .sentinel("127.0.0.1", 26380);
      return new LettuceConnectionFactory(sentinelConfig);
    }
    

    RedisTemplate Spring 을 사용 하여 RedisTemplate 클래스 를 제공 하여 Redis 를 조작 합 니 다.Redis 의 각종 조작 을 고도 로 추상 화하 고 서로 다른 데이터 형식 에 따라 대응 하 는 operation 을 제공 합 니 다.예 를 들 어
  • ValueOperations 문자열
  • ListOperations 리스트
  • SetOperations 집합
  • Hash Operations 해시 표
  • 저 희 는 보통 String 을 key 와 value 로 사용 하기 때문에 Spring 은StringRedisTemplate종 류 를 제공 합 니 다.이 종 류 는StringRedisSerializer을 사용 하여 직렬 화 합 니 다.
    하나의 예:
    public class Example {
    
        @Autowired
        private StringRedisTemplate redisTemplate;
    
        public void addLink(String userId, URL url) {
            redisTemplate.opsForList().leftPush(userId, url.toExternalForm());
        }
    }
    

    직렬 화 Spring 은 여러 가지 직렬 화 방식 을 제공 하 였 다.
  • JdkSerializationRedisSerializerRedisTemplate 기본 직렬 화 기 는 JDK 원생 직렬 화 방식
  • 을 사용 합 니 다.
  • StringRedisSerializer
  • Jackson2JsonRedisSerializerJackson 을 사용 하여 JSON 형식 으로 데 이 터 를 저장 합 니 다
  • GenericJackson2JsonRedisSerializerJackson 을 사용 하여 JSON 형식 으로 데 이 터 를 저장 하고 JSON 에는 대상 유형
  • 이 저 장 됩 니 다.
    우 리 는 자바 에서 항상 대상 을 저장 해 야 합 니 다.이때 설정Jackson2JsonRedisSerializer또는GenericJackson2JsonRedisSerializer할 수 있 습 니 다.
    @Bean
    public RedisTemplate<String, Person> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
        RedisTemplate<String, Person> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(lettuceConnectionFactory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Person.class));
    
        return redisTemplate;
    }
    

    혹은
    @Bean
    public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(lettuceConnectionFactory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
    
        return redisTemplate;
    }
    

    두 가지 차이 점 은GenericJackson2JsonRedisSerializer구조 할 때 자바 대상 유형 을 지정 할 필요 가 없다 는 것 이다.서로 다른 자바 대상 을 저장 하고 여러 개의 RedisTemplate 를 설정 하고 싶 지 않 을 때GenericJackson2JsonRedisSerializer를 사용 할 수 있다.Redis 에서 데 이 터 를 보면GenericJackson2JsonRedisSerializer저 장 된 JSON 데이터 가 하나@Class키 가 더 많 고 이 JSON 에 대응 하 는 자바 데이터 형식 을 저장 한 다 는 것 을 알 수 있다.
    파 이 프 를 여러 개 조작 하여 파 이 프 를 사용 하면 네트워크 통신 의 소 모 를 줄 일 수 있다.RedisTemplate관 로 를 조작 하 는 몇 가지 방법 을 제공 하 였 으 며,반환 값 에 관심 이 없 으 면 직접execute방법 을 사용 할 수 있 으 며,반환 값 이 필요 하 다 면executePipelined방법 을 사용 할 수 있다.
    List<Object> results = stringRedisTemplate.executePipelined(
      new RedisCallback<Object>() {
        public Object doInRedis(RedisConnection connection) throws DataAccessException {
          StringRedisConnection stringRedisConn = (StringRedisConnection)connection;
          for(int i=0; i< batchSize; i++) {
            stringRedisConn.rPop("myqueue");
          }
        return null;
      }
    });
    

    RedisCallback 에서 doInRedis 의 반환 값 은 null 이 어야 합 니 다.
    또 다른 적재량 전달 방법SessionCallback
     public List<Object> getLockers(List<Integer> ids) {
          return redisTemplate.executePipelined(new SessionCallback<Locker>() {
    
              @Override
              public <K, V> Locker execute(RedisOperations<K, V> operations) throws DataAccessException {
                  return null;
              }
          });
      }
    

    좋은 웹페이지 즐겨찾기