๐Ÿ—„๏ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๐ŸŒฟ ์ค‘๊ธ‰

Redis ์บ์‹ฑ ์ „๋žต

Redis๋กœ ์„ฑ๋Šฅ ์ตœ์ ํ™”ํ•˜๊ธฐ

โฑ๏ธ 6์‹œ๊ฐ„ ๐Ÿ‘๏ธ 22 ์กฐํšŒ
๐Ÿ“– ๊ฐ•์ขŒ ๋‚ด์šฉ
# Redis ์บ์‹ฑ ์ „๋žต ๊ฐ€์ด๋“œ

## ํ•™์Šต ๋ชฉํ‘œ
Redis๋ฅผ ํ™œ์šฉํ•œ ์บ์‹ฑ๊ณผ ์„ธ์…˜ ๊ด€๋ฆฌ๋ฅผ ๋ฐฐ์›๋‹ˆ๋‹ค.

## 1. Redis๋ž€?
์ธ๋ฉ”๋ชจ๋ฆฌ ํ‚ค-๊ฐ’ ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค.
- ์ดˆ๊ณ ์† ์ฝ๊ธฐ/์“ฐ๊ธฐ
- ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์ง€์›
- ์บ์‹ฑ, ์„ธ์…˜, ํ ๋“ฑ ํ™œ์šฉ
- ํด๋Ÿฌ์Šคํ„ฐ๋ง ์ง€์›

## 2. ์„ค์น˜ ๋ฐ ์‹คํ–‰

```bash
# Docker๋กœ ์‹คํ–‰
docker run -d -p 6379:6379 --name redis redis

# ์ ‘์†
docker exec -it redis redis-cli

# ๋˜๋Š” ๋กœ์ปฌ ์„ค์น˜ (Ubuntu)
sudo apt install redis-server
sudo systemctl start redis
redis-cli
```

## 3. ๊ธฐ๋ณธ ๋ช…๋ น์–ด - String

```bash
# ์ €์žฅ/์กฐํšŒ
SET name "Kim"
GET name

# ๋งŒ๋ฃŒ์‹œ๊ฐ„ ์„ค์ • (์ดˆ)
SET session "abc123" EX 3600
SETEX session 3600 "abc123"

# ๋งŒ๋ฃŒ์‹œ๊ฐ„ ํ™•์ธ
TTL session

# ์ˆซ์ž ์ฆ๊ฐ€/๊ฐ์†Œ
SET counter 0
INCR counter # 1
INCRBY counter 5 # 6
DECR counter # 5

# ์—ฌ๋Ÿฌ ํ‚ค ๋™์‹œ ์ฒ˜๋ฆฌ
MSET a 1 b 2 c 3
MGET a b c
```

## 4. List (๋ฆฌ์ŠคํŠธ)

```bash
# ์ถ”๊ฐ€
LPUSH queue "task1" # ์™ผ์ชฝ์— ์ถ”๊ฐ€
RPUSH queue "task2" # ์˜ค๋ฅธ์ชฝ์— ์ถ”๊ฐ€

# ์กฐํšŒ
LRANGE queue 0 -1 # ์ „์ฒด ์กฐํšŒ
LLEN queue # ๊ธธ์ด

# ๊บผ๋‚ด๊ธฐ (์ œ๊ฑฐํ•˜๋ฉฐ ์กฐํšŒ)
LPOP queue # ์™ผ์ชฝ์—์„œ ๊บผ๋‚ด๊ธฐ
RPOP queue # ์˜ค๋ฅธ์ชฝ์—์„œ ๊บผ๋‚ด๊ธฐ

# ๋ธ”๋กœํ‚น ํŒ (ํ๋กœ ํ™œ์šฉ)
BLPOP queue 30 # 30์ดˆ ๋Œ€๊ธฐ
```

## 5. Set (์ง‘ํ•ฉ)

```bash
# ์ถ”๊ฐ€
SADD tags "javascript" "python" "go"

# ์กฐํšŒ
SMEMBERS tags # ์ „์ฒด ์กฐํšŒ
SISMEMBER tags "go" # ํฌํ•จ ์—ฌ๋ถ€

# ์ง‘ํ•ฉ ์—ฐ์‚ฐ
SADD tags2 "python" "rust"
SINTER tags tags2 # ๊ต์ง‘ํ•ฉ
SUNION tags tags2 # ํ•ฉ์ง‘ํ•ฉ
SDIFF tags tags2 # ์ฐจ์ง‘ํ•ฉ

# ๋žœ๋ค ์ถ”์ถœ
SRANDMEMBER tags 2 # 2๊ฐœ ๋žœ๋ค
SPOP tags # 1๊ฐœ ๊บผ๋‚ด๊ธฐ
```

## 6. Hash (ํ•ด์‹œ)

