나의 개발 일상 기록
[REDIS] Redis란? 본문
Redis
1. Redis란?
Redis는 Remote Dictionary Server의 약자로서 <Key, value> 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터베이스 관리 시스템(DBMS)입니다. Redis는 In-Memory Data 구조를 가지고 있으며 List, Hash, Set, Sorted Set, Strings 등 여러 형식의 자료구조를 지원합니다.
Redis는 속도가 빠르고 사용이 간편하여 최고의 성능이 필요한 웹, 모바일, 게임, 광고 기술 및 IoT 애플리케이션에서 널리 사용되고 있습니다.
* In-Memory Data
데이터 스토리지의 메인 메모리에 설치되어 운영되는 방식의 데이터베이스 관리 시스템입니다. In-Memory Data는 RAM의 휘발성을 가진다는 특성이 있습니다.
2. Redis를 알기 전에 Cache에 대해서
Cache란 나중에 요청된 결과를 미리 저장해두었다가 빠르게 서비스를 해주는 것을 의미합니다.
다음 그림은 CPU Cache구조에 대한 그림입니다.

용량은 위로갈수록 크고 속도는 아래로 갈수록 빠릅니다. 우리가 일반적으로 쓰는 레지스터는 Memory영역입니다.
3. Cache를 사용하는 방식
- Look aside Cache 방식

Look aside Cache 방식은 일반적으로 가장 많이 사용하는 방식입니다.
- Write Back 방식

Write Back 방식은 일반 캐시에 먼저 저장을 후 특정 시점마다 DB에 저장해주는 방식입니다.
Intsert 쿼리를 1번씩 500번 작업을 하는거랑 Insert 쿼리 500개를 1번 작업하는 부분에 있어 속도적인 측면에 있어서 후자가 훨씬 더 빠릅니다.(배치작업) 단, Wirte Back 단점은 처음에 Cache에 먼저 저장이 되는데 이때 리부팅이 되면 메모리가 사라지게 됩니다. 주로 Write back을 사용하는 용도는 log를 DB에 저장할때 혹은 해비한 write를 할때 배치작업을 통해 사용을 합니다.
4. Collection의 중요성
개발의 편의성
예를 들어 랭킹 서버를 직접 구현한다고 하면 가장 간단한 방법은 DB에 유저의 Score를 저장하고 Score로 order by로 정렬 후 읽어오는 방법이 있을겁니다. 하지만 이 방법은 개수가 많아지면 디스크를 사용하게 되므로 속도적인 측면에 문제가 발생할 수 있다는 문제가 있습니다. Redis의 Sorted Set을 이용을 한다면 쉽게 랭킹을 구현을 할 수 있습니다. 다만 가져다 쓰면 거기의 한계에 종속적이게 됩니다.
개발의 난이도
개발을 하다보면 Race Condition이 발생할 수도 있습니다. Redis의 경우는 자료구조가 Atomic하기 때문에 Race Condition을 피할 수 있다는 장점이 있지만 그래도 잘못짜면 Race Condition이 발생할 수 있습니다.
* Race Condition
둘 이상의 입력 또는 조작의 타이밍이나 순서 등이 결과값에 영향을 줄 수 있는 상태를 말합니다.
5. Redis 사용처
1) Remote Data Store
- A 서버, B 서버, C 서버에서 데이터를 공유하고 싶을경우
2) 한대에서만 필요하다면, 전역 변수를 사용하면 되지 않을까?
- Redis 자체가 Atomic을 보장해줍니다.(싱글 스레드라)
3) 주로 쓰이는 곳들
- 인종 토큰 등을 저장(String 또는 hash)
- Ranking 보드로 사용(Sorted Set)
- 유저 API Limit
- 잡규(List)
6. Redis Collections의 기능
1) Strings
set <key> <value>
get <key>
2) List
Insert
Lpush <key> <value>
Rpush <key> <value>
pop
Lpop <key>
Rpop <key>
3) Set
SADD <key> <value> : value가 이미 key에 있으면 추가되지 않는다.
SMEMBERS <key> : 모든 value를 돌려줌
SMEMBERS <key> <value> : value가 존재하면 1, 없으면 0
4) Sorted Set
ZADD <key><Score><value> : value가 이미 key에 있으면 해당 Score로 변경된다.
ZRANGE <key> <StartIndex> <EndIndex> : 해당 Index 범위 값을 모두 돌려줌
Zrange testkey 0 -1 : 모든 범위를 가져옴
* Sorted Set의 score는 double 타입이기 때문에 값이 정확하지 않을 수 있습니다.
Hash
Hmset <key> <subkey1><value1> <subkey2><value2>
Hgetall <key> : 해당 key의 모든 subkey와 value를 가져옴
Hget <key><subkey>
Hmget <key> <subkey1><subkey2>.....<subkeyN>
* Collection 주의사항
- 하나의 컬렉션에 너무 많은 아이템을 달으면 좋지 않음
=> 10000개 이하 몇천개 수준으로 유지하는게 좋음
- Expire는 Collection의 item 개별로 걸리지 않고 전체 Collection에 대해서만 걸림
=> 즉 해당 10000개의 아이템을 가진 Collection에 expire가 걸려있다면 그 시간 후에 10000개의 아이템이 모두 삭제.
참고사이트
https://www.youtube.com/watch?v=mPB2CZiAkKM&t=1235s
'Redis' 카테고리의 다른 글
| Reids vs Memcached (0) | 2021.07.05 |
|---|