Cara menggunakan bahasa Go dan Redis untuk kawalan aliran
Pengenalan
Dalam aplikasi rangkaian konkurensi tinggi, kawalan aliran ialah pautan yang sangat penting. Untuk memastikan kestabilan dan kebolehpercayaan sistem, kami perlu mengehadkan dan mengurus trafik. Artikel ini akan memperkenalkan cara menggunakan bahasa Go dan Redis untuk melaksanakan kawalan aliran dan memberikan contoh kod khusus.
Latar Belakang
Dalam sistem teragih, kawalan aliran adalah salah satu cara penting untuk memastikan operasi normal sistem. Apabila sistem menghadapi permintaan serentak yang tinggi, trafik yang berlebihan boleh menyebabkan sistem ranap atau bertindak balas dengan perlahan. Oleh itu, kita perlu mengehadkan trafik untuk mengelakkan sistem daripada lebih muatan. Redis ialah pangkalan data dalam memori berprestasi tinggi yang menyediakan struktur data yang kaya dan arahan untuk memudahkan kawalan aliran.
Reka Bentuk Projek
Reka bentuk penyelesaian kami adalah seperti berikut:
Pelaksanaan khusus
Kami mengandaikan bahawa pengguna hanya boleh menghantar 100 permintaan dalam masa 60 saat. Kita boleh menggunakan struktur data kaunter Redis untuk mencapai sekatan ini. Berikut ialah contoh kod:
package main import ( "fmt" "strconv" "sync" "time" "github.com/go-redis/redis" ) var ( wg sync.WaitGroup rdb *redis.Client ) func main() { rdb = redis.NewClient(&redis.Options{ Addr: "localhost:6379", // Redis地址 Password: "", // Redis密码 DB: 0, // Redis数据库 }) for i := 0; i < 100; i++ { wg.Add(1) go sendRequest(i) } wg.Wait() } func sendRequest(userID int) { defer wg.Done() // 检查用户请求数是否超过限制 count, err := rdb.Incr(strconv.Itoa(userID)).Result() if err != nil { fmt.Println("Redis error:", err) return } if count > 100 { fmt.Println("Request limit exceeded for user", userID) return } // 获取当前时间戳 now := time.Now().Unix() // 将当前时间戳添加到有序集合中 _, err = rdb.ZAdd("timestamps", redis.Z{ Score: float64(now), Member: strconv.Itoa(userID), }).Result() if err != nil { fmt.Println("Redis error:", err) return } // 移除60秒前的时间戳 _, err = rdb.ZRemRangeByScore("timestamps", "0", strconv.FormatInt(now-60, 10)).Result() if err != nil { fmt.Println("Redis error:", err) return } fmt.Println("Request sent by user", userID) }
Penjelasan dan hubungi
sendRequest
yang menghantar permintaan, mula-mula gunakan perintah INCR
untuk menambah bilangan permintaan pengguna dan semak sama ada had telah melebihi. sendRequest
中,首先使用INCR
命令递增用户的请求数,并检查是否超过了限制。ZRemRangeByScore
Akhir sekali, gunakan perintah ZRemRangeByScore
untuk mengalih keluar cap masa yang telah tamat tempoh.
Kesimpulan
Artikel ini memperkenalkan cara menggunakan bahasa Go dan Redis untuk melaksanakan kawalan aliran. Dengan menggunakan kaunter Redis dan struktur data set tertib, kami boleh merekodkan bilangan permintaan dan cap masa pengguna dengan mudah, dan mengehadkan trafik. Penyelesaian ini boleh melindungi sistem dengan berkesan daripada trafik yang berlebihan dan memastikan kestabilan dan kebolehpercayaan sistem.Atas ialah kandungan terperinci Cara menggunakan bahasa Go dan Redis untuk kawalan aliran. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!