[SPRING] Spring Redis - 기본 항목이 만료 된 후에 삭제되지 않은 색인
SPRINGSpring Redis - 기본 항목이 만료 된 후에 삭제되지 않은 색인
Spring Data Repository로 새로운 엔트리를 저장하고 있습니다. 각 항목마다 TTL 10 초가 있습니다.
색인으로 항목을 저장할 때 Redis에서 얻은 정보는 다음과 같습니다.
127.0.0.1:6379> keys *
1) "job:campaignId:aa"
2) "job:a6d6e491-5d75-4fd0-bd8e-71692f6d18be"
3) "job:recipient:dd"
4) "job:a6d6e491-5d75-4fd0-bd8e-71692f6d18be:phantom"
5) "job:listId:cc"
6) "job:accountId:bb"
7) "job"
8) "job:a6d6e491-5d75-4fd0-bd8e-71692f6d18be:idx"
만료 후에도 데이터가 남아 있습니다.
127.0.0.1:6379> keys *
1) "job:campaignId:aa"
2) "job:recipient:dd"
3) "job:listId:cc"
4) "job:accountId:bb"
5) "job"
6) "job:a6d6e491-5d75-4fd0-bd8e-71692f6d18be:idx"
어떤 TTL도없이.
왜 그들은 스스로를 삭제하지 않는가? 내가 어떻게 할 수 있니?
해결법
-
==============================
1.Spring 데이터 Redis Repository는 여러 Redis 기능을 사용하여 Redis에서 도메인 개체를 유지합니다.
Spring 데이터 Redis Repository는 여러 Redis 기능을 사용하여 Redis에서 도메인 개체를 유지합니다.
도메인 개체는 주로 해시에 저장됩니다 (작업 : a6d6e491-5d75-4fd0-bd8e-71692f6d18be). Redis가 키를 만료 할 수 있도록 모든 만료가 해시에 직접 적용됩니다. Spring 데이터 Redis는 또한 특정 필드 값별로 조회를 제공하는 보조 색인 (작업 : campaignId : aa, job : recipient : dd)을 관리합니다. 집합 내의 개별 요소는 만료 될 수 없습니다. 전체 데이터 구조 만 만료 될 수 있지만 만료되지 않은 요소가 모두 사라지므로 원하는 작업이 아닙니다.
따라서 Spring Data Redis는 약간 긴 TTL을 가진 원래 해시의 복사본을 유령 해시 (작업 : a6d6e491-5d75-4fd0-bd8e-71692f6d18be : 팬텀)로 유지합니다.
Spring 데이터 Redis는 만료 이벤트를 수신하기 위해 @EnableRedisRepositories (enableKeyspaceEvents = EnableKeyspaceEvents.ON_STARTUP)를 설정하여 키 이벤트를 구독합니다. 원래 데이터 해시가 만료 되 자마자 Spring Data Redis는 팬텀 해시를로드하여 정리를 수행합니다 (보조 인덱스에서 참조를 제거합니다 ).
데이터 정리를 수행하지 않은 이유는 여러 가지 이유가있을 수 있습니다.
-
==============================
2.만료 시간을 설정하지 않으면 키 / 값이 자동으로 삭제되지 않습니다.
만료 시간을 설정하지 않으면 키 / 값이 자동으로 삭제되지 않습니다.
자동으로 데이터를 삭제하려면 만료 시간을 설정해야합니다.
redis> SET mykey "Hello" "OK" redis> EXPIRE mykey 10 (integer) 1
참조 : https://redis.io/commands/expire
아래는 Redis에 데이터를 추가하고 만료 시간을 설정하는 Spring 코드 스 니펫입니다.
@Component public class RedisUtil { @Autowired private RedisTemplate<String, String> template; @Resource(name = "redisTemplate") ValueOperations<String, String> ops; public boolean addValue(String key, String value) { if (template.hasKey(Constants.REDIS_KEY_PREFIX + key)) { // key is already there return false; } else { ops.set(Constants.REDIS_KEY_PREFIX + key, value); template.expireAt(Constants.REDIS_KEY_PREFIX + key, 10); } return true; } }
from https://stackoverflow.com/questions/41693774/spring-redis-indexes-not-deleted-after-main-entry-expires by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 스프링에서 애플리케이션 속성을 동적으로 업데이트하고 유지 관리하는 방법은 무엇입니까? [복제] (0) | 2019.06.16 |
---|---|
[SPRING] JAXBElement 랩퍼없이 JAXBElement 랩핑 응답을 JSON 마샬링하는 방법은 무엇입니까? (0) | 2019.06.15 |
[SPRING] Spring 요청 매핑 와일드 카드 예외 (0) | 2019.06.15 |
[SPRING] 목표 org.springframework.boot의 실행 기본값 : spring-boot-maven-plugin : 1.0.2.RELEASE : 리 패키징 실패 : 소스는 기존 파일을 참조해야합니다. (0) | 2019.06.14 |
[SPRING] 현재 브라우저 탭을 닫는 방법? (0) | 2019.06.13 |