티스토리 뷰

 

 

 

이전에 썼던 글에서 언젠가 Redis로 넘어갈 거라고 했었는데, 결국은 안정성 문제로 Redis를 쓰게 됐다.

 

Redis가 고성능 인메모리 캐시라는 것 정도만 알고 있는데, 사용하기 전에 한번 짚고 들어가자.

 

Redis 란?

 

 

Redis는 데이터베이스, 캐시, 메시지 브로커 및 스트리밍 엔진으로 사용되는 오픈 소스(BSD 라이센스), 메모리 내 데이터 구조 저장소 입니다. Redis는 문자열, 해시, 목록, 세트, 범위 쿼리가 있는 정렬된 세트 , 비트맵 , 하이퍼로그로그 , 지리공간 인덱스 및 스트림과 같은 데이터 구조를 제공합니다. Redis에는 복제 , Lua 스크립팅 , LRU 제거 , 트랜잭션 및 다양한 수준의 디스크 지속성이 내장되어 있습니다. Redis Sentinel을 통한 고가용성과 Redis Cluster를 통한 자동 파티셔닝을 제공합니다.
- Redis 공식 instruction(https://redis.io/docs/about)

 

홈페이지 소개에 따르면 인메모리 캐시는 Redis가 제공하는 수 많은 기능 중 일부인 것 같다.

 

일단은 캐시만 사용할 것이기 때문에 여기에 초점을 맞추고 사용할 것이다.

 

설치하기 전에 알아야 할 것은, 내가 사용할 환경은 일단 Windows다.

 

불행하게도 Windows에서 Redis를 바로 쓸 수 없다. 

 

때문에, WSL(Windows Subsystem Linux)을 설치해 Linux 환경에서 설치하도록 한다.

 

WSL install

WSL 2가 필요, MS 가이드에 따라가보면 Powershell에서 관리자 모드 실행 후 아래의 명령어를 실행하면 된다고 한다.

wsl --install

나도 어떻게 설치했는지 기억이 잘 안나는거보면 한줄로 끝나서 그런 것 같다.

 

Docker install

다음은 Docker를 설치해준다.

curl -fsSL https://get.docker.com/ | sudo sh
sudo usermod -aG docker `whoami`

Docker 설치 후 Docker hub에 있는 redis를 받아온다.

docker run --name redis -p 6379:6379 -d redis:6-alpine

docker ps로 컨테이너를 검색했을 때 아래와 같이 뜨면 실행 성공!

 

 

redis-cli 접속

redis를 간단하게 사용하고, 저장된 데이터를 확인하려면 redis-cli를 사용해야한다.

 

아래의 명령어로 docker 내부에 진입한다.

docker exec -it redis /bin/bash
OCI runtime exec failed: exec failed: unable to start container process: exec: "/bin/bash": stat /bin/bash: no such file or directory: unknown

/bin/bash가 없어서 발생하는 에러가 발생한 것이니, 놀라지말고 sh로 접속한다.

docker exec -it redis sh

접속 후 redis-cli 명령어를 입력하면

아래와 같이 진입이 된다.

 

간단하게 사용해보자.

127.0.0.1:6379> FLUSHDB // 데이터 모두 삭제
OK
127.0.0.1:6379> KEYS * // 모든 키 검색
(empty array)
127.0.0.1:6379> SET 1 "hello-world" // 키 1에 데이터 "hello-world" 삽입
OK
127.0.0.1:6379> GET 1 // 키 1 조회
"hello-world"
127.0.0.1:6379> KEYS *
1) "1"
127.0.0.1:6379> DEL 1 // 키 1 삭제
(integer) 1
127.0.0.1:6379> KEYS *
(empty array)

명령어는 몇개 없지만 CRUD를 다 담고있다.

 

여기까지 진행되었다면 redis가 정상적으로 설치되었다는 것이다.

 

이제 SpringBoot에서 사용해보자.

 

SpringBoot에서 사용하기

gradle

implementation 'org.springframework.boot:spring-boot-starter-data-redis'

application.yml

spring:
  data:
    redis:
      host: localhost
      port: 6379

Configuration

@Configuration
public class RedisConfig {
    @Value("${spring.data.redis.host}")
    private String host;

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

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        RedisStandaloneConfiguration redisConfiguration = new RedisStandaloneConfiguration();
        redisConfiguration.setHostName(host);
        redisConfiguration.setPort(port);
        return new LettuceConnectionFactory(redisConfiguration);
    }

    @Primary
    @Bean
    public RedisTemplate<String, String> redisTemplate() {
        RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory());
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        return redisTemplate;
    }
}

Configuration에 대한 설명도 따라 들어가면 너무 많기 때문에, 따로 정리하도록 하겠다.

 

Repository

@Repository
public interface RedisRepository extends CrudRepository<UserVo, String> {
}

Entity

@RedisHash(value = "user", timeToLive = 600)
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserVo {
    @Id
    private String id;
    private String name;
    private String address;
}

redis에 저장할 객체이다.

 

RedisHash 설정은 레디스에 Hash 형태로 저장하고, timeToLive가 남아있는 시간을 의미한다.

 

여기선 10분동안 살아있게 설정했다.

 

Hash형태로 저장하면 redis-cli에서 HGET으로 조회해야 값을 볼 수 있다.

(내가 잘못 사용한건지는 모르겠는데, 까보면 바이트 코드가 나와서 의미가 없었다..)

 

이제 설정은 끝났다.

 

이제 서비스 로직단에서 사용만하면 되는데, 사실상 Spring Data JPA와 사용법이 거의 같다.

 

CRUD만 설명하려고 하는데, 사실상 생성과 업데이트는 같은 매서드를 쓰면된다.

private final RedisRepository redisRepository;

redisRepository.save(new UserVo("id", "Daniel", "New York")); // 저장

Optional<UserVo> result = redisRepository.findById("id"); // 불러오기
if(result.isPresent()) {
    redisRepository.deleteById("id"); // 삭제
    UserVo userVo = result.get();
    System.out.println(userVo.getName());
}

이 세 가지 매서드가 간단하게 Redis 캐시를 사용하는데 필요한 전부다.

 

위 내용을 redis-cli 에서 검색해보면,

값이 정상적으로 저장된 것을 확인 할 수 있다.

 

delete까지 수행하면 당연한 이야기지만 값이 삭제된다.

 

마치며

Redis를 막연히 써봐야된다는 생각만 가지고 있었는데, 생각보다 사용법이 쉬웠다.

 

이제 서비스에서 스프링 기본 제공 캐시를 덜어내는 작업을 해야한다 ㅠ

'개발 > Redis' 카테고리의 다른 글

Redis Configuration - Lettuce vs Jedis & RedisTemplate 이란?  (0) 2023.08.03
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함