Redis

Spring Data Redis로 Redis와 연동하기

쿠카이든 2022. 2. 15. 11:15
728x90
  • Redis가 타 캐시 시스템(ex. MemCache 등)과 다른 특징은 아래와 같습니다.
    • Redis는 List, Set, Sorted Set, Hash 등과 같은 Collection을 지원합니다.
    • Redis는 Single Thread → 따라서 Atomic 보장
    • persistence를 지원하여 서버가 꺼지더라도 다시 데이터를 불러들일 수 있습니다.
  • Redis의 주요 사용처
    • Remote Data Store
      • 여러 서버의 Data 공유를 위해 사용될 수 있습니다.
      • 특히, Redis의 경우 Single Thread 이므로 Race Condition 발생 가능성이 낮다는 것을 활용할 수 있습니다.
      • 인증 토큰 개발
      • Ranking Board (Sorted Set)
      • Job QUEUE 등
  • Redis Template을 Spring에 의존성 설정(pom.xml)
    • compile 'org.springframework.boot:spring-boot-starter-data-redis:2.3.1.RELEASE'
  • Redis Source-Code 설정
    • Redis 접근 Library는 Spring Data Redis에 내장되어있는 Lettuce를 사용하였습니다.
@Configuration
@EnableRedisRepositories
public class RedisConfig {

    @Value("${spring.redis.host}")
    private String redisHost;

    @Value("${spring.redis.port}")
    private int redisPort;

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory(redisHost, redisPort);
    }

    @Bean
    public RedisTemplate<?, ?> redisTemplate() {
        RedisTemplate<byte[], byte[]> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory());
        return redisTemplate;
    }
}
  • Spring Data Redis는 opsFor[X](ex. opsForValue, opsForSet, opsForZSet 등)라는 메서드를 제공합니다. 
    • 해당 메서드를 사용하면 각 자료구조에 대해서 쉽게 Serialize 및 Deserialize 할 수 있습니다. 

메서드설명

opsForValue Strings를 쉽게 Serialize / Deserialize 해주는 Interface
opsForList List를 쉽게 Serialize / Deserialize 해주는 Interface
opsForSet Set를 쉽게 Serialize / Deserialize 해주는 Interface
opsForZSet ZSet를 쉽게 Serialize / Deserialize 해주는 Interface
opsForHash Hash를 쉽게 Serialize / Deserialize 해주는 Interface
  • 이중 String과 List를 redis를 활용하여 캐싱하여 출력하면 다음과 같은 결과를 얻을 수 있습니다.
  • Redis Strings 자료구조 활용 예
@Autowired
StringRedisTemplate redisTemplate;

@Test
public void testStrings() {
    final String key = "kuka84";

    final ValueOperations<String, String> stringStringValueOperations = redisTemplate.opsForValue();

    stringStringValueOperations.set(key, "1"); // redis set 명령어
    final String result_1 = stringStringValueOperations.get(key); // redis get 명령어

    System.out.println("result_1 = " + result_1);

    stringStringValueOperations.increment(key); // redis incr 명령어
    final String result_2 = stringStringValueOperations.get(key);

    System.out.println("result_2 = " + result_2);
}
result_1 = 1
result_2 = 2      // 저장한데로 잘 출력함
  • Redis List 자료구조 활용 예
@Autowired
StringRedisTemplate redisTemplate;

@Test
public void testList() {
    final String key = "eden2";

    final ListOperations<String, String> stringStringListOperations = redisTemplate.opsForList();

    stringStringListOperations.rightPush(key, "H");
    stringStringListOperations.rightPush(key, "e");
    stringStringListOperations.rightPush(key, "l");
    stringStringListOperations.rightPush(key, "l");
    stringStringListOperations.rightPush(key, "o");

    stringStringListOperations.rightPushAll(key, " ", "e", "d", "e", "n");

    final String character_1 = stringStringListOperations.index(key, 1);

    System.out.println("character_1 = " + character_1);

    final Long size = stringStringListOperations.size(key);

    System.out.println("size = " + size);

    final List<String> ResultRange = stringStringListOperations.range(key, 0, 9);

    System.out.println("ResultRange = " + Arrays.toString(ResultRange.toArray()));
}
character_1 = e
size = 10
ResultRange = [H, e, l, l, o,  , e, d, e, n]   // 저장한데로 잘 출력함
728x90

'Redis' 카테고리의 다른 글

Redis-cli 명령어 정리(List, Hash)  (0) 2022.08.18