```bash
# ์ €์žฅ
HSET user:1 name "Kim" age 25 email "kim@test.com"

# ์กฐํšŒ
HGET user:1 name # ๋‹จ์ผ ํ•„๋“œ
HGETALL user:1 # ์ „์ฒด
HMGET user:1 name age # ์—ฌ๋Ÿฌ ํ•„๋“œ

# ์ˆ˜์ •
HINCRBY user:1 age 1 # ๋‚˜์ด +1

# ์‚ญ์ œ
HDEL user:1 email
```

## 7. Sorted Set (์ •๋ ฌ ์ง‘ํ•ฉ)

```bash
# ์ ์ˆ˜์™€ ํ•จ๊ป˜ ์ถ”๊ฐ€
ZADD leaderboard 100 "player1" 85 "player2" 92 "player3"

# ์ˆœ์œ„ ์กฐํšŒ
ZRANK leaderboard "player1" # ์ˆœ์œ„ (0๋ถ€ํ„ฐ)
ZREVRANK leaderboard "player1" # ์—ญ์ˆœ์œ„

# ๋ฒ”์œ„ ์กฐํšŒ
ZRANGE leaderboard 0 2 # ์ƒ์œ„ 3๋ช…
ZREVRANGE leaderboard 0 2 WITHSCORES

# ์ ์ˆ˜ ๋ฒ”์œ„
ZRANGEBYSCORE leaderboard 80 100

# ์ ์ˆ˜ ์ฆ๊ฐ€
ZINCRBY leaderboard 10 "player2"
```

## 8. ์บ์‹ฑ ํŒจํ„ด

```python
import redis
import json

r = redis.Redis(host="localhost", port=6379, decode_responses=True)

# Cache-Aside ํŒจํ„ด
def get_user(user_id):
# 1. ์บ์‹œ ํ™•์ธ
cached = r.get(f"user:{user_id}")
if cached:
return json.loads(cached)

# 2. DB ์กฐํšŒ
user = db.query(f"SELECT * FROM users WHERE id = {user_id}")

# 3. ์บ์‹œ ์ €์žฅ (1์‹œ๊ฐ„)
r.setex(f"user:{user_id}", 3600, json.dumps(user))

return user

# ์บ์‹œ ๋ฌดํšจํ™”
def update_user(user_id, data):
db.update(user_id, data)
r.delete(f"user:{user_id}")
```

## 9. ์„ธ์…˜ ๊ด€๋ฆฌ

```python
import uuid

def create_session(user_id):
session_id = str(uuid.uuid4())
r.hset(f"session:{session_id}", mapping={
"user_id": user_id,
"created_at": datetime.now().isoformat()
})
r.expire(f"session:{session_id}", 86400) # 24์‹œ๊ฐ„
return session_id

def get_session(session_id):
return r.hgetall(f"session:{session_id}")

def delete_session(session_id):
r.delete(f"session:{session_id}")
```

## 10. Pub/Sub (์‹ค์‹œ๊ฐ„ ๋ฉ”์‹œ์ง•)

```bash
# ํ„ฐ๋ฏธ๋„ 1 - ๊ตฌ๋…
SUBSCRIBE chat

# ํ„ฐ๋ฏธ๋„ 2 - ๋ฐœํ–‰
PUBLISH chat "Hello everyone!"
```

```python
# Python ๊ตฌ๋…
pubsub = r.pubsub()
pubsub.subscribe("chat")

for message in pubsub.listen():
if message["type"] == "message":
print(message["data"])
```

## 11. Laravel์—์„œ Redis ์‚ฌ์šฉ

```php
// .env
CACHE_DRIVER=redis
SESSION_DRIVER=redis

// ์บ์‹œ ์‚ฌ์šฉ
Cache::put("key", "value", 3600);
$value = Cache::get("key");
Cache::forget("key");

// Remember ํŒจํ„ด
$users = Cache::remember("users", 3600, function () {
return User::all();
});
```

## 12. ๋ชจ๋‹ˆํ„ฐ๋ง

```bash
# ์‹ค์‹œ๊ฐ„ ๋ช…๋ น์–ด ํ™•์ธ
MONITOR

# ์ •๋ณด ํ™•์ธ
INFO
INFO memory
INFO clients

# ํ‚ค ๊ฒ€์ƒ‰
KEYS user:* # ํŒจํ„ด ๋งค์นญ (์ฃผ์˜: ๋А๋ฆผ)
SCAN 0 MATCH user:* COUNT 100 # ๊ถŒ์žฅ

# ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰
MEMORY USAGE key
```

## ์ถ”์ฒœ ํ•™์Šต ์ˆœ์„œ
1. ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ํƒ€์ž… ์ตํžˆ๊ธฐ
2. ์บ์‹ฑ ํŒจํ„ด ๊ตฌํ˜„
3. ์„ธ์…˜ ๊ด€๋ฆฌ ์ ์šฉ
4. Pub/Sub ์‹ค์‹œ๊ฐ„ ๊ธฐ๋Šฅ
5. ํด๋Ÿฌ์Šคํ„ฐ๋ง ํ•™์Šต