데이터베이스/0 + Redis

[Redis] 데이터 타입 활용

힘들면힘을내는쿼카 2025. 2. 2. 20:39
728x90
반응형

Redis 데이터 타입 활용

 

Redis 에서 제공하는 데이터 타입을 이용한 예시들을 알아봅시당~!

Strings

One Time Password

One Time Password 란 인증을 위해 사용되는 임시 비밀번호를 의미 합니다.

(회원가입 시 잠깐 사용되는 비밀번호)

 

OTP 인증 과정


Distributed Lock

분산 락 이란 분산 환경의 다수의 프로세스에서 동일한 자원에 접근할 때, 동시성 문제를 해결하기 위해 사용되는 방법 입니다.

자주 사용하는 RDB에 레코드 락을 걸어서 해결할 수 도 있지만, Redis를 이용해서도 여러 프로세서에서 데이터를 변경하는 문제를 막을 수도 있습니다.

 

참고

RDB의 레코드 락을 사용하면 훨씬 안전하게 일관성을 유지할 수 있지만, 레코드가 존재하지 않는 경우에는 락을 사용할 수 없고 락으로 인한 DB 성능이 저하될 수 있기 때문에 필요에 맞게 분산 락 또는 레코드 락을 사용하면 됩니다~!

 

락이 없는 경우


분산 락 구현


  • 공유 자원을 표현할 수 있는 이름을 통해 락의 키를 결정
  • nx 명령어를 이용하여 해당 키가 존재하지 않은 경우에만 락을 획득할 수 있도록 구현
  • 이미 해당 키가 존재하는 경우 락을 획득하지 못하는 경우에는 nil을 반환하여 프로세스를 대기(wait)
  • 락을 획득하여 처리하는 작업이 끝났을 경우에는 del 명령어를 통해 락을 제거
  • 다른 프로세스에서 해당 작업을 사용할 수 있도록 함
  • 대기 중인 프로세스가 락을 획득하고 작업을 수행

 

참고

무작정 대기하는 것 보다는 지수 백오프를 적용하면 성능이 향상 될 수 있습니다.

 

지수 백오프?

단순히 Thread.sleep()을 사용하는 대신 지수 백오프 전략을 적용하여 성능을 최적화할 수 있습니다.

  • 재시도할 때 대기 시간을 점진적으로 증가시키는 방법
  • 예를 들어, 초기 100ms → 200ms → 400ms → 800ms → 최대 2000ms (2초)까지 증가
  • 무작위성을 추가하여 동시 접근 충돌(Thundering Herd 문제) 방지

 

Fixed Window Rate Limiter

시스템 안정성/보안 을 위해 요청의 수를 제한하는 기술 입니다.

(요청 수 제한이 걸리면 429 Too Many Requests 응답)

IP-Based, User-Based, Application-Based, …

 

여러가지 구현 방법이 있는데 고정된 시간안에서 요청 수를 제한하는 Fixed Window 방식에 대해서 알아보겠습니다~!

 

Fixed Window

  • 고정된 시간안에 요청 수를 제한하는 방법
    • e.g) 1분안에 10개 요청 제한
      • 13:00:00 요청 수 10개
      • 13:00:59 까지 요청 제한
    • e.g) 1초 안에 20개의 요청을 처리해야하는 경우
      • 13:10:59 요청 수 10개
      • 13:11:00 요청 수 10개

 

IP-Based 분당 요청 수 제한 방법

제한이 걸린 경우

 

제한이 안 걸린 경우

    

Lists

SNS Activity Feed

사용자 또는 시스템과 관련된 활동이나 업데이트시간순으로 정렬하여 보여주는 기능 입니다.

Fan-Out 이라는 메시징 패턴을 사용하는데 단일 데이터를 한 소스에서 여러 목적지로 동시에 전달하는 기술 입니다.

 

User1 이 어떤 게시글에 “좋아요”(like)를 눌렀을 경우


  1. User1 이 어떤 게시글에 좋아요를 눌렀을 경우 feedService 에 해당 이벤트 전달
  2. feedService 는 User의 팔로워 또는 해당 내용에 관심을 가질만한 User들을 Filtering
  3. 2번의 결과를 target 이 될만 한 User 들에게 메시지 전달
    1. user1, user2 의 feed에 “user1 liked a post” 저장
  4. 3번의 User 들이 feed을 조회

 

 

