# 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. ํด๋ฌ์คํฐ๋ง ํ์ต