복붙노트

[REDIS] 레디 스, 키 되세요 \ XAC \ 고정 된 \ x00부터 \ x05t \ x00부터 \ X06 봄 부팅 캐싱

REDIS

레디 스, 키 되세요 \ XAC \ 고정 된 \ x00부터 \ x05t \ x00부터 \ X06 봄 부팅 캐싱

나는 매니저 캐시에 봄 캐시 @Cacheable를 사용하고 싶습니다. 그리고 실제 캐시 레디 스입니다.

그런 내 코드 :

@PostMapping("/post")
@CachePut(value = "abc", key = "#key")
public String putInRedis(@RequestParam String key, @RequestParam String value) {
    saveInDB(key, value);

    return value;
}

@GetMapping("/get")
@Cacheable(value = "abc", key = "#key")
public String queryRedis(@RequestParam String key) {

    return findByKey(key);
}

I는 POST 요청을 한 후

레디 스 서버는 이상한 키를 표시

127.0.0.1:6379> keys *
1) "abc:\xac\xed\x00\x05t\x00\x03key"
127.0.0.1:6379> GET "abc:\xac\xed\x00\x05t\x00\x03key"
"\xac\xed\x00\x05t\x00\x05value"

봄 캐싱

이상한-레디 스 - 키 -와 - 스프링 데이터 jedis

StringRedisTemplate 기본처럼 캐시 가능의 시리얼 @ 설정하는 방법 :

public StringRedisTemplate() {
    RedisSerializer<String> stringSerializer = new StringRedisSerializer();
    setKeySerializer(stringSerializer);
    setValueSerializer(stringSerializer);
    setHashKeySerializer(stringSerializer);
    setHashValueSerializer(stringSerializer);
}

내 application.properties :

spring.redis.host=localhost
spring.redis.password=
spring.redis.port=6379

build.gradle

group 'io.freezhan'
version '1.0-SNAPSHOT'

buildscript {
    repositories {
        maven {
            url 'https://plugins.gradle.org/m2/'
        }
    }
    dependencies {
        classpath 'org.springframework.boot:spring-boot-gradle-plugin:1.4.0.RELEASE'
    }
}

task wrapper(type: Wrapper) {
    gradleVersion = '2.13'
    distributionUrl = "https://services.gradle.org/distributions/gradle-$gradleVersion-all.zip"
}

apply plugin: 'java'
apply plugin: 'spring-boot'

sourceCompatibility = 1.5

repositories {
    mavenCentral()
}

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web") {
        exclude module: "spring-boot-starter-tomcat"
    }
    compile("org.springframework.boot:spring-boot-starter-data-redis")
    compile("org.springframework.boot:spring-boot-starter-jetty")
    compile("org.springframework.boot:spring-boot-starter-actuator")
    compile 'org.projectlombok:lombok:1.16.10'
    testCompile("junit:junit")
}

해결법

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

    1.캐싱 - 구현 - 봄의 기능은 다른 캐시를 사용할 수 있습니다. 그 중 하나는 레디 스입니다. 그것은 클래스 RedisCacheManager 사용할 수 있습니다. 봄 문서는 말합니다 :

    캐싱 - 구현 - 봄의 기능은 다른 캐시를 사용할 수 있습니다. 그 중 하나는 레디 스입니다. 그것은 클래스 RedisCacheManager 사용할 수 있습니다. 봄 문서는 말합니다 :

    캐싱 - -이 내가 레디 스에 영향을 제안하는 방법입니다 통합 :

    나는 programmmatic 구성을 사용하여 인터넷에 대한 예를 발견했다. XML 기반 구성을 사용하는 예제도 있습니다.

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

    2.레디 스 템플릿 만들기

    레디 스 템플릿 만들기

    private RedisTemplate<String, ?> createRedisTemplateForEntity() {
            RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
            redisTemplate.setConnectionFactory(getRedisConnectionFactory());
            redisTemplate.setHashValueSerializer(new StringRedisSerializer());
            redisTemplate.setKeySerializer(new StringRedisSerializer());
            redisTemplate.setValueSerializer(new StringRedisSerializer());
            redisTemplate.setHashKeySerializer(new StringRedisSerializer());
            redisTemplate.afterPropertiesSet();
    
        return redisTemplate;
    }
    

    왜 키와 이상한 문자열을 만들고있다?

    키는 인수가 캐시로 주석이 당신의 방법에 존재하는 속성을 기반으로 생성됩니다. 이 봄 레디 스에서 캐시 값을 읽는 방법이다.

  3. ==============================

    3.mm759의 대답과 같은 :

    mm759의 대답과 같은 :

    이 코드는 내 문제를 해결할 것입니다 :

    package io;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cache.CacheManager;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.redis.cache.RedisCacheManager;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.data.redis.serializer.StringRedisSerializer;
    
    /**
     * Created by freezhan on 16/9/5.
     */
    @Configuration
    public class CacheConfig {
    
        @Autowired
        private StringRedisTemplate redisTemplate;
    
        @Bean
        public CacheManager cacheManager() {
            RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
            return cacheManager;
        }
    
    }
    

    그리고 레디 스는 다음과 같이 저장합니다 :

  4. from https://stackoverflow.com/questions/39324717/spring-boot-caching-with-redis-key-have-xac-xed-x00-x05t-x00-x06 by cc-by-sa and MIT license