# Redis in GCP
**在GCP 的memorystore 中有4種機器類別**

**GCP 的4種記憶體型資料庫比較**

## 建立機器
* 建立redis instance (因為是簡單使用而已,Basic 就夠)
**後面會建立computer engine,兩個的region 必須相同**
**redis 的費用不低,使用完記得刪除!!!(跟Cloud SQL 一樣)**

**提升可靠度(需選擇Standard 版本)**
**網路需與後面的computer engine 相同**

**建立之後須等約5分鐘才會變成可運作狀態**
**在等待期間先進行下一步**
* Cloud SQL
**基本上與之前相同**

**要給privateIP,才能讓redis對其連線**

* 進資料庫放一些資料
```bash=
gcloud sql connect cloudsql-instance --user=root
```
```sql=
CREATE DATABASE app_db;
USE app_db;
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
email VARCHAR(50)
);
INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');
INSERT INTO users (name, email) VALUES
('Bob', 'bob@example.com'),
('Charlie', 'charlie@example.com'),
('David', 'david@example.com'),
('Eva', 'eva@example.com'),
('Frank', 'frank@example.com'),
('Grace', 'grace@example.com'),
('Hannah', 'hannah@example.com'),
('Isaac', 'isaac@example.com'),
('Jack', 'jack@example.com'),
('Kathy', 'kathy@example.com');
```
* 建立instance
* 只有地區的地方需要注意要跟redis 位置一樣
**其他設定除了作業系統依自己使用習慣外皆預設即可**

* 使用GCP VM對其連線 (內網)
**建起來的redis instance**

* 進去VM 及安裝
```
gcloud compute ssh proxy-vm --zone=asia-east1-a
sudo apt update
sudo apt install -y redis-tools
```
* 測試redis
```bash
$ redis-cli -h 10.127.10.211 -p 6379 ping
PONG # 回應PONG為正常啟用中
```
* app_session.py
```python=
import redis
import uuid
# Redis 配置 # 內網IP
redis_client = redis.Redis(host='10.127.10.211', port=6379, decode_responses=True)
# 建立 Session
def create_session(user_id):
session_id = str(uuid.uuid4())
redis_client.setex(f"session:{session_id}", 300, user_id) # 會話有效期為1小時
return session_id
# 驗證 Session
def get_user_from_session(session_id):
return redis_client.get(f"session:{session_id}")
# 測試
session_id = create_session('user_123')
print("✅ 建立 Session ID:", session_id)
user_id = get_user_from_session(session_id)
print("📊 使用者 ID:", user_id)
```
* app_cache.py
```python=
import redis
import mysql.connector
import time
# Redis 配置 # redisIP
redis_client = redis.Redis(host='10.127.10.211', port=6379, decode_responses=True)
# Cloud SQL 配置 # SQL IP
db_config = {
'host': '10.121.192.5',
'port': 3306,
'user': 'root',
'password': 'admin1234',
'database': 'app_db'
}
def get_user(user_id):
"""
根據用戶 ID 獲取用戶資訊,先檢查 Redis 快取,未命中時從 MySQL 中獲取並存回 Redis。
"""
cache_key = f"user:{user_id}"
# Step 1: 檢查 Redis 快取
cached_user = redis_client.get(cache_key)
if cached_user:
print("✅ 從 Redis 快取取得用戶資訊")
return cached_user
print("❌ Redis 快取未命中,查詢 MySQL 資料庫...")
# Step 2: 查詢 MySQL
try:
connection = mysql.connector.connect(**db_config)
cursor = connection.cursor(dictionary=True)
cursor.execute("SELECT id, name, email FROM users WHERE id = %s", (user_id,))
user = cursor.fetchone()
cursor.close()
connection.close()
if user:
user_data = f"{user['id']} - {user['name']} - {user['email']}"
redis_client.setex(cache_key, 300, user_data) # 快取 5 分鐘
print("✅ 已將用戶資料存入 Redis 快取")
return user_data
else:
print("❌ 查無此用戶")
return None
except mysql.connector.Error as err:
print(f"❌ MySQL 錯誤: {err}")
return None
# 測試
user_id = 1 # 測試用戶 ID
user_info = get_user(user_id)
print("📊 用戶資訊:", user_info)
```
**如果要從外部連線進內部,需要架設一台虛擬機當作Proxy server 做Port Forward**
可以參考: [Day 30 — Terraform/GCP實戰:使用 GCP Console 創建 GCP 資料庫服務Cloud MemoryStore — Redis](https://ithelp.ithome.com.tw/articles/10339791)