TIL

NoSQL 읽고 쓰기 - Redis

RedisItemReader

RedisItemReader

SCAN 명령어는 STRING 타입 전용 명령어이기에 RedisItemReaderSTRING 타입만 지원한다. 별도 타입을 처리하려면 커스텀 ItemReader를 구현해야 한다.

RedisItemReader 동작 과정

RedisItemReader의 약점

RedisItemReader 구성

RedisItemReader
│
├────── RedisTemplate
│       └─ (Redis 작업을 수행하는 핵심 컴포넌트)
│
├────── Cursor
│       └─ (SCAN 명령으로 생성된 Redis 커서)
│
└────── ScanOptions
        └─ (SCAN 명령 수행 시 사용할 옵션들)
    @Bean
    fun attackLogReader(): RedisItemReader<String, AttackLog> =
        RedisItemReaderBuilder<String, AttackLog>()
        .redisTemplate(redisTemplate)
            .scanOptions(
                ScanOptions
                    .scanOptions()
                    .match("attack:*") // attack: 으로 시작하는 키만 스캔
                    .count(10)
                    .build(),
            ).build()

RedisItemReader의 한계

@Override
public V read() throws Exception {
    if (this.cursor.hasNext()) {
       K nextKey = this.cursor.next();
       return this.redisTemplate.opsForValue().get(nextKey);
    }
    else {
       return null;
    }
}

SpringBatch 6에 이 항목이 반영될 수도 있으니 기대해 보자.

RedisItemWriter

@Bean
fun deleteAttackLogWriter(): RedisItemWriter<String, AttackLog> =
    RedisItemWriterBuilder<String, AttackLog>()
        .redisTemplate(redisTemplate)
        .itemKeyMapper { attackLog: AttackLog -> "attack:" + attackLog.id }
        .delete(true)
        .build()