사용된 스프링부트 관련 정보
현재 사용되는 스프링 부트 버전은 1.5.2.RELEASE
, 数据库操作使用的是 spring-boot-starter-data-jpa
,redis使用的是spring-boot-starter-data-redis
데이터베이스 작업에는 spring boot에서 제공하는 JPA 저장소를 사용하고, redis는 Redis Repositories를 사용합니다.
일반적인 시나리오는 JPA를 통해 mysql에 데이터를 저장하고 성공한 후 redis의 해시 개체를 업데이트하는 것입니다.
Spring Data Redis Repositories 공식 문서 소개에 따라 엔터티를 구성해야 합니다.
2.관련 코드
주문 저장을 예로 들어 DTO를 전달하고 jpa 메서드를 호출하여 데이터베이스에 쓰고 성공 후 캐시에 씁니다.
주요 코드는 다음과 같습니다.
메인 파일에서 캐싱을 활성화하는 데 사용
@EnableRedisRepositories(basePackages = {"com.test"})
@EnableCaching
RedisConfig는 일부 캐싱 기능을 다시 작성합니다
으아악OrderService는 데이터를 데이터베이스에 저장하기 위해 save 메소드를 호출합니다. 이 양식은 여기에서 사용됩니다@CachePut
注解,生成的key的主键是order:100
으아악
으아악
지금 내가 겪고 있는 주요 문제는 다음과 같습니다.1)
.Order
实体配置中,如果我在Id
上配置了 redis 的 ID 注解 @org.springframework.data.annotation.Id
, 生成的redis key类似这样 order:1222702657038933405
, 我想要的效果是生成的key直接使用订单id,类似这样 order:100
에 구성이 있지만 적용되지 않습니다. @CachePut(value = "order", key = "#order.id")
으아악
3) Redis에서 잘못된 키가 생성되는 문제를 제쳐두고, Redis 개체는 성공적으로 저장할 수 있지만 데이터베이스 레코드가 성공적으로 생성되지 않는 것을 발견했습니다. Order 엔터티에서 주석을 제거하면 데이터베이스 레코드는 성공적으로 생성될 수 있지만 캐시는 성공적으로 생성될 수 없습니다. @RedisHash(value = "order")
우선 키는 속성 이름이어야 합니다
으아악둘째, @RedisHash는 객체를 Redis에 유지하는 데 사용됩니다. 여기서 사용하려는 것은 지속성이 아닌 Redis 캐시이므로 RedisHash와는 아무런 관련이 없습니다.