복붙노트

[SPRING] Spring Redis - 기본 항목이 만료 된 후에 삭제되지 않은 색인

SPRING

Spring 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. ==============================

    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. ==============================

    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;
        }
    }
    
  3. from https://stackoverflow.com/questions/41693774/spring-redis-indexes-not-deleted-after-main-entry-expires by cc-by-sa and MIT license