# Redis in GCP **在GCP 的memorystore 中有4種機器類別** ![image](https://hackmd.io/_uploads/rkkrp1KrJg.png) **GCP 的4種記憶體型資料庫比較** ![image](https://hackmd.io/_uploads/HJvA6yFSkl.png) ## 建立機器 * 建立redis instance (因為是簡單使用而已,Basic 就夠) **後面會建立computer engine,兩個的region 必須相同** **redis 的費用不低,使用完記得刪除!!!(跟Cloud SQL 一樣)** ![image](https://hackmd.io/_uploads/SJXi1xtH1e.png) **提升可靠度(需選擇Standard 版本)** **網路需與後面的computer engine 相同** ![image](https://hackmd.io/_uploads/BkpSIQYB1l.png) **建立之後須等約5分鐘才會變成可運作狀態** **在等待期間先進行下一步** * Cloud SQL **基本上與之前相同** ![image](https://hackmd.io/_uploads/SJoqdxFH1x.png) **要給privateIP,才能讓redis對其連線** ![image](https://hackmd.io/_uploads/Syk9FeFH1g.png) * 進資料庫放一些資料 ```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 位置一樣 **其他設定除了作業系統依自己使用習慣外皆預設即可** ![image](https://hackmd.io/_uploads/rJVpzeFB1l.png) * 使用GCP VM對其連線 (內網) **建起來的redis instance** ![image](https://hackmd.io/_uploads/rJzLNfFryx.png) * 進去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)