[Spring Boot] Redis

이홍준·2023년 6월 29일
0

Spring Boot

목록 보기
3/11
  1. Redis란
    • 빠른 오픈 소스 In-memory Key-Value 저장방식
    • NoSQL중의 Key-Value 저장방식중 하나
    • 캐싱, 세션관리, pub/sub, 속도제한, 대기열 및 순위표 등에 사용
    • AWS ElasticCache
  2. 장점
    • 빠른 응답성 (In-memory)
    • 별도 Redis 서버를 구성함으로써 분산 환경에서의 원격 프로세스간의 데이터 동기화 문제 해결
    • TTL 설정 : 일정 시간이 지나면 데이터 삭제
    • 보안 체계 : 악성 스크립트 공격으로 부터 안전 보장, TLS 지원
  3. 설치 (WSL2)
    • Install Redis
      curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
      
      echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
      
      sudo apt-get update
      sudo apt-get install redis
    • Redis server 실행
      sudo service redis-server start
    • Redis 연결
      redis-cli 
      127.0.0.1:6379> ping
      PONG
  4. Redis Tools (GUI)
    • Redisinsight: Redis Labs에서 개발한 공식 Redis GUI 도구 → 이거 사용중
    • Redis Desktop Manager: 오픈 소스 관리도구
    • Medis: Mac에서 app store에서 다운가능
  5. 명령어
    • SET
      SET [keyName] [value] [값이 이미 있으면 실패:nx, 값이 이미 있으면 성공:xx]
    • GET
      GET [keyName]
    • INCR, DECR (정수만)
      INCR [keyName] [step(default 1)]
      DECR [keyName] [step(default 1)]
    • MSET
      MSET [key1] [value1] [key2] [value2] ...
    • MGET
      MGET [key1] [key2] [key3] ...
    • EXIST
      EXIST [key1] [key2] ...
    1. DEL

      DEL [key1] [key2] ...
    • EXPIRE (TTL)
      EXPIRE [keyName] 5(seconds)
    • HSET
      • 해시화된 키 값에 field / value 쌍을 넣을 수 있음.

      • 한개일때는 O(1), 늘어날수록 O(N)

        HSET key field value [field value ...]
    • HGET(단일)
      HGET key field
    • HMGET(복수)
      HMGET key field [field ...]
    • HGETALL(all)
      HGETALL key
    • HVALS(all)
      HVALS key
  6. Spring Boot에 적용
  7. Lettuce 사용
    • Spring Boot 2.x 부터 기본 패키지안에 들어있다.
    • 비동기로 요청을 처리하기 때문에 고성능
    • 커뮤니티 더 큼 (피드백이 빠른편)
  8. 구현
    • 공통 configuration
      // 기본
      @Configuration
      public class RedisConfig {
      
        @Bean
        public JedisConnectionFactory redisConnectionFactory() {
          return new JedisConnectionFactory();
        }
      }
      # application.yml
      redis:
          host: localhost # docker로 실행시 host.docker.internal
          port: 6379
    • RedisTemplate 방식 (Low-level)
      • Configuration
           @Configuration
           public class RedisConfig {
           
               @Value("${spring.redis.host}")
               private String host;
               @Value("${spring.redis.port}")
               private int port;
               @Bean
               public RedisConnectionFactory redisConnectionFactory(){
                   return new LettuceConnectionFactory(host, port);
               }
               @Bean
               public RedisTemplate<?, ?> redisTemplate(){
                   RedisTemplate<byte[], byte[]> redisTemplate = new RedisTemplate<>();
                   redisTemplate.setConnectionFactory(redisConnectionFactory());
                   redisTemplate.setKeySerializer(new StringRedisSerializer());
                   redisTemplate.setValueSerializer(new StringRedisSerializer());
                   return redisTemplate;
               }
           }
      • Repository
        
        @Repository
        @RequiredArgsConstructor
        public class RefreshTokenRepository {
        // RedisTemplate<KeyType, ValueType>
            private final RedisTemplate<String, String> redisTemplate;
        
            public void saveRefreshToken(String memberId, String refreshToken) {
                redisTemplate.opsForValue().set(memberId, refreshToken);
            }
        
            public String getRefreshToken(String memberId) {
                return redisTemplate.opsForValue().get(memberId);
            }
        
            public void expire(String memberId, Long exp) {
                redisTemplate.expire(memberId, exp, TimeUnit.MILLISECONDS);
            }
        
        }
      • RedisTemplate 메소드
        MethodDescription
        opsForValueStrings를 직렬화/ 역직렬화해주는 interface
        opsForListList를 직렬화/ 역직렬화해주는 interface
        opsForSetSet를 직렬화/ 역직렬화해주는 interface
        opsForZSetZSet를 직렬화/ 역직렬화해주는 interface
        opsForHashHash를 직렬화/ 역직렬화해주는 interface
    • RedisRepository 방식 (High-level)
      • Entity
        
        @Getter
        @Setter
        @Builder
        @NoArgsConstructor
        @AllArgsConstructor
        @RedisHash("member")
        public class Member {
        
            @Id
            private String memberId;
            private String email;
        		private String password;
            // etc attributes...
        }
      • Repository
        public interface MemberRedisRepository extends CrudRepository<Member, String > {
        }
      • Service
        @RequiredArgsConstructor
        @Service
        public class MemberService {
        
            private final MemberRedisRepository memberRedisRepository;
        
            public void addMember() {
                Member member = Member.builder()
                	.id("1")
                	.email("zxc123@naver.com")
                	.password("1q2w3e4r5t")
                	.build();
                memberRedisRepository.save(member);
            }
        }

※ 참조

profile
I'm a web developer.

0개의 댓글