필사 모드: 인메모리 캐싱 & KV 스토어 2026 — Redis 8 / Valkey / KeyDB / Dragonfly / Memcached / Garnet (Microsoft) / Speedb 심층 비교
한국어1. 2026년 캐싱 지도 — Redis vs Valkey 분열의 시대
2026년의 인메모리 캐시는 더 이상 "Redis 면 끝" 인 단순한 시장이 아닙니다. 2024년 3월 Redis Ltd. 가 BSD 라이선스를 버리고 RSALv2 / SSPL 듀얼 라이선스로 전환하면서, 클라우드 벤더들이 더 이상 Redis 를 매니지드 서비스로 자유롭게 팔 수 없게 됐고, 그 반발로 Linux Foundation 이 Valkey 라는 포크를 받아들였습니다. 결과적으로 1년 반 만에 캐시 시장은 다섯 갈래로 갈라졌습니다.
- Redis 8 — RSALv2 / SSPL 로 살아남은 본가
- Valkey — Linux Foundation 산하 오픈소스 포크 (AWS / GCP / Oracle / Snap / Alibaba 후원)
- Dragonfly — 멀티 스레드 RESP 호환 신예 (Roman Gershman 창업)
- KeyDB — 멀티 스레드 Redis 포크, Snap 이 인수
- Garnet — Microsoft Research 가 2024년 3월 공개한 .NET 기반 RESP 호환 서버
여기에 Memcached(여전히 단순함), Apache Ignite / Hazelcast / Infinispan(JVM 진영), Aerospike(하이브리드 메모리/디스크), Tarantool(러시아), Skytable(Rust), 그리고 RocksDB 포크인 Speedb 까지 합치면 — 2026년의 캐싱 선택지는 \"무엇을 안 골라도 되나\" 가 더 어려워졌습니다.
이 글은 그 모든 캐시 / KV 스토어를 2026년 5월 기준으로 한 번에 훑는 가이드입니다. 단순 사이드캐시가 필요한 작은 팀부터, 멀티 리전 글로벌 시스템을 짜는 큰 팀까지, 자기에게 맞는 도구를 고르는 지도를 그려 드리는 게 목표입니다.
2. Redis 8 — RSALv2/SSPL 라이선스 변경 이후
Redis Ltd. 는 2024년 3월 20일, Redis 7.4 부터 BSD 3-Clause 를 버리고 Redis Source Available License v2 (RSALv2) 와 Server Side Public License v1 (SSPLv1) 의 듀얼 라이선스로 전환한다고 발표했습니다. 그리고 2025년 5월, BSD 시절의 마지막 분기였던 Valkey 와 충돌을 의식한 듯 Redis 8 을 BSD 가 아닌 AGPLv3 옵션을 더해 발표했습니다 — 즉 비클라우드 사용자는 다시 \"오픈소스\" 로 받을 수 있게 됐지만, 클라우드 벤더가 매니지드로 팔려면 여전히 RSALv2 / SSPL / 상용 라이선스가 필요한 구조입니다.
Redis 8 의 핵심 변화를 빠르게 정리하면 다음과 같습니다.
- 멀티 스레드 I/O 강화 — 기존 단일 스레드 코어는 그대로지만, 네트워크 I/O 와 디스크 I/O 를 별도 스레드 풀로 분리
- Vector Sets 정식 진입 — 임베딩 벡터를 코어에 1급 시민으로 (RediSearch 의 HNSW 보다 가벼움)
- Streams 의 Consumer Group 자동 페일오버 개선
- HyperLogLog, Bitfield, Geo 명령들의 RESP3 응답 정비
- Cluster mode 의 자동 슬롯 리밸런싱 알고리즘 개선
- RedisJSON, RediSearch, RedisTimeSeries, RedisBloom 모듈을 코어에 통합 (단, AGPL 옵션 시 모듈은 별도)
Redis 8 의 라이선스 정책은 결국 \"AWS / GCP / Azure 같은 하이퍼스케일러가 Redis 를 매니지드로 팔지 못하게 막는다\" 가 본질입니다. 일반 개발자는 그대로 도커로 띄워 쓸 수 있지만, EKS 위에서 Redis 를 \"공식 매니지드\" 처럼 SaaS 로 다시 파는 행위는 SSPL 위반이 됩니다.
Redis 8 도커 실행 (개인 / 사내 사용은 자유)
docker run -d --name redis8 \
-p 6379:6379 \
-v redis8-data:/data \
redis:8
벡터 셋 사용 (Redis 8 신규 자료구조)
redis-cli VSET.ADD myset:vectors "doc-1" 0.1 0.2 0.3 0.4
redis-cli VSET.SEARCH myset:vectors VECTOR 0.1 0.2 0.3 0.4 COUNT 10
Redis 8 의 한국어 / 일본어 한국형 운영 환경에서 가장 큰 변화는 Sentinel 의 deprecate 입니다. Redis Ltd. 는 7.x 시절부터 Sentinel 대신 Cluster mode 를 권장했고, 8 부터는 Sentinel 코드 자체가 \"maintenance only\" 모드로 들어갑니다. 카카오, 토스 같이 Sentinel 기반 HA 를 운영하던 곳은 Cluster mode 마이그레이션이 2026년 가장 큰 인프라 작업 중 하나가 됐습니다.
3. Valkey — Linux Foundation Redis fork (2024.3)
Valkey 는 Redis 라이선스 변경 발표 후 단 8일 만에 출범한 Linux Foundation 산하 포크입니다. AWS, Google Cloud, Oracle, Snap, Alibaba, Verizon, Ericsson 등이 주요 후원사로 참여하며, 사실상 \"하이퍼스케일러 연합의 Redis 백업\" 으로 자리잡았습니다.
Valkey 의 핵심 약속.
- BSD 3-Clause 라이선스 — 영구적, 변경 불가
- Redis 7.2.4 코드 베이스에서 분기 (RESP2 / RESP3 호환)
- 거버넌스는 LF 의 기술 위원회 (TSC) 가 결정
- AWS, Google, Oracle 의 코어 엔지니어들이 메인 컨트리뷰터
2025년 4월 Valkey 8.0 이 발표됐고, 2026년 5월 기준 Valkey 8.1 이 stable. Valkey 의 핵심 차별화 포인트는 다음과 같습니다.
- 멀티 스레드 I/O 가 기본 — Redis 8 보다 도입이 빠름
- Per-key 락 (key-level locking) 으로 핫키 분산 처리 향상
- RDMA(원격 직접 메모리 액세스) 기반 클러스터 통신 옵션
- Asynchronous replication 의 reliability 개선
- VKEYS 라는 새 자료구조 (벡터 검색, Redis 의 Vector Sets 와 별개 구현)
AWS 는 2024년 말부터 Elasticache for Valkey 를 정식 출시했고, 같은 시점 \"기존 Elasticache for Redis 보다 33% 저렴\" 이라는 가격표를 내걸었습니다. GCP 의 MemoryStore 도 2025년 중반부터 Valkey 옵션을 제공합니다.
Valkey 도커 실행
docker run -d --name valkey \
-p 6379:6379 \
-v valkey-data:/data \
valkey/valkey:8.1
Redis-cli 가 그대로 동작 (RESP 호환)
redis-cli -h localhost SET key1 "Valkey value"
redis-cli -h localhost GET key1
→ "Valkey value"
기존 Redis 클라이언트(redis-py, ioredis, lettuce, jedis, go-redis) 는 코드 변경 없이 Valkey 에 붙습니다. 마이그레이션 비용이 낮은 게 Valkey 의 최대 강점입니다.
4. KeyDB — Snap 인수
KeyDB 는 2019년 EQ Alpha Technology 가 만든 멀티 스레드 Redis 포크입니다. 코어 자체는 Redis 와 동일한 자료구조 / 명령을 지원하지만, 멀티 스레드 이벤트 루프로 단일 호스트에서 더 많은 코어를 사용할 수 있게 한 게 차별점이었습니다.
2022년 1월 Snap (Snapchat 모회사) 이 EQ Alpha 를 인수했고, KeyDB 는 Snap 의 내부 캐시 인프라로 흡수됐습니다. 한동안 \"진짜 죽은 거 아니냐\" 는 우려가 있었지만, 2024년 Snap 이 KeyDB 코드 베이스의 일부를 Valkey 에 기여하면서 다시 활성화됐습니다.
KeyDB 의 차별화.
- Multi-threading — 단일 인스턴스가 여러 코어 사용
- Active-Active replication — 양방향 동기 (Multi-master)
- FLASH 모드 — RocksDB 백엔드로 메모리 일부를 SSD 로 오프로드
- Subkey expiration — Hash 필드별 TTL 지정 가능
KeyDB 도커
docker run -d --name keydb \
-p 6379:6379 \
-e KEYDB_THREADS=4 \
eqalpha/keydb
Active-Active 양방향 동기 설정 (개념)
keydb-cli REPLICAOF 192.168.1.10 6379
keydb-cli REPLICAOF 192.168.1.11 6379
양쪽이 서로의 replica 가 되어 양방향 동기
2026년 시점에서 KeyDB 의 위치는 애매합니다. 단일 호스트 멀티 스레드는 Dragonfly 가 더 빠르고, Active-Active 는 Redis Enterprise 의 CRDT 가 더 안정적이고, Snap 의 적극적 마케팅도 끊긴 상태입니다. 그래도 기존 KeyDB 사용자가 \"라이선스 걱정 없이 멀티 스레드 Redis 를 쓰고 싶다\" 면 KeyDB 7.x 는 여전히 매력적인 선택지입니다.
5. Dragonfly — 멀티 스레드 경쟁자
Dragonfly 는 2022년 5월 Roman Gershman (前 Google 엔지니어) 이 공개한 RESP 호환 인메모리 데이터스토어입니다. \"Redis 보다 25배 빠르다\" 는 벤치마크로 화제가 됐고, 2026년 현재 캐시 진영에서 가장 빠르게 성장하는 신예입니다.
Dragonfly 의 핵심 차별화는 진짜 멀티 스레드 아키텍처입니다. Redis 는 단일 스레드 이벤트 루프, KeyDB / Valkey 는 \"멀티 스레드 I/O + 단일 스레드 코어\" 인데, Dragonfly 는 코어 자체가 shard-per-thread 구조입니다. 즉 8 코어 머신에서 8개의 독립적인 샤드가 같은 프로세스 안에서 동작합니다.
기술적 차별화.
- Shard-per-thread — 한 코어가 한 샤드의 모든 키를 소유
- Threadsafe IO — io_uring 기반 비동기 I/O
- Memory-efficient — Redis 대비 메모리 사용량 30~50% 절감 (LRU + 압축)
- Snapshot — fork-less BGSAVE (Redis 의 fork() 폭탄 회피)
- BulSearch / Vector search 내장
Dragonfly 도커
docker run -d --name dragonfly \
--ulimit memlock=-1 \
-p 6379:6379 \
docker.dragonflydb.io/dragonflydb/dragonfly
Redis 와 동일한 클라이언트 사용
redis-cli SET large_key "value"
redis-cli MEMORY USAGE large_key
→ Dragonfly 는 Redis 보다 작게 표시
Dragonfly 의 license 는 BSL 1.1 (Business Source License) 입니다. 즉 4년 후 Apache 2.0 으로 자동 전환되지만, 그 전에는 \"Dragonfly 와 경쟁하는 SaaS\" 로는 못 씁니다. 일반 개발자 / 사내 운영자는 무료로 사용 가능합니다.
Dragonfly Inc. 는 Dragonfly Cloud (매니지드 서비스) 와 Dragonfly Swarm (멀티 노드 클러스터) 을 상용으로 팔고 있고, 2024 ~ 2025년 사이 시리즈 B 펀딩까지 받았습니다.
6. Memcached — 여전히 간단함
Memcached 는 2003년 Brad Fitzpatrick 이 LiveJournal 을 위해 만든 최초의 분산 인메모리 캐시입니다. 23년이 지난 2026년에도 살아있고, 일부 영역에서는 여전히 1순위입니다.
Memcached 가 살아남은 이유는 단순함입니다.
- 키 / 값만 저장 (자료구조 없음 — Hash / List / Set 모두 클라이언트에서 직렬화)
- LRU 정책으로 자동 eviction
- Multi-thread 가 기본 (Redis 보다 먼저)
- 영구화 없음 — 재시작 시 데이터 손실 (의도된 선택)
- Slab allocator — 메모리 단편화 회피
Memcached 도커 실행 (단순한 캐시)
docker run -d --name memcached \
-p 11211:11211 \
memcached:1.6 \
-m 512 \
-t 4
telnet 으로 직접 접근 (단순한 텍스트 프로토콜)
telnet localhost 11211
> set hello 0 60 5
> world
> STORED
> get hello
> VALUE hello 0 5
> world
> END
Facebook, Twitter (구), Pinterest 같은 거대 웹 서비스들이 Memcached 를 \"순수 캐시\" 로 사용합니다. Redis 의 자료구조 / 영구화 / 트랜잭션이 필요 없는 상황에서는 Memcached 가 더 가볍고 빠릅니다.
2026년 한국 사례로는 네이버 검색의 일부 캐시 계층 (검색 키워드 → 결과 ID) 이 여전히 Memcached 위에서 돌아갑니다. 일본에서는 LINE 메신저 일부 백엔드, Yahoo Japan 검색이 Memcached 를 사용합니다.
7. Garnet (Microsoft, 2024.3) — .NET 기반 RESP 호환
Garnet 은 Microsoft Research 가 2024년 3월 18일 깜짝 공개한 .NET 기반 RESP 호환 인메모리 데이터스토어입니다. 그리고 가장 충격적인 부분은 \"Redis 대비 단일 노드 처리량 100~900% 향상\" 이라는 벤치마크였습니다.
Garnet 의 핵심.
- .NET 8 / 9 기반 — C# 으로 작성됨 (Garbage collector 위에서 작동)
- RESP2 / RESP3 호환 — Redis 클라이언트가 그대로 붙음
- Tsavorite KV store — Microsoft 의 자체 KV 엔진 (FASTER 의 후계)
- Pub/Sub, Streams, Cluster mode 지원
- 멀티 스레드 + Lock-free 자료구조
Garnet 도커
docker run -d --name garnet \
-p 6379:6379 \
ghcr.io/microsoft/garnet
Redis-cli 가 그대로 동작
redis-cli PING
→ PONG
redis-cli SET hello "Garnet"
redis-cli GET hello
→ "Garnet"
Garnet 의 특이점은 \"GC 위에서 도는 .NET 캐시가 C 로 짠 Redis 보다 빠를 수 있다\" 는 증명입니다. Microsoft 가 Tsavorite KV (이전 FASTER) 를 수년간 다듬어 온 결과로, 멀티 코어 환경에서 lock-free 큐 / hash 가 큰 차이를 만듭니다.
라이선스는 MIT — Apache 2.0 / BSD 진영의 가장 자유로운 모델입니다. 즉 클라우드 벤더가 Garnet 을 매니지드로 팔아도 됩니다. Azure 는 \"Garnet for Azure Cache\" 미리보기를 2025년 말에 공개했습니다.
단점은 .NET 의존성입니다. 운영자가 .NET 런타임을 잘 모르면 GC 튜닝 / 메모리 프로파일링이 어렵습니다. 그래서 \"Garnet 은 .NET 회사가 쓰기 좋다\" 가 현재 시장의 일반론입니다.
8. Apache Ignite / Hazelcast / Infinispan — JVM 진영
JVM 진영에는 인메모리 \"데이터 그리드\" 라는 별개 카테고리가 있습니다. Redis 처럼 단순한 KV 가 아니라, SQL 쿼리 / 트랜잭션 / Compute / 머신러닝 추론까지 함께 처리하는 큰 통합 플랫폼입니다.
Apache Ignite
Apache Foundation 의 인메모리 데이터 그리드 + 컴퓨팅 플랫폼. SQL ANSI-99 호환, 분산 트랜잭션, 머신러닝 모듈, 그리고 디스크 영구화 (Native Persistence) 까지 지원합니다.
// Java 에서 Ignite 클러스터에 접근
Ignite ignite = Ignition.start();
IgniteCache cache = ignite.cache("orders");
cache.put("order:1", new Order(...));
// SQL 도 그대로
SqlFieldsQuery query = new SqlFieldsQuery(
"SELECT id, amount FROM Order WHERE customerId = ? LIMIT 100");
List rows = cache.query(query.setArgs(42)).getAll();
Apache Ignite 는 2026년 현재 GridGain 의 상용 디스트리뷰션이 메인 채널입니다. 미국 항공 / 금융 / 헬스케어 같은 규제 산업에서 인메모리 SQL 그리드로 활발히 쓰입니다.
Hazelcast
상용 인메모리 데이터 그리드의 대표 주자. Java / Node / Python / C++ 클라이언트, Jet (스트림 처리), Hazelcast IMDG / Hazelcast Platform 등 풀 스택을 제공합니다.
- 분산 Map / Queue / Set / Lock / Semaphore
- Compute Grid — 분산 작업 실행
- Jet — Stream Processing (Apache Flink 와 유사)
- Hazelcast Mancenter — 클러스터 모니터링 / 관리
Infinispan (Red Hat)
Red Hat 의 오픈소스 인메모리 데이터 그리드. JBoss / Quarkus / Wildfly 와의 통합이 강점이고, JCache (JSR 107) 표준 구현체입니다.
JVM 진영의 도구들은 \"단순 캐시\" 가 아니라 \"인메모리 데이터 플랫폼\" 입니다. JVM 위에서 일하는 큰 엔터프라이즈 (은행, 보험, 통신, 공공) 가 주요 고객입니다.
9. Aerospike — 하이브리드 메모리/디스크
Aerospike 는 \"인덱스는 RAM, 데이터는 SSD\" 라는 하이브리드 모델로 유명한 분산 KV 스토어입니다. Redis 처럼 모든 데이터를 RAM 에 올리지 않고, NVMe SSD 의 랜덤 액세스 성능에 의존해 매우 큰 데이터셋을 다룹니다.
핵심 차별화.
- Hybrid Memory Architecture — 인덱스만 RAM, 값은 SSD 직접 액세스
- Strong consistency 옵션 (Aerospike SC)
- Cross-datacenter Replication (XDR)
- Aerospike Vector Search — 2024년 추가
- TPS — 단일 클러스터에서 백만 TPS 이상 검증
Aerospike 도커
docker run -d --name aerospike \
-p 3000-3002:3000-3002 \
aerospike/aerospike-server
Python 클라이언트
python3 << EOF
client = aerospike.client({'hosts': [('localhost', 3000)]}).connect()
key = ('test', 'demo', 'foo')
client.put(key, {'name': 'Alice', 'age': 30})
(key, meta, bins) = client.get(key)
print(bins)
EOF
Aerospike 의 주요 고객은 광고 기술 (AppLovin, Criteo, Trade Desk), 금융 (PayPal, Wells Fargo), 게임 (King, Riot Games) 입니다. \"단일 인스턴스에 100억 키, 1ms 응답\" 같은 시나리오에서 강합니다.
2026년 현재 Aerospike 8.0 이 stable 이고, 벡터 검색 / 그래프 / 시계열 기능을 통합한 \"Multi-model database\" 로 포지셔닝하고 있습니다.
10. Tarantool — 러시아 출신 인메모리 DB
Tarantool 은 2010년 Russian Mail.ru (지금 VK) 이 만든 인메모리 데이터베이스입니다. 단순한 캐시가 아니라 Lua 기반 stored procedure, SQL, 영구화, 클러스터링까지 통합된 풀 스택 DB 입니다.
- In-memory + WAL — 메모리에 두지만 디스크에 영구화
- Lua 기반 stored procedure — 백엔드 비즈니스 로직 임베드
- SQL (Tarantool SQL) + NoSQL (tuples)
- Vinyl engine — LSM 트리 기반 디스크 엔진 (대용량용)
- Cluster — Cartridge 프레임워크로 클러스터 운영
-- Tarantool 에서 Space 정의 + 데이터 삽입 (Lua)
box.cfg{ listen = 3301 }
s = box.schema.space.create('users', {
format = { {name='id', type='unsigned'}, {name='name', type='string'} }
})
s:create_index('primary', { parts = {'id'} })
s:insert{1, 'Alice'}
s:insert{2, 'Bob'}
print(s:get{1})
-- → [1, 'Alice']
러시아 / 동유럽에서는 Tarantool 이 Redis 대안으로 활발히 쓰이고, 일본에서는 NTT 가 5G Core Network 의 세션 저장소로 Tarantool 을 채택한 사례가 유명합니다. 한국에서는 거의 안 보이지만, 글로벌 시장 (특히 통신 / 게임) 에는 깊은 사용자 베이스가 있습니다.
2022년 이후 러시아 IT 의 국제 제재 영향으로 핵심 개발팀이 분리되어 \"Picodata\" 라는 새 프로젝트로 분기됐고, 두 갈래로 발전 중입니다.
11. AWS Elasticache vs MemoryDB vs Valkey 옵션
AWS 의 인메모리 캐시 / KV 서비스는 2026년 시점에서 세 갈래로 나뉘어 있습니다. 어떤 걸 골라야 하는지 표로 정리하면.
| 서비스 | 라이선스 | 영구화 | 가격 | 사용 시나리오 |
|--------|----------|---------|------|---------------|
| Elasticache for Redis | RSALv2/SSPL | 옵션 (Backup) | 표준 | Redis 호환성이 최우선 |
| Elasticache for Valkey | BSD | 옵션 (Backup) | Redis 대비 33% 저렴 | 새 워크로드, 라이선스 걱정 |
| Elasticache for Memcached | BSD | 없음 | 가장 저렴 | 순수 캐시 |
| MemoryDB for Redis | RSALv2/SSPL | 강제 (Multi-AZ WAL) | 가장 비쌈 | Primary DB 로 사용 |
| MemoryDB for Valkey | BSD | 강제 (Multi-AZ WAL) | MemoryDB Redis 대비 약간 저렴 | Primary DB, 라이선스 자유 |
MemoryDB 는 \"Redis 호환 인터페이스를 가진 영구 KV DB\" 입니다. Multi-AZ WAL 로 데이터 손실 0 을 보장하지만, 대신 가격이 Elasticache 의 3 ~ 4배입니다. 즉, Elasticache 는 \"DB 앞의 캐시\", MemoryDB 는 \"DB 그 자체\" 라는 포지션입니다.
AWS CLI 로 Elasticache for Valkey 클러스터 생성
aws elasticache create-cache-cluster \
--cache-cluster-id my-valkey \
--engine valkey \
--engine-version 8.1 \
--cache-node-type cache.t4g.small \
--num-cache-nodes 1
MemoryDB for Valkey 클러스터 (영구 + Multi-AZ)
aws memorydb create-cluster \
--cluster-name my-memorydb \
--engine valkey \
--node-type db.t4g.small \
--num-shards 1 \
--num-replicas-per-shard 2
2026년 5월 기준 AWS 의 권장 사항은 \"새 프로젝트는 Valkey 부터 시작하고, 기존 Redis 와이어 호환만 필요하면 Elasticache for Valkey, Multi-AZ 영구화가 필요하면 MemoryDB for Valkey\" 입니다. 라이선스 변경의 충격이 가격표에 그대로 반영된 셈입니다.
12. Skytable / Speedb — Rust + RocksDB fork
\"차세대 후보\" 로 분류되는 두 프로젝트가 2026년 주목받고 있습니다.
Skytable
Skytable 은 Rust 로 작성된 BSL 라이선스 NoSQL 데이터베이스입니다. RESP / Skyhash 두 가지 프로토콜 지원, SQL 비슷한 BlueQL 쿼리 언어, 그리고 \"행 기반 + 키-값 하이브리드\" 모델입니다.
Skytable 도커
docker run -d --name skytable -p 2003:2003 skytable/sky:latest
Skytable CLI (skysh)
skysh -p 2003
> create model app.users(username: string, password: string)
> insert into app.users('alice', 'secret123')
> select * from app.users where username = 'alice'
Skytable 의 강점은 Rust 의 안전성 + 멀티 스레드 + 단일 바이너리입니다. \"Redis 대안인데 SQL 비슷한 게 가능했으면 좋겠다\" 는 작은 팀들 사이에서 점진적으로 채택되고 있습니다.
Speedb
Speedb 는 Meta 의 RocksDB 를 포크해서 만든 \"빠른 RocksDB\" 입니다. RocksDB 의 API 는 그대로 유지하면서, 컴팩션 / Bloom Filter / 메모리 관리를 다시 짜서 동일 워크로드에서 2~5배 처리량을 냅니다.
- API 완전 호환 — RocksDB 코드 변경 없이 라이브러리 교체만으로 적용 가능
- Apache 2.0 라이선스
- 압축 후 메모리 사용량 약 40% 절감
// C++ 에서 Speedb 사용 (RocksDB 와 동일한 인터페이스)
#include <rocksdb/db.h>
rocksdb::Options options;
options.create_if_missing = true;
rocksdb::DB* db;
rocksdb::DB::Open(options, "/tmp/speedb_test", &db);
db->Put(rocksdb::WriteOptions(), "hello", "world");
std::string value;
db->Get(rocksdb::ReadOptions(), "hello", &value);
// → "world"
Speedb 는 단독 KV 스토어가 아니라 임베디드 라이브러리이므로, Redis 알트보다는 \"RocksDB 를 쓰는 모든 시스템(Kafka, MyRocks, TiKV) 의 성능 업그레이드\" 로 자리매김했습니다.
13. 인메모리 라이브러리 — node-cache / lru-cache / cachetools / Caffeine
분산 캐시 서버 외에, 애플리케이션 프로세스 내부의 인메모리 캐시도 따로 봐야 합니다. \"DB 앞에 Redis\" 가 아니라 \"애플리케이션 내부 Map 에 5분짜리 TTL\" 인 경우가 매우 많습니다.
Node.js — lru-cache, node-cache, keyv
- lru-cache (Isaac Schlueter, npm 의 저자) — 사실상 표준. LRU + TTL + max size
- node-cache — 단순 TTL 기반 (LRU 없음)
- keyv — 멀티 어댑터(Redis, SQLite, Memory) 추상화 라이브러리
// lru-cache 사용 예
const cache = new LRUCache({
max: 500,
ttl: 1000 * 60 * 5, // 5분
updateAgeOnGet: true,
})
cache.set('user:42', { name: 'Alice' })
console.log(cache.get('user:42'))
Python — cachetools, functools.lru_cache, diskcache
- functools.lru_cache — 표준 라이브러리, 데코레이터 기반
- cachetools — LRU, LFU, TTL, RR (Random Replacement) 등 다양한 정책
- diskcache — 디스크 백엔드 캐시 (단일 프로세스용 임베디드)
cachetools 사용
from cachetools import TTLCache, cached
cache = TTLCache(maxsize=100, ttl=300) # 5분
@cached(cache)
def expensive_query(user_id):
return db.query("SELECT * FROM users WHERE id = ?", user_id)
Java — Caffeine, Guava Cache, EHCache
- Caffeine (Ben Manes) — 사실상 표준. W-TinyLFU 정책, async loader, 매우 빠름
- Guava Cache — 오래된 표준. 지금은 Caffeine 으로 교체 권장
- EHCache — Terracotta / Ehcache 3, JCache 표준 구현체
// Caffeine 사용
LoadingCache cache = Caffeine.newBuilder()
.maximumSize(10_000)
.expireAfterWrite(Duration.ofMinutes(5))
.recordStats()
.build(key -> loadFromDb(key));
User user = cache.get("user-42");
Go — bigcache, ristretto, groupcache
- ristretto (Dgraph) — 동시성 최적화, W-TinyLFU
- bigcache (Allegro) — GC 최적화 (포인터 없이 byte slice)
- groupcache (Brad Fitzpatrick, Memcached 만든 사람) — singleflight 내장
라이브러리 캐시는 분산 캐시보다 훨씬 빠릅니다 (1ns vs 1ms 정도 차이). 그래서 \"L1 = 프로세스 내 라이브러리, L2 = Redis/Valkey\" 같은 다단계 캐시가 일반적 패턴입니다.
14. 분산 캐시 패턴 — cache-aside / read-through / write-through / write-back / write-around
분산 캐시를 쓸 때, 캐시와 백엔드 DB 사이의 동기화 방식을 어떻게 설계하느냐가 정확성 / 성능 / 일관성의 트레이드오프를 결정합니다.
Cache-aside (Lazy loading)
가장 흔한 패턴. 애플리케이션이 직접 캐시와 DB 를 다룹니다.
def get_user(user_id):
1. 캐시 조회
user = cache.get(f"user:{user_id}")
if user:
return user
2. 캐시 미스 → DB 조회
user = db.query("SELECT * FROM users WHERE id = ?", user_id)
3. 캐시 업데이트
cache.set(f"user:{user_id}", user, ttl=300)
return user
장점은 단순함과 캐시 장애 대응 (DB fallback). 단점은 캐시 미스 시 응답 지연.
Read-through
캐시 서버가 직접 DB 를 조회합니다. 애플리케이션은 캐시만 봅니다.
캐시 라이브러리가 loader 를 받음
@cached_loader(loader=lambda k: db.query(f"SELECT * FROM users WHERE id = '{k}'"))
def get_user(user_id):
return cache.get(f"user:{user_id}")
Caffeine 의 LoadingCache, Hazelcast 의 MapStore 가 이 패턴입니다.
Write-through
쓰기 시 캐시 → DB 순서로 동기 쓰기. 정합성은 보장되지만 쓰기가 느립니다.
Write-back (Write-behind)
쓰기 시 캐시만 업데이트하고, DB 는 비동기로 나중에 갱신. 빠르지만 캐시 장애 시 데이터 손실 위험.
Write-around
쓰기는 DB 에만, 읽기 시에만 캐시 채움. 자주 안 읽히는 쓰기가 많은 워크로드(로그, 이벤트) 에 적합.
| 패턴 | 읽기 성능 | 쓰기 성능 | 정합성 | 복잡도 |
|------|------------|------------|---------|--------|
| Cache-aside | 미스 시 느림 | 빠름 (캐시 무관) | 중간 (Race condition 가능) | 낮음 |
| Read-through | 미스 시 자동 | 빠름 | 중간 | 중간 |
| Write-through | 빠름 | 느림 (2번 쓰기) | 강함 | 중간 |
| Write-back | 빠름 | 매우 빠름 | 약함 (손실 위험) | 높음 |
| Write-around | 미스 시 느림 | 빠름 | 강함 | 낮음 |
대부분의 웹 서비스는 Cache-aside 로 시작합니다. 쓰기 패턴이 명확해지면 Write-around 또는 Read-through 로 진화하고, 정합성이 중요한 트랜잭션 시스템은 Write-through 를 채택합니다.
15. Hot key + cache stampede 문제 — singleflight + dogpile 회피
분산 캐시 운영에서 가장 자주 만나는 두 가지 사고가 \"hot key\" 와 \"cache stampede\" 입니다.
Hot key 문제
특정 키 (예: \"홈페이지 인기 상품 TOP 10\", \"오늘의 환율\") 가 모든 트래픽을 한 샤드에 집중시키는 현상. Redis Cluster 모드에서도 단일 키는 단일 샤드에 고정이라, 그 샤드의 CPU 가 100% 가 됩니다.
대응 전략.
- 키 샤딩 — \"top10:1\", \"top10:2\" 등으로 의도적 분산 후 클라이언트가 임의 선택
- 클라이언트 사이드 캐시 — Redis 6.0+ 의 client-side caching 또는 lru-cache L1
- Read replica — Redis Cluster + replica read
Cache stampede (Thundering herd / Dogpile)
캐시가 만료되는 순간 모든 요청이 DB 로 몰리는 현상. 1000 RPS 의 트래픽이 갑자기 1000개의 DB 쿼리로 변신합니다.
대응 패턴.
singleflight 패턴 — Go groupcache 에서 가져온 개념
_locks = {}
_lock_lock = threading.Lock()
def get_or_load(key, loader):
cached = cache.get(key)
if cached:
return cached
같은 키에 대해 단 1개의 로더만 동작
with _lock_lock:
if key not in _locks:
_locks[key] = threading.Lock()
key_lock = _locks[key]
with key_lock:
다시 한 번 캐시 확인 (앞선 요청이 채웠을 수 있음)
cached = cache.get(key)
if cached:
return cached
진짜 로더 실행
value = loader()
cache.set(key, value, ttl=300)
return value
다른 패턴.
- Probabilistic early expiration — 만료 직전 일부 요청만 갱신 (XFetch 알고리즘)
- Stale-while-revalidate — 만료된 값을 일단 반환하고 백그라운드 갱신
- Refresh-ahead — 만료 전 자동 백그라운드 새로고침 (Caffeine 의 refreshAfterWrite)
XFetch (Probabilistic early expiration) — Redis 7+ 의 CLIENT NO-EVICT 와 조합 가능
def xfetch(key, ttl, beta=1.0):
val, delta, expiry = cache.get_with_meta(key)
if val is None:
캐시 미스 → 항상 갱신
return refresh(key)
if time.time() - delta * beta * math.log(random.random()) >= expiry:
만료 전이지만 일부 요청만 갱신
return refresh(key)
return val
토스 / 카카오 의 운영 사례에서는 \"singleflight + Refresh-ahead\" 조합이 가장 자주 등장합니다. 즉, 한 키에 대해 단 1개의 로더만 돌고, 만료 직전 백그라운드로 자동 갱신하는 패턴입니다.
16. Redis 모듈 분열 — RedisJSON, RediSearch, RedisGraph (sunset), RedisTimeSeries, RedisBloom
Redis Ltd. 의 라이선스 변경은 모듈 생태계에도 큰 충격을 줬습니다. 2026년 시점에서 Redis 의 주요 모듈은 다음과 같은 상태입니다.
- RedisJSON — Redis 8 코어에 통합 (단, AGPL/RSAL/SSPL 라이선스)
- RediSearch — Redis 8 코어에 통합, Vector search 와 Full-text search
- RedisGraph — 2023년 7월 sunset 발표, 2025년 EOL
- RedisTimeSeries — Redis 8 코어에 통합
- RedisBloom — Redis 8 코어에 통합 (Bloom, Cuckoo, Count-Min Sketch)
Valkey 진영은 자체 대안을 개발 중입니다.
- VKEYS Vector Search — Valkey 자체 벡터 검색 (Redis 의 Vector Sets 와 별개)
- Valkey JSON — Cocoa 라는 모듈로 개발 중
- Valkey Search — RediSearch 대체로 개발 중
- Valkey Bloom — Bloom Filter 모듈 별도 개발
RedisGraph 의 EOL 은 그래프 DB 사용자들에게 충격이었습니다. 대안으로는 Memgraph (인메모리 그래프 DB), Neo4j, ArangoDB 가 거론됩니다.
Redis 8 코어에서 JSON 자료구조 사용 (모듈 별도 로드 불필요)
redis-cli JSON.SET user:1 $ '{"name":"Alice","age":30}'
redis-cli JSON.GET user:1 $.name
→ "Alice"
Vector Search (RediSearch 통합)
redis-cli FT.CREATE products ON HASH PREFIX 1 product: \
SCHEMA name TEXT embedding VECTOR HNSW 6 TYPE FLOAT32 DIM 768 DISTANCE_METRIC COSINE
모듈 통합 / 분열은 결국 \"누구의 Redis 가 표준이냐\" 의 정치적 문제입니다. 큰 회사들은 Valkey 진영의 모듈 발전 속도를 지켜보면서 천천히 마이그레이션 계획을 세우고 있습니다.
17. 한국 / 일본 — 카카오, 토스, 메르카리, NTT
각 지역의 캐시 운영 사례를 빠르게 정리합니다.
한국 — 카카오, 토스, 네이버, 쿠팡
- 카카오 — Redis Cluster + Sentinel 기반, 2024년 라이선스 변경 후 Valkey 마이그레이션 시작. 카카오톡 메시지 큐 / 친구 목록 / 채팅방 캐시
- 토스 — Redis 7.x + 자체 운영, MSA 아키텍처에서 서비스별 독립 Redis 클러스터. \"Redis 가 죽으면 토스가 멈춘다\" 는 표현이 내부에 있을 정도
- 네이버 — Memcached + Redis 혼합. 검색 결과 캐시는 여전히 Memcached, 추천 시스템은 Redis Cluster
- 쿠팡 — AWS Elasticache for Redis 대량 사용. 라이선스 충격 이후 Valkey 마이그레이션 진행 중
- 라인 (LY Corp) — Redis Sentinel + 자체 솔루션, 글로벌 데이터센터별 독립 클러스터
일본 — 메르카리, NTT, 야후재팬, LINE
- 메르카리 (Mercari) — GCP MemoryStore for Redis, 상품 검색 캐시 / 사용자 세션. 2025년부터 일부 Valkey 마이그레이션 PoC
- NTT — Tarantool 을 5G Core 의 세션 저장소로 채택한 사례가 유명. 통신 회사 특유의 안정성 요구로 Redis 보다 Tarantool 선호
- 야후재팬 — Memcached + 자체 KV. 검색 / 광고 캐시는 Memcached, 사용자 데이터는 자체 분산 KV
- LINE — Redis Cluster 대량 사용, 일본 LINE / 대만 LINE 별도 운영
- 사이게임즈 (Cygames) — Redis Cluster + Aerospike 혼합, 모바일 게임의 실시간 랭킹 / 인벤토리
한일 양국의 공통점은 \"Redis 라이선스 변경 이후 Valkey 마이그레이션을 검토 중\" 입니다. 차이는 일본이 더 보수적이라 \"검토만 길게\" 하는 반면, 한국은 \"PoC 빠르게 → 실서비스 적용\" 이 더 일반적이라는 점입니다.
18. 누가 무엇을 골라야 하나 — 단순 / 복잡 자료구조 / 분산 / 엔터프라이즈
마지막으로 \"누구에게 무엇을 권할지\" 를 정리합니다.
단순한 캐시 (TTL 만 있으면 됨)
→ Memcached. 단일 노드면 도커 한 줄, 클러스터면 클라이언트 사이드 sharding. \"Redis 의 자료구조가 필요 없다\" 는 게 확실하면 Memcached 가 가장 가볍습니다.
복잡한 자료구조 (Hash / List / Set / Sorted Set / Stream)
→ Redis 8 (라이선스 OK 면) 또는 Valkey 8.1 (오픈소스 우선). 사실상 표준이라 클라이언트 / 도구 / 문서가 가장 풍부합니다.
멀티 스레드 단일 노드 처리량
→ Dragonfly. 단일 머신에서 최대 처리량 / 최소 메모리. Redis 1:1 대체 가능.
.NET / Azure 환경
→ Garnet. MIT 라이선스 + C# 운영 친화. Azure 에서는 Cache for Garnet 미리보기 활용.
SQL + 인메모리 그리드 + 트랜잭션
→ Apache Ignite (오픈소스) 또는 Hazelcast (상용 지원). 금융 / 통신 / 헬스케어 같은 큰 엔터프라이즈 워크로드.
메모리보다 큰 데이터셋 (Hybrid)
→ Aerospike. RAM 인덱스 + SSD 데이터의 모델로 100억 키도 가능.
Lua 임베디드 비즈니스 로직 + 인메모리 DB
→ Tarantool. 통신 / 게임에 특히 적합.
AWS 매니지드
→ 새 워크로드는 Elasticache for Valkey 또는 MemoryDB for Valkey. 기존 Redis 호환만 필요하면 Elasticache for Redis 유지.
Rust / 안전성 우선
→ Skytable (또는 Dragonfly, 후자는 C++). 단일 바이너리, 메모리 안전.
RocksDB 기반 임베디드 KV
→ Speedb. 코드 변경 없이 성능 업그레이드.
프로세스 내 캐시 (애플리케이션 라이브러리)
→ Java: Caffeine. Node: lru-cache. Python: cachetools. Go: ristretto.
패턴 가이드
- 읽기 중심 + 약한 정합성 → Cache-aside + lru-cache (L1) + Redis (L2)
- 쓰기 중심 + 강한 정합성 → Write-through + Caffeine + MemoryDB
- 매우 큰 데이터 → Aerospike 또는 Ignite Native Persistence
- 글로벌 멀티 리전 → Redis Enterprise CRDT 또는 KeyDB Active-Active
- 단순 LRU → Memcached + 클라이언트 lru-cache
2026년의 캐싱 결정은 \"Redis 면 됨\" 이 아니라 \"Redis 의 어느 버전 / 포크를 어떤 패턴으로 어떤 라이브러리와 함께 쓸 것인가\" 의 다층 결정입니다. 라이선스 변경의 후폭풍은 결국 시장의 다양성을 늘렸고, 우리는 그 다양성을 잘 골라야 하는 입장이 됐습니다.
19. 참고 / References
- Redis — https://redis.io/
- Redis 8 Release Notes — https://redis.io/blog/redis-8-ga/
- Redis License FAQ — https://redis.io/legal/licenses/
- Valkey — https://valkey.io/
- Valkey GitHub — https://github.com/valkey-io/valkey
- Linux Foundation Valkey 발표 — https://www.linuxfoundation.org/press/linux-foundation-launches-open-source-valkey-community
- KeyDB — https://docs.keydb.dev/
- KeyDB GitHub — https://github.com/Snapchat/KeyDB
- Dragonfly — https://www.dragonflydb.io/
- Dragonfly GitHub — https://github.com/dragonflydb/dragonfly
- Memcached — https://memcached.org/
- Microsoft Garnet — https://microsoft.github.io/garnet/
- Garnet GitHub — https://github.com/microsoft/garnet
- Apache Ignite — https://ignite.apache.org/
- Hazelcast — https://hazelcast.com/
- Infinispan — https://infinispan.org/
- Aerospike — https://aerospike.com/
- Tarantool — https://www.tarantool.io/
- Skytable — https://skytable.io/
- Speedb — https://www.speedb.io/
- AWS Elasticache — https://aws.amazon.com/elasticache/
- AWS Elasticache for Valkey — https://aws.amazon.com/elasticache/valkey/
- AWS MemoryDB — https://aws.amazon.com/memorydb/
- GCP Memorystore — https://cloud.google.com/memorystore
- Caffeine — https://github.com/ben-manes/caffeine
- lru-cache (Node) — https://github.com/isaacs/node-lru-cache
- node-cache — https://github.com/node-cache/node-cache
- cachetools (Python) — https://github.com/tkem/cachetools
- ristretto (Go) — https://github.com/hypermodeinc/ristretto
- bigcache (Go) — https://github.com/allegro/bigcache
- groupcache (Go) — https://github.com/golang/groupcache
- XFetch 알고리즘 (Probabilistic early expiration) — https://www.vldb.org/pvldb/vol8/p886-vattani.pdf
- RedisJSON — https://github.com/RedisJSON/RedisJSON
- RediSearch — https://github.com/RediSearch/RediSearch
- RedisGraph EOL — https://redis.io/blog/redisgraph-eol/
- RedisTimeSeries — https://github.com/RedisTimeSeries/RedisTimeSeries
- RedisBloom — https://github.com/RedisBloom/RedisBloom
- Speedb vs RocksDB — https://www.speedb.io/blog
- Memgraph (RedisGraph 대안) — https://memgraph.com/
- Picodata (Tarantool 분기) — https://picodata.io/
현재 단락 (1/385)
2026년의 인메모리 캐시는 더 이상 "Redis 면 끝" 인 단순한 시장이 아닙니다. 2024년 3월 Redis Ltd. 가 BSD 라이선스를 버리고 RSALv2 / SSPL 듀...