Redis 데이터 타입 활용
![](https://blog.kakaocdn.net/dn/B2xhz/btsL5A04nMp/LRUOpk1HEqfm2kX0jFVMzk/img.webp)
Redis 에서 제공하는 데이터 타입을 이용한 예시들을 알아봅시당~!
Strings
One Time Password
One Time Password 란 인증을 위해 사용되는 임시 비밀번호를 의미 합니다.
(회원가입 시 잠깐 사용되는 비밀번호)
OTP 인증 과정
![](https://blog.kakaocdn.net/dn/qvP89/btsL4zPAeRd/1h2kxgTL3B2csBvYj5Lgrk/img.png)
Distributed Lock
분산 락 이란 분산 환경의 다수의 프로세스에서 동일한 자원에 접근할 때, 동시성 문제를 해결하기 위해 사용되는 방법 입니다.
자주 사용하는 RDB에 레코드 락을 걸어서 해결할 수 도 있지만, Redis를 이용해서도 여러 프로세서에서 데이터를 변경하는 문제를 막을 수도 있습니다.
참고
RDB의 레코드 락을 사용하면 훨씬 안전하게 일관성을 유지할 수 있지만, 레코드가 존재하지 않는 경우에는 락을 사용할 수 없고 락으로 인한 DB 성능이 저하될 수 있기 때문에 필요에 맞게 분산 락 또는 레코드 락을 사용하면 됩니다~!
락이 없는 경우
![](https://blog.kakaocdn.net/dn/cjoQ9C/btsL4zaZ2Kk/RHPqd0KMsEQczDA2lo1uz1/img.png)
분산 락 구현
![](https://blog.kakaocdn.net/dn/byGFnf/btsL4NmybTl/4FJIpRnzXlvpbeIvY6WI30/img.png)
- 공유 자원을 표현할 수 있는 이름을 통해 락의 키를 결정
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개
- e.g) 1분안에 10개 요청 제한
IP-Based 분당 요청 수 제한 방법
![](https://blog.kakaocdn.net/dn/cfHBJm/btsL4nPditW/9kLiNO8ckKyNKw8kfpwzhk/img.png)
![](https://blog.kakaocdn.net/dn/AXEzz/btsL3ouvJkr/g6pumHM3yE6cwnbX35klK0/img.png)
Lists
SNS Activity Feed
사용자 또는 시스템과 관련된 활동이나 업데이트를 시간순으로 정렬하여 보여주는 기능 입니다.
Fan-Out
이라는 메시징 패턴을 사용하는데 단일 데이터를 한 소스에서 여러 목적지로 동시에 전달하는 기술 입니다.
User1 이 어떤 게시글에 “좋아요”(like)를 눌렀을 경우
![](https://blog.kakaocdn.net/dn/cOwB0I/btsL4zWoWtm/7tFKfIunqDBSboHSse2VUk/img.png)
- User1 이 어떤 게시글에 좋아요를 눌렀을 경우 feedService 에 해당 이벤트 전달
- feedService 는 User의 팔로워 또는 해당 내용에 관심을 가질만한 User들을 Filtering
- 2번의 결과를 target 이 될만 한 User 들에게 메시지 전달
- user1, user2 의 feed에 “user1 liked a post” 저장
- 3번의 User 들이 feed을 조회
Sets
Shopping Cart
사용자가 구매를 원하는 상품을 임시로 저장해두는 공간
수시로 변경이 발생할 수 있고, 실제로 구매로 이어지지 않을 수 있습니다.
(Sets 을 사용하기 때문에 중복 데이터 관리를 쉽게 할 수 있음)
![](https://blog.kakaocdn.net/dn/bAHQF9/btsL3nbp8wB/kKBkDY4ZvkPppNTDq4ltC1/img.png)
Hashes
Login Session
사용자의 로그인 상태를 유지하기 위한 기술 입니다.
조금 풀어서 이야기 하면, 사용자를 식별하기 위한 세션 아이디(고유한 아이디)를 할당하고 이 세션 아이디를 사용하여 요청의 인증 과정 없이 사용자를 식별하는 기술
동시 로그인 제한과 같은 기술을 구현할 때 사용합니다.
동시에 로그인 가능한 디바이스 갯수를 제한
- 새로운 사용자가 로그인을 요청하면 사용자의 세션 목록을 조회
- 세션 갯수가 N개 이상 이라면 로그인 제한
- 세션 갯수가 N개 미만이라면 로그인 로직을 수행하고 새롭게 생성된 세션 목록에 추가
로그인 했을 경우
![](https://blog.kakaocdn.net/dn/bTtwXp/btsL5B6JixV/jjMzKc8jKlPwPhO7Cfl8O1/img.png)
왜 Hashes를 사용했나요?
hash를 사용했을 때 세션 데이터를 저장/사용할 때 필요한 인코딩/디코딩 과정을 생략할 수 있습니다. 추가로 여러 필드를 가진 데이터의 경우 데이터를 좀 더 구조적으로 관리(field-value 구조)할 수 있다는 장점있기 때문입니다.
Sorted Sets
Sliding Window Rate Limiter
시간에 따라 Window 를 이동시켜 동적으로 요청수를 제한하는 기술
Fixed Window 는 window 시간 마다 요청 수가 초기화 되지만, Sliding Window 는 시간이 경과함에 따라 window 가 함께 움직입니다.
예를 들어 1분을 기준으로 정한다면, 현재 시간 기준 60초 이전까지 요청 횟수를 계산하여 요청 수를 제한 합니다.
1분 기준 요청수 제한 경우
![](https://blog.kakaocdn.net/dn/0Xwdk/btsL4cG21uW/dKv9LPeDWdvkMrPkmQHdh0/img.png)
Geospatial
Geofencing
위치 정보를 활용하여 지도 상의 가상의 경계 또는 지리적 영역을 정의하는 기술
![](https://blog.kakaocdn.net/dn/dSZsSV/btsL4wrOt15/8ZEz32qzChTGSyqqVoXtLk/img.png)
$ 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
사용자의 현재 상태를 표시하는 기능
실시간성을 완벽히 보장하지는 않고, 수시로 변경되는 값
![](https://blog.kakaocdn.net/dn/oqZqP/btsL5N63gvC/RfOFubjeuBRxFh0w7gulS1/img.png)
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 positive
는 element
가 집합에 실제로 포함되지 않은데 포함되었다고 잘못 예측하는 경우를 의미 합니다.
이벤트 조회 결과가 없는 경우
![](https://blog.kakaocdn.net/dn/dLzJQI/btsL3nigaoc/PdjD0o2uDuBdMmnJ9tb2y0/img.png)
이벤트 조회 결과가 있는 경우
![](https://blog.kakaocdn.net/dn/qVraO/btsL4ao1Bh0/ZDD1o33AnFB0QRmXMZeyH0/img.png)
위 경우 DB의 부하를 redis로 분산시켜주고 있습니다.
참고
실전! Redis 활용 강의 | 신동현 - 인프런
신동현 | 배워서 바로 사용할 수 있는 Redis 강좌입니다!, 튜토리얼 수준의 강의는 그만 🙅♂️다양한 예제를 통해 실무에 바로 적용할 수 있는 Redis 강의입니다! [임베딩 영상] Key-Value NoSQL 부동
www.inflearn.com
'데이터베이스 > 0 + Redis' 카테고리의 다른 글
[Redis] 사용시 주의사항 (0) | 2025.02.03 |
---|---|
[Redis] 특수 명령어 (1) | 2025.01.28 |
[Redis] Redis 특징과 데이터 타입 소개 (0) | 2025.01.28 |