25/04/2026 02:48น.

EP.75 การใช้ Redis สำหรับการจัดการสถานะผู้ใช้ (User State Management) ใน WebSocket
#Redis
#WebSocket
#การจัดการสถานะผู้ใช้
#Go
#User State
#Real-time Application
#Distributed System
ในตอนนี้ เราจะมาเรียนรู้วิธีการใช้ Redis เพื่อจัดการ สถานะของผู้ใช้ (User State) ในระบบ WebSocket ซึ่งช่วยให้สามารถตรวจสอบว่าใครออนไลน์อยู่ เชื่อมต่อกี่คน และควบคุมการเปลี่ยนแปลงสถานะของผู้ใช้ได้อย่างมีประสิทธิภาพ โดยไม่ต้องพึ่งพาการเก็บข้อมูลไว้ในหน่วยความจำ (RAM) ของเซิร์ฟเวอร์เพียงอย่างเดียว
Redis เป็นเครื่องมือประเภท In-memory Data Store ที่ทำงานเร็วมาก จึงเหมาะอย่างยิ่งสำหรับงานแบบ real-time เช่น การจัดการการเชื่อมต่อใน WebSocket Chat หรือระบบแชทที่มีผู้ใช้จำนวนมาก
🔸 ทำไมต้องใช้ Redis สำหรับจัดการสถานะผู้ใช้ใน WebSocket?
1. เร็วและเบา:
Redis ทำงานแบบ in-memory ทำให้การเขียน/อ่านข้อมูลเร็วมาก เหมาะกับ WebSocket ที่ต้องการตอบสนองทันที
2. รองรับผู้ใช้จำนวนมาก:
เมื่อมีผู้ใช้งานจำนวนมาก Redis ช่วยลดภาระเซิร์ฟเวอร์หลัก และกระจายการจัดการข้อมูลสถานะได้อย่างมีประสิทธิภาพ
3. ข้อมูลสถานะชัดเจน:
สามารถเก็บสถานะ เช่น การเชื่อมต่อ, การออนไลน์, หรือกิจกรรมต่าง ๆ ของผู้ใช้ ได้อย่างง่าย
4. รองรับการขยายระบบ (Scalability):
Redis รองรับ Distributed System สามารถขยายตามจำนวนผู้ใช้ได้อย่างยืดหยุ่น
🔸 โครงสร้างระบบจัดการสถานะผู้ใช้ด้วย Redis
ระบบประกอบด้วย 3 ส่วนหลัก:
- 1. เก็บสถานะผู้ใช้:
เมื่อผู้ใช้เชื่อมต่อเข้าระบบ จะบันทึกสถานะ (เช่น “online”) ไว้ใน Redis - 2. อัปเดตสถานะ:
เมื่อผู้ใช้ยกเลิกการเชื่อมต่อ ให้ลบหรือเปลี่ยนสถานะใน Redis - 3. ดึงข้อมูลสถานะ:
สามารถ query สถานะของผู้ใช้เพื่อดูว่าใครออนไลน์อยู่ได้แบบ real-time
🔸 การติดตั้ง Redis และการเชื่อมต่อกับ Go
✅ ติดตั้ง Redis Client สำหรับ Go
go get github.com/go-redis/redis/v8
🔸 ตัวอย่างโค้ด WebSocket Server ที่เชื่อมกับ Redis
package main
import (
"log"
"net/http"
"context"
"github.com/gorilla/websocket"
"github.com/go-redis/redis/v8"
)
var clients = make(map[*websocket.Conn]bool)
var redisClient *redis.Client
var ctx = context.Background()
type Message struct {
User string `json:"user"`
Message string `json:"message"`
}
var upgrader = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool {
return true
},
}
func init() {
redisClient = redis.NewClient(&redis.Options{
Addr: "localhost:6379",
DB: 0,
})
}
func handleConnections(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println(err)
return
}
defer conn.Close()
clients[conn] = true
user := r.URL.Query().Get("user")
if user == "" {
user = "anonymous"
}
// บันทึกสถานะว่าออนไลน์
redisClient.Set(ctx, user, "online", 0)
for {
var msg Message
err := conn.ReadJSON(&msg)
if err != nil {
log.Println(err)
delete(clients, conn)
redisClient.Del(ctx, user) // ลบสถานะออกจาก Redis
break
}
broadcast(msg)
}
}
func broadcast(msg Message) {
for client := range clients {
err := client.WriteJSON(msg)
if err != nil {
log.Println(err)
client.Close()
delete(clients, client)
}
}
}
func main() {
http.HandleFunc("/", handleConnections)
log.Println("Server started on :8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
🔸 การทดสอบระบบจัดการสถานะผู้ใช้ด้วย Redis
✅ ทดสอบสถานะออนไลน์:
เมื่อผู้ใช้เชื่อมต่อ ตรวจสอบใน Redis ว่าข้อมูลถูกบันทึกว่า "online" หรือไม่
✅ ทดสอบสถานะออฟไลน์:
เมื่อผู้ใช้ยกเลิกการเชื่อมต่อ ตรวจสอบว่า Redis ลบสถานะออกแล้ว
✅ ทดสอบการดึงข้อมูล:
ใช้ redisClient.Get() เพื่อดึงสถานะของผู้ใช้แต่ละคน
💡 ท้าให้ลอง!
ลองเพิ่มฟีเจอร์ แดชบอร์ดผู้ดูแลระบบ ที่แสดงรายชื่อผู้ใช้ที่ออนไลน์อยู่แบบเรียลไทม์ หรือเชื่อม Redis เข้ากับระบบห้องแชทเพื่อแสดงสถานะของผู้ใช้แต่ละคนได้อย่างแม่นยำ
🔜 EP ถัดไป:
EP.76 - การใช้ WebSocket ในการส่งข้อมูลขนาดใหญ่ (Handling Large Data Transfers)
เตรียมพบกับเทคนิคการจัดการการส่งข้อมูลขนาดใหญ่ผ่าน WebSocket อย่างมีประสิทธิภาพ ไม่ให้กระทบต่อการเชื่อมต่อหรือทำให้ระบบล่ม!
อ่านบทความ Series อื่นๆ
🔵 Facebook: Superdev School (Superdev)
📸 Instagram: superdevschool
🎬 TikTok: superdevschool
🌐 Website: www.superdev.school