레시드란 메모리 기반 저장 서비스로, 키-값 구조를 띄고있는 일종의 캐시이다. 문자열만 저장할 수 있는 Memcached와 달리, 다양한 자료구조를 다양한 형식으로 저장할 수 있다. (String, Set, SortedSet, Hash, List등)

특징

설치

$ brew install redis

레디스 시작 명령어

- homebrew로 서비스 시작
$ brew services start redis

- 서비스 중단
$ brew services stop redis

- 서비스 재기동
$ brew services restart redis

- redis클라이언트로 접속
$ redis-cli

Redis-cli 명령어 모음

스프링에서 레디스 사용하기

@EnableRedisRepositories // Redis Repository 활성화
@Configuration
public class RedisConfiguration {
    @Value("${spring.redis.port}")
    private int port;
    @Value("${spring.redis.host}")
    private String host;

    @Bean
    public RedisConnectionFactory redisConnectionFactory(){
        // 외부 레디스와의 연결
        return new LettuceConnectionFactory(host, port);
    }
    @Bean
    public RedisTemplate<?,?> redisTemplate(){
        // byte값을 객체 직렬화
        RedisTemplate<byte[], byte[]> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory());
        return redisTemplate;
    }
}

→ 스프링부트 2.0 이상부터는 redis에 대한 설정이 별도 필요없다.

커스터마이징할때 사용하기!

application properties

spring.redis.host=localhost
spring.redis.port=6379

Test code 작성

@SpringBootTest
class RedisServiceTest {
  @Autowired
    RedisTemplate<String, String> redisTemplate;

    @Test
    void 레디스_문자열_다루기() {
        String key = "string_redis";
        String value = "string";
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        redisTemplate.opsForValue().set(key, value);
        redisTemplate.expire(key, 60, TimeUnit.SECONDS);
        Assertions.assertThat(value).isEqualTo(redisTemplate.opsForValue().get(key));
    }
    @Test
    void 레디스_set오퍼레이션() {
        // given
        SetOperations<String, String> setOperations = redisTemplate.opsForSet();
        String key = "setKey";

        // when
        setOperations.add(key, "h", "e", "l", "l", "o");

        // then
        Set<String> members = setOperations.members(key);
        Long size = setOperations.size(key);

        assertThat(members).containsOnly("h", "e", "l", "o");
        assertThat(size).isEqualTo(4);
    }

    @Test
    void 레디스_해시오퍼레이션(){
        //given
        HashOperations<String, Object, Object> hashOperations = redisTemplate.opsForHash();
        String key = "HashKey";
        //when
        hashOperations.put(key, "hello", "world");
        //then
        Object value = hashOperations.get(key, "hello");
        assertThat(value).isEqualTo("world");

        Map<Object, Object> entries = hashOperations.entries(key);

        assertThat(entries.keySet()).containsExactly("hello");
        assertThat(entries.values()).containsExactly("world");

        Long size = hashOperations.size(key);

        assertThat(size).isEqualTo(entries.size());

    }
}