๐ก ๋ณธ ๋ฌธ์๋ ๋ํ์ ์ธ NoSQL ์ค ํ๋์ธ 'Redis'์ ๋ํ ๊ฐ๋ ์ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํด๋์ ๊ธ์ ๋๋ค.
ํ์์ NoSQL์ ๊ด์ฌ์ด ์๊ฑฐ๋ Redis๋ฅผ ์ ๋ฌธํ๊ณ ์ถ์ผ์ ๋ถ๋ค์ ์ฐธ๊ณ ๋ถํ๋๋ฆฝ๋๋ค.
1. Redis ์๊ฐ
1.1 Redis ์๊ฐ
Redis๋ Remote Dictionary Server๋ฅผ ๋ปํฉ๋๋ค. ์ด๋ ๋ํ์ ์ธ In-Memory data store ์๋ฃจ์ ์ค ํ๋๋ก ๊ผฝํ๋๋ฐ, ํนํ Memcached์ ์ข ์ข ๋น๊ต๋๊ณค ํฉ๋๋ค. Redis๋ Memcached์๋ ๋ฌ๋ฆฌ ๋ค์ํ ๋ฐ์ดํฐ ํ์ ์ ์ง์ํ์ฌ ๋ณด๋ค ๋ค์ํ ๋ถ์ผ์ ์๊ตฌ์ฌํญ์ ์ถฉ์กฑ์ํค๋ฉฐ, ๋ถ์ฐ Key-Value Store, ์บ์์๋ฒ, ๋ฉ์์ง ๋ธ๋ก์ปค ๋ฑ์ผ๋ก ํ์ฉ๋๊ธฐ๋ ํฉ๋๋ค.
์ถ๊ฐ๋ก, DB-Engines Ranking ๊ธฐ์ค์ผ๋ก ํ์กดํ๋ NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค ์ธ์ง๋ 2์, ์ ์ฒด DB ์ธ์ง๋ 6์๋ฅผ ์ ์งํ๊ณ ์์ต๋๋ค.
1.2 Redis ํน์ง: NoSQL (Key-value + Document, Graph, Spatial, Search engine, Time Series)
Name | Redis |
Description | Popular in-memory data platform used as a cache, message broker, and database that can be deployed on-premises, across clouds, and hybrid environments |
Primary database model | Key-value store |
Secondary database models | Document store Graph DBMS Spatial DBMS Search engine Time Series DBMS |
Technical documentation | docs.redis.com/latest/index.html redis.io/documentation |
Developer | Redis project core team, inspired by Salvatore Sanfilippo |
Initial release | 2009 |
Current release | 7.0.5, September 2022 |
License | Open Source (3-Clause-BSD) |
Cloud-based only | no |
DBaaS offerings (sponsored links) |
|
Data scheme | schema-free |
Typing | Supported data types(Collection) - String: ๋ฌธ์์ด, ์ ์, ์์ - Bitmap: bit ๋จ์์ ์ฐ์ฐ ๊ฐ๋ฅ - Hash: Key-Value ๊ธฐ๋ฐ ์ ๋ ฌ๋์ง ์์ ํด์ํ ์ด๋ธ - List: string์ ๋ฆฌ์คํธ - Set: ์ค๋ณต์ ์ ์ธํ ๊ฐ ์ ์ฅ - ZSet(sorted sets): String ๋ฐ์ดํฐ๋ฅผ ์ค์๋ก ํํ๋๋ score์ ๋งคํ ํ score ์์ผ๋ก ์ ๋ ฌํ์ฌ ๊ฐ/๋ฒ์ ๊ธฐ๋ฐ ๊ฒ์ ๊ฐ๋ฅ - geospatial indexes: ์ค์๊ฐ ์์น๊ธฐ๋ฐ ๋ฐ์ดํฐ ์ง์ํ์ฌ ์ง๋๊ธฐ๋ฐ์ ๊ณ ์ฑ๋ฅ ์๋น์ค ์ ๊ณต ๊ฐ๋ฅ - hyperloglogs: ๋ง์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ ์ฌ์ฉํ๋ฉฐ ์ค๋ณต๋์ง ์๋ ๋ฐ์ดํฐ์ ๊ฐ์๋ฅผ ์นด์ดํธํ ๋ ์ฌ์ฉ - streams: ๋ก๊ทธ๋ฅผ ์ ์ฅํ๊ธฐ ๊ฐ์ฅ ์ ๋น |
Secondary indexes | yes |
SQL | no |
APIs and other access methods | proprietary protocol (RESP: REdis Sirialization Protocol) |
3rd parties | Read the Redis NoSQL benchmark report. » more CData: Connect to Big Data & NoSQL through standard Drivers. » more Aiven for Redis: Store and access your data quickly and efficiently. » more data modeling methods with modules such as RediSearch, RedisJSON, RedisGraph, RedisTimeSeries, RedisBloom, and RedisAI, and allows operations to be executed across and between modules and core Redis functionality using RedisGears, a serverless engine that runs across shards and nodes of Redis Enterprise cluster. |
Typical application scenarios | Redis Enterprise is used by large enterprise, startup, and government organizations to power use cases such as real-time fraud detection, global user session management, real-time inventory management, feature store for AI/ML, claims processing, and more. Common use cases include (but not limited to):
|
- ๋์ฑ ์์ธํ ๋ด์ฉ์ DB-Engines Ranking: Redis ๋ถ๋ถ์ ์ฐธ๊ณ ํด์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
1.3 Redis์ Memcached ์ฐจ์ด์
In-memory Data Store ๊ด์ ์์ Memcached์ Redis๋ฅผ ๋๊ณ ๋น๊ตํ๋ ๊ฒฝ์ฐ๋ฅผ ์ข ์ข ๋ณผ ์ ์์ต๋๋ค. ๊ทธ ๊ธฐ๋ฅ์ ์ฐจ์ด๋ฅผ ์์๋ณด๊ณ 2์ฅ์์๋ Redis์ ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
ํญ๋ชฉ | Memcached | Redis |
๋ฐ์ดํฐ ๋ถํ (Sharding / Partitioning) | O (Consistent Hashing) | O |
๋ฐ์ดํฐ ๋ณต์ (Replication) | O (Repcached) | O |
๋ค์ํ ๋ฐ์ดํฐ๊ตฌ์กฐ ์ง์ | X | O |
Multi Thread / Single Thread | Multi Thread | Single Thread |
๋ฐ์ดํฐ ์ ์ฅ (Persistence / Snapshot) | X | O |
ํธ๋์ญ์ ์ง์ | X | O |
Publisher / Subscriber | X | O |
2. Redis ๊ตฌ์กฐ
2.1 Redis ์ ์ฅ ๊ตฌ์กฐ(collection)
- String, Hash, Sorted Set, List, Set๊ณผ ๊ฐ์ ์๋ฃ๊ตฌ์กฐ ์ง์. ๋ฐ๋ฉด Memcached๋ ๋ฌธ์์ด๋ง ๊ฐ๋ฅ.
- ์ต๋ 512MB์ key์ 512MB์ value๋ฅผ ์ง์. ๋ฐ๋ฉด Memcached๋ ์ต๋ 250B์ key์ 1MB์ value๋ง ๊ฐ๋ฅ.
- ๋ฐ์ดํฐ ํ์ ๋ณ ์์ฑ ๋ฐ ๊ด๋ฆฌ ๋ฐฉ๋ฒ์ ํด๋น ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํ์๊ธฐ ๋ฐ๋๋๋ค.
2.2 Redis ์ํคํ ์ณ ํน์ง
2.2.1 ๋ฐ์ดํฐ ๋ณต์ (Replication)
- ์ฌ๋ฌ ๋ ธ๋์ ๋ชจ๋ ๊ฐ์ด ๋ณต์ ๋์ด ์์ผ๋ฏ๋ก read์ HA(๊ณ ๊ฐ์ฉ์ฑ)์ ํ๋ณดํ์ฌ ์๋ ์ฅ์ ์กฐ์น(Failover) ์์คํ ๊ตฌ์ถํ๋๋ฐ ๋ชฉ์ ์ด ์์.
- ๊ทธ๋ฌ๋, ํ ๊ฐ์ ๋ง์คํฐ๊ฐ ์ฌ๋ฌ ๊ฐ์ ์ฌ๋ ์ด๋ธ๋ก ๋ณต์ฌ๋์ด์ผ ํ๋ค๋ ์ ๊ณผ ๋ชจ๋ replica๋ค์ด ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ๋ค๊ณ ์๊ฒ ๋๋ค๋ ํน์ง ๋๋ฌธ์ ์ฐ๊ธฐ ๊ด์ ์์๋ ํ์ฅ์ฑ์ด ์ข์์ง๋ค๊ณ ๋ณด๊ธด ์ด๋ ค์.
2.2.2 ๋ฐ์ดํฐ ๋ถ์ฐ (Sharing / Partitioning)
- ๋ฐ์ดํฐ๋ฅผ ๋ฒ์ ๋๋ ํด์ฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ํํฐ์ ๋ํ์ฌ ๋ฐ์ดํฐ์ ์ ์์ฒด๋ฅผ ๋๋ ๊ฐ์(key์ ๋์ญํญ์ ์ ํด์ ๊ด๋ฆฌํจ).
- ์ฐ๋ ๋ฐ์ดํฐ์ ์์ด ๋์ด๋๋๋ผ๋ ํ์ฅ์ฑ์ ์ข์์ง๋ฉฐ, ์ฑ ์์ ธ์ผํ ๋ ธ๋์ ์ญํ ์ด ๋ถ๋ฆฌ๋์ด ์บ์ ํํธ๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋ถ์ฐํ์ฌ write์ HA(๊ณ ๊ฐ์ฉ์ฑ)์ ํ๋ณด๋จ.
2.2.3 Query Off Loading์ ํตํ ์ฑ๋ฅ ํฅ์
- ์ด master/slave replication์ ๋ฟ๋ง ์๋๋ผ ์ถ๊ฐ์ ์ธ ์ฑ๋ฅ์ ํฅ์์ ์ํด์ 'Query Off Loading'์ด๋ผ๋ ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ ๋์์ ์์์๋ ์ฒ๋ฆฌ ์๋๋ฅผ ๋๋ฆด ์ ์์ต๋๋ค.
- Query Off Loading: master node๋ write only, slave node๋ read only ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ฉฐ, redis ๋ฟ๋ง ์๋๋ผ Oracle, MySQL๊ณผ ๊ฐ์ RDBMS์์๋ ๋ง์ด ์ฌ์ฉํ๋ ์ํคํ ์ณ ํจํด์ ๋๋ค.
- ๋๋ถ๋ถ์ DB ํธ๋ ์ ์ ์ ์น์์คํ ์ ๊ฒฝ์ฐ write๊ฐ 10~20%, read๊ฐ 70~90% ์ ์ด๊ธฐ ๋๋ฌธ์, read ํธ๋ ์ ์ ์ ๋ถ์ฐ ์ํจ๋ค๋ฉด, ์ฒ๋ฆฌ ์๊ฐ๊ณผ ์๋๋ฅผ ๋น์ฝ์ ์ผ๋ก ์ฆ๊ฐ ์ํฌ ์ ์์ต๋๋ค.
- ํนํ redis์ ๊ฒฝ์ฐ value์ ๋ํ ์ฌ๋ฌ๊ฐ์ง ์ฐ์ฐ(ํฉ์งํฉ,๊ต์งํฉ,Range Query)๋ฑ์ ์ํํ๊ธฐ ๋๋ฌธ์, ๋จ์ PUT/GET๋ง ํ๋ NoSQL์ด๋ memcached์ ๋นํด์ read์ ์ฌ์ฉ๋๋ resource์ ์์ด ์๋์ ์ผ๋ก ๋๊ธฐ ๋๋ฌธ์ redis์ ์ฑ๋ฅ์ ๋์ด๊ธฐ ์ํด์ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ์ ๋๋ค.
2.2.4 Redis-Cluster
- Redis์ ๋ฉ๋ชจ๋ฆฌ๋ ์ ํ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ฃผ๊ธฐ์ ์ผ๋ก Scale out์ ํด์ผํฉ๋๋ค.
- scale out : ์๋ฒ๋ฅผ ์ถ๊ฐํ์ฌ ์๋ฒ ์ฑ๋ฅ์ ๋์ ๋๋ค.
- scale up : ๋จ์ผ ์๋ฒ์ ์คํ์ ์ฌ๋ ค ์๋ฒ ์ฑ๋ฅ์ ๋์ ๋๋ค.
- master๋ฅผ ์ฌ๋ฌ๊ฐ ๋์ด ๋ถ์ฐ ์ ์ฅ์ด ๊ฐ๋ฅํ๋ฉฐ(Sharding), scale out ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ์๋ฒ๋ฅผ ๋๋ฆด์๋ก ์ ์ฅํ ์ ์๋ ๊ณต๊ฐ์ด ๋ฌดํ๋๋ก ์ปค์ง๋ค.
- master์ ํ๋ ์ด์์ slave ๋ฅผ ๋ ์ ์๋ค.
- master 1,2,3 ์ด ์๋ค๋ฉด ๋ฐ์ดํฐ๋ 3๊ฐ์ค์ ํ๋์ ์ ์ฅ๋๋ฉฐ, client ๊ฐ ๋ฐ์ดํฐ ์ฝ๊ธฐ ์์ฒญ์ ์ ์ฅ๋ ๊ณณ์ด ์๋ ๋ค๋ฅธ ๋ง์คํฐ์ ์์ฒญ ํ๋ค๋ฉด ์ ์ฅ๋ ๋ง์คํฐ ์ ๋ณด๋ฅผ ์๋ ค์ฃผ๋ฉฐ, ํด๋ผ์ด์ธํธ๋ ์ ๋ฌ๋ฐ์ ๋ง์คํฐ ์ ๋ณด์ ๋ค์ ์์ฒญํด์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์์ผ ํฉ๋๋ค.
- But, ํด๋น ๋ถ๋ถ์ redis-cluster ๋ฅผ ์ง์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋ค ํด์ค๋ค.
+ ์ฐธ๊ณ : Redis ์ํคํ ์ณ์ ๋ฐฐ๊ฒฝ ๋ฐ ํจ์ฉ์ฑ
- [Blog] Redis ์ํคํ ์ณ: https://azderica.github.io/01-db-nosql-redis/
3. Redis ์ฃผ์ ๊ธฐ๋ฅ
3.1 Scalability
Memcached์ ํ์ฅ์ฑ์ Scale up(vertical)์ ํตํด์ ์ป์ ์ ์๋ ๋ฐ๋ฉด, Redis๋ Scale out(horizontal)์ ํตํด ์ป์ ์ ์์ต๋๋ค.
3.2 Data Eviction ์ ๋ต
์บ์๋ ์ ํํ ๋ฆฌ์์ค๋ฅผ ์ง๋๋ฏ๋ก, ๊ฒฐ๊ตญ ๋ฉ๋ชจ๋ฆฌ์ ์๋ฆฌ์ก์ ์์์ ์ธ์ ๊ฐ ์ซ์๋ด์ผํ ์๊ฐ๋ค์ด ์ฐพ์์ค๊ธฐ ๋ง๋ จ์ ๋๋ค. ํค๋ฅผ ์ญ์ ํ์ง ์์ผ๋ฉด ๋ชจ๋ ๋ณด๊ด๋๋ฉฐ, ์ฌ์ง์ด ์๋ฒ๋ฅผ ์ข ๋ฃํ๋ค๊ฐ ๋ค์ ์ผ๋ ์ํ๊ฐ ์ ์ง๋ฉ๋๋ค.
์ด๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด Memcached์ ๊ฒฝ์ฐ, LRU(Least Recently Used) ์๊ณ ๋ฆฌ์ฆ๋ง์ ์ฑํํ๊ณ ์์ต๋๋ค. ๋ฐ๋ฉด Redis์ ๊ฒฝ์ฐ ๋ณด๋ค ๋ค์ํ๊ณ ๋ฏธ์ธํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
- No Eviction: ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ๋ฉด ์๋ฌ๋ฅผ ๋์ง
- All Keys LRU: LRU์ ๊ทผ๊ฑฐํ์ฌ eviction ํ๊ธฐ
- Volatile LRU: LRU๋ฅผ ๋ฐ๋ฅด๋, ๋ง๋ฃ ์์ ์ด ์ง์ ๋ ๊ฒ๋ค์ ํํด์ eviction ์ํ
- All Keys Random: ๋๋คํ๊ฒ ํค ์ญ์
- Volatile Random: ๋๋คํ๊ฒ ํค ์ญ์ ํ๋, ๊ทธ ๋์์ ๋ง๋ฃ ์์ ์ด ์ง์ ๋ ๊ฒ๋ค๋ก ํ์
- Volatile TTL: TTL ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก, ๋ง๋ฃ์์ ์ด ๋นจ๋ฆฌ ๋๋ํ๋ ์์๋๋ก ์ญ์
3.3 ๋ฐ์ดํฐ ์ ์ฅ (Persistance)
Redis๋ RDB ํน์ AOF ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋ ๊ธฐ๋ฅ์ด ์๋ ๋ฐ๋ฉด, Memcached๋ ๋ค๊ณ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋ ๊ธฐ๋ฅ ์์ต๋๋ค. ๋ฐ๋ผ์ Memcached๋ ์บ์๋ก์์ ๊ธฐ๋ฅ๋ฐ์ ์ํํ์ง ๋ชปํฉ๋๋ค. ๋ฌผ๋ก , RDB ํน์ AOF ๊ธฐ๋ฐ ๋ฐ์ดํฐ ์ ์ฅ์ด ํ์ผ์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋กํ๋ ๊ฒ์ด๊ธฐ์ ์ฑ๋ฅ์ ์ ํ์ํต๋๋ค. ๋ฐ๋ผ์ Master ๋ ธ๋์์๋ ์๋น์ค๋ง ํ๊ณ Slave ์์ ๋ฐฑ์ ํ๋ ํํ๋ก ์ฌ์ฉํฉ๋๋ค.
- RDB(Snapshot)
- ์ฃผ๊ธฐ์ ์ผ๋ก Redis RDB Dump ํฌ๋งท์ ๋ง์ถฐ Fork๋ฅผ ๋ ์ ์์ ํ๋ก์ธ์ค๋ฅผ full scanํ์ฌ ๋์คํฌ์ ์ ์ฅํฉ๋๋ค(Snapshot).
- "SAVE", "BGSAVE"์ ์ฐจ์ด๋ BG์ ๊ฒฝ์ฐ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์งํํ๋ SAVE์ ๊ฒฝ์ฐ ๋ชจ๋ ์์ ์ ๋ฉ์ถ๊ณ RDB ํ์ผ์ ์์ฑํ๊ธฐ์ ํด๋น ์๊ฐ๋์์ ์๋น์ค๋ฅผ ํ ์ ์์.
- AOF(Append On File)
- ๋ชจ๋ ๋ ์ฝ๋์ ์์ ๋ด์ญ์ append-only file์ ๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ค๋ก ๊ธฐ๋กํ๋ ๋ฐฉ๋ฒ
- ๋งค ํธ๋์ญ์ ์ loggingํ๊ธฐ์ ๋ฐ์ดํฐ์ ์์ด ๋ง์์ง ์ ์์ผ๋ ๋ฐ์ดํฐ ์์ค์ด ์์ผ๋ฉฐ ํญ์ ์ต์ ๋ฐ์ดํฐ๋ฅผ ๋์คํฌ์ ๋ฐฑ์ ๊ฐ๋ฅ.
- ์ด๋, AOF ํ์ผ์ด ์ผ์ ํฌ๊ธฐ ์ด์๋๋ฉด, ํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ RDB ๋ฐฉ์์ผ๋ก ๋คํํ๊ณ AOF ํ์ผ์ ์๋ก ์์ฑํจ.
- ์ฌ๊ธฐ์, ์๋ฒ๊ฐ ์ฌ์์๋ ๋ ๋ฐฑ์ ๋ ์ค๋ ์ท์ reloadํ๊ณ AOF์ ๋ก๊ทธ๋ฅผ replay ํ๊ธฐ์ ์ฃผ๊ธฐ์ ์ผ๋ก ์ค๋ ์ท์ ํ๋ ๊ฒ์ด ์ค์ํจ.
3.4 ํธ๋์ญ์ ์ง์
- WATCH / MULTI / EXEC ๋ฑ์ ๋ช
๋ น์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก optimistic lock ๊ธฐ๋ฐ ํธ๋์ญ์
์ ์ง์ํจ.
- MULTI: ํธ๋์ญ์ ์์
- DISCARD: ํธ๋์ญ์ ์ทจ์
- EXEC: ํธ๋์ญ์ ์ปค๋ฐ
- WATCH: ํน์ key์ ๋ณ๊ฒฝ ์ฌ๋ถ ๊ฐ์
- UNWATCH: watch ์ทจ์
3.5 Pub/Sub ์ง์
- Redis๋ ๋ฉ์์ง ์๋ฃจ์ ์ผ๋ก pub/sub์ ์ง์ํจ.
- ๋ฉ์์ง๋ค์ queue๋ก ๊ด๋ฆฌํ์ง ์๊ณ , publichํ๋ ์์ ๊ธฐ์ค์ผ๋ก ๋ฏธ๋ฆฌ subscribe ๋ฑ๋ก ๋๊ธฐ ์ค์ธ ํด๋ผ์ด์ธํธ๋ค์ ๋์์ผ๋ก๋ง ๋ฉ์์ง๋ฅผ ์ ๋ฌํจ.
4. ์ถ๊ฐ์ ์ผ๋ก ์ฐพ์๋ณด๋ฉด ์ข์ ๊ฐ๋
- ๋ถํ ๋ถ์ฐ -> Constant Hashing
- Data Grid -> Spring Gemfire, Hazlecast
- Redis ์ค์ฌ์ฉ: https://www.digitalocean.com/community/cheatsheets/how-to-run-transactions-in-redis
์ฐธ๊ณ
- [DB Engines Ranking] Redis: https://db-engines.com/en/system/Redis
- [Blog] Memcached vs Redis, Which One to Pick?: https://www.linkedin.com/pulse/memcached-vs-redis-which-one-pick-ranjeet-vimal/
- [Blog] Redis ์ํคํ ์ณ: https://azderica.github.io/01-db-nosql-redis/
- [Blog] Memcached vs Redis ํน์ง ๋น๊ต: https://luran.me/359
- [redis] cache vs session store: https://redis.com/blog/cache-vs-session-store/
- [Blog] Memcached, Redis: https://brownbears.tistory.com/m/43