การดู : 231

25/04/2026 02:48น.

EP.75 การใช้ Redis สำหรับการจัดการสถานะผู้ใช้ (User State Management) ใน WebSocket

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