Sets

Shopping Cart

사용자가 구매를 원하는 상품을 임시로 저장해두는 공간

수시로 변경이 발생할 수 있고, 실제로 구매로 이어지지 않을 수 있습니다.

(Sets 을 사용하기 때문에 중복 데이터 관리를 쉽게 할 수 있음)


Hashes

Login Session

사용자의 로그인 상태를 유지하기 위한 기술 입니다.

조금 풀어서 이야기 하면, 사용자를 식별하기 위한 세션 아이디(고유한 아이디)를 할당하고 이 세션 아이디를 사용하여 요청의 인증 과정 없이 사용자를 식별하는 기술

동시 로그인 제한과 같은 기술을 구현할 때 사용합니다.

 

동시에 로그인 가능한 디바이스 갯수를 제한

  • 새로운 사용자가 로그인을 요청하면 사용자의 세션 목록을 조회
  • 세션 갯수가 N개 이상 이라면 로그인 제한
  • 세션 갯수가 N개 미만이라면 로그인 로직을 수행하고 새롭게 생성된 세션 목록에 추가

 

로그인 했을 경우


왜 Hashes를 사용했나요?

hash를 사용했을 때 세션 데이터를 저장/사용할 때 필요한 인코딩/디코딩 과정을 생략할 수 있습니다. 추가로 여러 필드를 가진 데이터의 경우 데이터를 좀 더 구조적으로 관리(field-value 구조)할 수 있다는 장점있기 때문입니다.

  

Sorted Sets

Sliding Window Rate Limiter

시간에 따라 Window 를 이동시켜 동적으로 요청수를 제한하는 기술

Fixed Window 는 window 시간 마다 요청 수가 초기화 되지만, Sliding Window 는 시간이 경과함에 따라 window 가 함께 움직입니다.

예를 들어 1분을 기준으로 정한다면, 현재 시간 기준 60초 이전까지 요청 횟수를 계산하여 요청 수를 제한 합니다.

 

1분 기준 요청수 제한 경우

 

Geospatial

Geofencing

위치 정보를 활용하여 지도 상의 가상의 경계 또는 지리적 영역을 정의하는 기술

 

$ geoadd java-station:burgers 
127.01 37.01 mc-donalds
127.02 37.02 lotte-ria
127.03 37.03 buger-king
127.04 37.04 nbb

$ georadius java-station:bugers 127.0 37.0 5 km
1) "mc-donalds"
2) "lotte-ria"
3) "buger-king"

 

Bitmap

Online Status

사용자의 현재 상태를 표시하는 기능

실시간성을 완벽히 보장하지는 않고, 수시로 변경되는 값

 
 

HyperLogLog

Visitor Count

정확한 방문자 숫자가 아니라 대략적인 방문자 수가 필요한 경우

실제 값을 저장하지 않기 때문에 구체적인 데이터가 필요한 경우 적합하지 않습니다.

HyperLogLog 는 기본적으로 동일한 값을 1번만 카운팅 합니다.

따라서 HyperLogLog 에 요소(element)를 어떻게 추가하는지에 따라 카운팅 방식을 조절할 수 있습니다.

 

$ pfadd today:users user:1:25-02-02 user:2:25-02-02
(integer) 2

$ pfcount today:users
(integer) 2

 

  

BloomFilter

Unique Events

클라이언트의 실수로 중복되는 이벤트를 여러번 요청하는 경우가 있는데요.

이럴때 Unique Events 를 구현하면 됩니다.

Unique Events동일 요청이 중복으로 처리되지 않기 위해 빠르게 해당 item이 중복인지 확인하는 방법

다만, bloom filter는 false positive 존재하는데요.

false positiveelement 가 집합에 실제로 포함되지 않은데 포함되었다고 잘못 예측하는 경우를 의미 합니다.

 

이벤트 조회 결과가 없는 경우

 


이벤트 조회 결과가 있는 경우

 

 

728x90
반응형

'데이터베이스 > 0 + Redis' 카테고리의 다른 글

[Redis] 사용시 주의사항  (0) 2025.02.03
[Redis] 특수 명령어  (1) 2025.01.28
[Redis] Redis 특징과 데이터 타입 소개  (0) 2025.01.28