복붙노트

[REDIS] 레디 스 사용 RedisTemplate에서 설정 값을 가져옵니다

REDIS

레디 스 사용 RedisTemplate에서 설정 값을 가져옵니다

나는 Jedis를 사용하여 레디 스에서 값을 검색 할 수 있어요 :

public static void main(String[] args) {
        Jedis jedis = new Jedis(HOST, PORT);
        jedis.connect();
        Set<String> set = jedis.smembers(KEY);
        for (String s : set) {
            System.out.println(s);
        }
        jedis.disconnect();
        jedis.close();
    }

나는 봄의 RedisTemplate를 사용하려고 할 때, 나는 모든 데이터를 받고 있지 않다. 내 데이터 세트로 레디 스에 저장됩니다.

      // inject the actual template 
      @Autowired
      private RedisTemplate<String, Object> template;

      // inject the template as SetOperations
      @Resource(name="redisTemplate")
      private SetOperations<String,String> setOps;

public String logHome() {       
        Set<String> set =  setOps.members(KEY);
        for(String str:set){
            System.out.println(str); //EMPTY
        }       
        Set<byte[]> keys = template.getConnectionFactory().getConnection().keys("*".getBytes());
        Iterator<byte[]> it = keys.iterator();
        while(it.hasNext()){
            byte[] data = (byte[])it.next();
            System.out.println(new String(data, 0, data.length)); //KEYS are printed.
        }
        Set<Object> mySet = template.boundSetOps(KEY).members();        
        System.out.println(mySet); //EMPTY      
        return "";
    }

누군가가 내가 놓친 거지 무엇을 나에게 지적시겠습니까?

편집 : RedisTemplate에 대한 나의 XML을 설정.

 <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"
    p:connection-factory-ref="jedisConnectionFactory"/>

     <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
        p:host-name="myhostname" p:port="6379" />

해결법

  1. ==============================

    1.당신은 구성의 시리얼에 있습니다.

    당신은 구성의 시리얼에 있습니다.

    레디 스 템플릿은 키 값과 해시 키 / 값을 시리얼을 사용합니다. 시리얼은 레디 스에 저장되어있는 표현으로 Java 입력을 변환하는 데 사용됩니다. 당신은 아무것도, JdkSerializationRedisSerializer에 시리얼 기본값을 구성하지 않으면. 당신은 당신의 자바 코드에서 핵심 키를 요청 그렇다면, 시리얼 라이저의 변환을하는

    "\xac\xed\x00\x05t\x00\x03key"
    

    봄 데이터 레디 스 쿼리 레디 스의 핵심으로 그 바이트를 사용합니다.

    당신은 봄 데이터 레디 스 데이터를 추가 할 수 있습니다 그리고 그것은 레디 스-CLI를 사용하여 쿼리 :

    template.boundSetOps("myKey").add(new Date());
    

    다음의 레디 스-CLI

    127.0.0.1:6379> keys *
    1) "\xac\xed\x00\x05t\x00\x05myKey"
    127.0.0.1:6379> SMEMBERS "\xac\xed\x00\x05t\x00\x05myKey"
    1) "\xac\xed\x00\x05sr\x00\x0ejava.util.Datehj\x81\x01KYt\x19\x03\x00\x00xpw\b\x00\x00\x01N\xcf#\x9cHx"
    

    보시다시피, 문자열 및 날짜는 자바 직렬화 된 오브젝트를 표현 어떤 미친 바이트로 직렬화된다.

    귀하의 코드는 문자열 기반의 키와 값을 저장할 제안합니다. 그냥 RedisTemplate에 StringRedisSerializer을 설정

    자바 구성

    redisTemplate.setKeySerializer(new StringRedisSerializer());
    redisTemplate.setValueSerializer(new StringRedisSerializer());
    

    XML 구성

    <bean id="stringSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
    
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" 
        p:connection-factory-ref="jedisConnectionFactory">
        <property name="keySerializer" ref="stringSerializer"/>
        <property name="valueSerializer" ref="stringSerializer"/>
    </bean>
    
    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" 
        p:host-name="myhostname" p:port="6379"/>
    

    다음과 같은 코드의 외모를 실행 한 후 출력 :

    value
    key
    [value]
    

    봄 데이터 레디 스 다양한 시스템 간의 메시지 교환을 허용 몇 가지 흥미로운 시리얼있다. 당신은 시리얼 라이저 내장에서 하나를 선택할 수 있습니다

    또는 당신의 자신을 만들 수 있습니다.

    나는 당신의 질문의 결과를 확인하기 위해 스프링 데이터 레디 스 1.5.1.RELEASE 및 jedis 2.6.2을 사용했다. HTH, 마크

    또한 읽기 :

  2. ==============================

    2.당신은 Redisson으로 훨씬 쉽게 할 수 있습니다 :

    당신은 Redisson으로 훨씬 쉽게 할 수 있습니다 :

    public static void main(String[] args) {
        Config conf = new Config();
        conf.useSingleServer().setAddress(host + ":" + port);
    
        RedissonClient redisson = Redisson.create(conf);
        RSet<String> set = redisson.getSet(KEY)
        for (String s : set.readAllValues()) {
            System.out.println(s);
        }
        redisson.shutdown();
    }
    

    연결이 framewrok 핸들 직렬화 및 작업은 매번 그것을 처리 할 필요가 없습니다. 당신은 자바 객체 (설정,지도, 목록 ...)와 작업에 사용되는 레디 스와 작업 할 수 있습니다. 너무 많은 인기 코덱을 지원합니다.

  3. from https://stackoverflow.com/questions/31608394/get-set-value-from-redis-using-redistemplate by cc-by-sa and MIT license