์ฐธ๊ณ ์์
1. ๋ฌธ์ ์์: ์ ์ ์ ๋ค์ ์ค๋ณต ์ฒดํฌ๊ฐ ์ด๋ ค์ด๊ฐ?
- ์์ญ์ต ๋ช ์ ์ฌ์ฉ์๊ฐ ์๋ ๋๊ท๋ชจ ์๋น์ค์์๋ ๋จ์ํ DB ์ฟผ๋ฆฌ๋ก๋ ์ฑ๋ฅ, ์ง์ฐ, ์์คํ ๋ถํ ๋ฌธ์ ๋ฐ์
- ๋น ๋ฅด๊ณ ํ์ฅ์ฑ ์๋ ์ฒดํฌ๋ฅผ ์ํด ๋ค์ํ ๊ณ ๊ธ ์๋ฃ๊ตฌ์กฐ์ ๋ถ์ฐ ์์คํ ์ด ํ์
2. ์ฃผ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ ๋ฐ ๊ธฐ์
2.1 Redis Hashmap (๋ ๋์ค ํด์๋งต)
- ์ธ๋ฉ๋ชจ๋ฆฌ ์บ์ ๊ณ์ธต์์ ์ฌ์ฉ.
- ํ๋์ ํค ์๋ ์ฌ๋ฌ ํ๋-๊ฐ ์ ์ ์ฅ ๊ฐ๋ฅ.
- ๊ฐ ํ๋๋ ์ ์ ๋ค์, ๊ฐ์ userID๋ ํ๋๊ทธ ๋ฑ.
- ์กด์ฌ ์ฌ๋ถ๋ฅผ ์ฆ์ ํ์ธ(์บ์ ํํธ ์ DB ์ ๊ทผ ๋ถํ์).
- ๋ฉ๋ชจ๋ฆฌ ํ๊ณ๋ก ๋ชจ๋ ์ ์ ๋ค์์ ์๊ตฌ ์ ์ฅ ๋ถ๊ฐ.
๋น์ทํ ์ ์ ๋ค์์ ์ถ์ฒํ๊ฑฐ๋, ํน์ ์ ๋์ฌ๋ก ์์ํ๋ ๋ชจ๋ ์ ์ ๋ค์์ ์ฐพ๋ ๊ธฐ๋ฅ์? โ Trie
2.2 Trie (ํธ๋ผ์ด, Prefix Tree)
- ๋ฌธ์์ด์ ๊ณตํต ์ ๋์ฌ๋ฅผ ๊ณต์ ํ๋ ํธ๋ฆฌ ๊ตฌ์กฐ.
- O(M) ์๊ฐ ๋ณต์ก๋(M=๋ฌธ์์ด ๊ธธ์ด)๋ก ๊ฒ์ ๊ฐ๋ฅ(๋ฐ์ดํฐ์ ํฌ๊ธฐ์ ๋ฌด๊ด).
- ์๋์์ฑ, ์ ๋์ฌ ๊ธฐ๋ฐ ์ถ์ฒ์ ์ ํฉ.
- ์ ๋์ฌ๊ฐ ๊ฒน์น๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ, ๊ฒน์น์ง ์์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์๋ชจ ํผ.
- Radix Trie ๋ฑ ์์ถ ๋ฒ์ ์ฌ์ฉ, ์ต๊ทผ/์์ฃผ ์กฐํ๋๋ ๋ฐ์ดํฐ์ ํ์ ํด ์ฌ์ฉ.
2.3 B+ Tree (B+ํธ๋ฆฌ)
- ์ ๋ ฌ๋ ๋์ฉ๋ ๋ฐ์ดํฐ์ ์์ ํจ์จ์ ๊ฒ์.
- ๊ด๊ณํ/NoSQL DB์ ์ธ๋ฑ์ค ๊ตฌ์กฐ๋ก ๋๋ฆฌ ์ฌ์ฉ.
- O(logN) ์๊ฐ ๋ณต์ก๋, ์์ ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ์์ญ์ต ๊ฐ ๋ฐ์ดํฐ๋ ์์ญ ๋ฒ ์ด๋ด ํ์.
- ๋ฒ์ ์ฟผ๋ฆฌ, ์ํ๋ฒณ์ ์ถ์ฒ ๋ฑ์ ์ ํฉ.
- ๋จ์ผ ๋จธ์ ํ๊ณ โ Google Spanner ๋ฑ ๋ถ์ฐ DB์์ ์ํ ํ์ฅ.
2.4 Bloom Filter (๋ธ๋ฃธ ํํฐ)
- ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ , ํ๋ฅ ์ ์กด์ฌ ์ฌ๋ถ ์ฒดํฌ.
- ์ฌ๋ฌ ํด์ํจ์์ ๋นํธ ๋ฐฐ์ด๋ก ๊ตฌ์ฑ.
- โ์์โ์ 100% ํ์ค, No false negative
- โ์์โ์ ์คํ(false positive) ๊ฐ๋ฅ.
- Why? ์ฌ๋ฌ ๊ฐ์ด ๊ฐ์ ๋นํธ ์นธ์ ๊ณต์
- ํด์ํจ์ ๊ฒฐ๊ณผ๊ฐ ๊ฒน์น๋ฉด, ์ค์ ๋ก ์ถ๊ฐํ์ง ์์ ๊ฐ๋ ๋ชจ๋ ์นธ์ด 1์ด ๋ ์ ์์
- ์์
- โcatโ์ถ๊ฐ โ 2, 5, 7 bit โ 1
- โdogโ์ถ๊ฐ โ 1, 5, 8 bit โ 1
- โratโ ์ถ๊ฐ โ 2, 5, 8 bit โ ๋ชจ๋ 1์ด๊ธฐ ๋๋ฌธ์ โratโ์ด ์๋ค๊ณ ์๋ชป ํ๋จ
- Why? ์ฌ๋ฌ ๊ฐ์ด ๊ฐ์ ๋นํธ ์นธ์ ๊ณต์
- 1%์ ์คํ ํ์ฉ ์ 10์ต ๊ฐ ์ ์ ๋ค์๋ 1.2GB ๋ด์ธ ๋ฉ๋ชจ๋ฆฌ๋ก ๊ด๋ฆฌ ๊ฐ๋ฅ.
- ๋๊ท๋ชจ ์์คํ ์์ DB ๋ถํ์ ์ ๊ทผ ์ต์ํ์ ํ์ฉ.
Data Structure ย | Lookup Speedย ย ย | Memory Usageย ย ย | Supports Prefix/Autocomplete | False Positives | Best Use Caseย ย ย ย ย ย ย ย ย ย ย ย |
---|---|---|---|---|---|
Redis Hashmapย ย | Very Fastย ย ย ย | High (in-memory)ย | No ย ย ย ย ย ย ย ย ย ย ย ย ย | Noย ย ย ย ย ย ย | Exact match, recent lookups cacheย ย |
Trie ย ย ย ย ย ย | Fast (O(M))ย ย ย | Moderate~High ย ย | Yesย ย ย ย ย ย ย ย ย ย ย ย ย | Noย ย ย ย ย ย ย | Prefix search, autocomplete, suggest |
B+ Treeย ย ย ย ย | Fast (O(logN)) ย | Moderateย ย ย ย ย | No (but supports range)ย ย ย | Noย ย ย ย ย ย ย | Sorted/range queries, DB index ย ย ย |
Bloom Filter ย ย | Very Fastย ย ย ย | Very Lowย ย ย ย ย | No ย ย ย ย ย ย ย ย ย ย ย ย ย | Yes ย ย ย ย ย ย | First-line filter, reduce DB hitsย ย |
3. ๋๊ท๋ชจ ์์คํ ์ ์ค์ ์ํคํ ์ฒ
1. ๋ก๋ ๋ฐธ๋ฐ์ฑ
- ๊ธ๋ก๋ฒ(์: DNS, Anycast) โ ์ง์ญ ๋ฐ์ดํฐ์ผํฐ โ ๋ก์ปฌ(์: Nginx, AWS ELB)๋ก ํธ๋ํฝ ๋ถ์ฐ.
2. Bloom Filter
- ๊ฐ ๋ฐฑ์๋ ์๋ฒ๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ๋ธ๋ฃธ ํํฐ ๋ณต์ ๋ณธ ์ ์ง, ์ฃผ๊ธฐ์ ๋๊ธฐํ.
- โ์์โ์ด๋ฉด ์ฆ์ ์ข ๋ฃ, โ์์โ์ด๋ฉด ๋ค์ ๋จ๊ณ๋ก.
3. In-memory Cache (Redis/Memcached)
- ์ต๊ทผ/์์ฃผ ์กฐํ๋ ์ ์ ๋ค์์ ์ด๊ณ ์ ์๋ต.
- ์บ์ ๋ฏธ์ค ์๋ง DB ์ ๊ทผ.
4. ๋ถ์ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค
- Apache Cassandra, DynamoDB, Spanner ๋ฑ.
- ๋ฐ์ดํฐ ์ค๋ฉ, ์ผ๊ด์ฑ, ์ํ ํ์ฅ์ผ๋ก ์์ญ์ต ๊ฑด๋ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌ.
5. ์ต์ข ์๋ต
- ๊ฒฐ๊ณผ๋ฅผ ๋ก๋ ๋ฐธ๋ฐ์๋ฅผ ํตํด ์ฌ์ฉ์์๊ฒ ๋ฐํ.
4. ๊ฐ ์๋ฃ๊ตฌ์กฐ ๋น๊ต ์์ฝ
์๋ฃ๊ตฌ์กฐ | ์ฅ์ | ๋จ์ /ํธ๋ ์ด๋์คํ | ์ฃผ์ ์ฉ๋ |
---|---|---|---|
Redis Hashmap | ์ด๊ณ ์, ์ ํํ ์ผ์น | ๋ฉ๋ชจ๋ฆฌ ํ๊ณ, ์ ์ฒด ์ ์ฅ ๋ถ๊ฐ | ์ต๊ทผ/์์ฃผ ์กฐํ ์บ์ |
Trie | ์ ๋์ฌ ๊ฒ์, ์๋์์ฑ | ๋ฉ๋ชจ๋ฆฌ ์๋ชจ, ์์ถ ํ์ | ์ถ์ฒ, ์๋์์ฑ |
B+ Tree | ์ ๋ ฌ/๋ฒ์ ์ฟผ๋ฆฌ, ํ์ฅ์ฑ | ๋ถ์ฐ ๊ด๋ฆฌ ๋ณต์ก, ๋จ์ผ ๋จธ์ ํ๊ณ | DB ์ธ๋ฑ์ค, ์ํ๋ฒณ์ ์ถ์ฒ |
Bloom Filter | ๋ฉ๋ชจ๋ฆฌ ํจ์จ, ๋น ๋ฅธ ๋ถ์ ํ์ธ | ์คํ ๊ฐ๋ฅ, ์ค์ ๋ฐ์ดํฐ ์ ์ฅ X | 1์ฐจ ํํฐ, DB ์ ๊ทผ ์ต์ํ |
5. ๊ฒฐ๋ก
- ๋๊ท๋ชจ ์๋น์ค๋ ์ฌ๋ฌ ์๋ฃ๊ตฌ์กฐ์ ๋ถ์ฐ ์์คํ ์ ๊ณ์ธต์ ์ผ๋ก ์กฐํฉํด โ์ ์ ๋ค์ ์ค๋ณต ์ฒดํฌโ๋ฅผ ์ ms ๋ด์ ์ฒ๋ฆฌ.
- Bloom Filter โ In-memory Cache โ ๋ถ์ฐ DB ์์ผ๋ก ํจ์จ์ ํํฐ๋ง.
- ์ด ๋ชจ๋ ์์คํ ์ด โ์ด๋ฏธ ์ฌ์ฉ ์ค์ธ ์ ์ ๋ค์โ ๋ฉ์์ง ๋ค์ ์จ์ด ์์.