Dengan perkembangan pesat Internet, aplikasi sistem teragih menjadi semakin meluas. Dalam sistem teragih, berbilang nod selalunya beroperasi pada sumber yang sama. Untuk mengelakkan masalah dengan operasi serentak, satu mekanisme perlu diguna pakai untuk menyelaraskan urutan operasi setiap nod. Ini adalah kunci yang diedarkan.
Redis ialah pangkalan data cache berprestasi tinggi sumber terbuka yang telah menjadi salah satu penyelesaian yang biasa digunakan dalam sistem teragih. Ia menyediakan pelaksanaan kunci teragih berdasarkan operasi atom. Artikel ini akan memperkenalkan cara menggunakan Redis untuk melaksanakan kunci teragih dalam rangka kerja Beego.
1. Cara melaksanakan kunci teragih
Terdapat banyak cara untuk melaksanakan kunci teragih, seperti kunci berasaskan pangkalan data, kunci berasaskan Zookeeper, kunci berasaskan Redis, dsb. Dalam artikel ini, kami terutamanya memperkenalkan pelaksanaan kunci berdasarkan Redis.
Arahan setnx (SET jika Tidak wujud) yang disediakan oleh Redis boleh menyedari bahawa kunci hanya boleh ditetapkan dengan jayanya jika ia tidak wujud, jika tidak, tetapan gagal. Mengambil kesempatan daripada ini, kami boleh melaksanakan kunci yang diedarkan berdasarkan Redis. Proses khusus adalah seperti berikut:
2. Gunakan Redis untuk melaksanakan kunci yang diedarkan dalam rangka kerja Beego
Beego ialah rangka kerja Web untuk pembangunan pesat aplikasi Go. Ia mudah, mudah dipelajari, cekap, fleksibel , dan boleh skala. Ia juga sangat mudah untuk menggunakan Redis untuk melaksanakan kunci teragih dalam rangka kerja Beego.
Mula-mula anda perlu menggunakan Redis dalam Beego Kita boleh menggunakan modul cache yang terbina dalam rangka kerja beego. Pakej beego/cache menyediakan enkapsulasi perkhidmatan cache pihak ketiga, termasuk beegocache, filecache, memorycache, redis, memcache, ssdb, leveldb dan penyesuai cache lain.
Mula-mula anda perlu mengkonfigurasi maklumat sambungan redis dan sifat cache dalam fail konfigurasi:
// 在conf/app.conf中加入如下配置信息 cache = redis adapter = redis conn = 127.0.0.1:6379 dbnum = 0
Kemudian apabila aplikasi bermula, kita perlu mencipta objek cache untuk menyambung ke redis, kod adalah seperti berikut:
import( "github.com/astaxie/beego/cache" _ "github.com/astaxie/beego/cache/redis" ) func main() { bm, err := cache.NewCache("redis", `{"conn":"127.0.0.1:6379","dbNum":"0"}`) if err != nil { fmt.Println("cache err:", err) return } }
Dengan Redis dan objek cache, kita boleh mula melaksanakan kunci teragih. Dalam contoh ini, kami akan melaksanakan antara muka kaunter yang mudah, yang perlu melaksanakan kunci teragih.
Pertama, tentukan struktur kunci redis:
type RedisLock struct { Key string Token string Timeout int64 }
Antaranya, Kunci ialah nama kunci; gagal; tamat masa ialah tamat masa kunci, dalam beberapa saat.
Kemudian, laksanakan kaedah perolehan dan pelepasan kunci:
func (l *RedisLock) Lock() error { ttl := strconv.FormatInt(l.Timeout, 10) for { ok, err := bm.Do("SET", l.Key, l.Token, "EX", ttl, "NX") if err != nil { return err } if ok == nil { time.Sleep(time.Millisecond * time.Duration(rand.Intn(100))) continue } return nil } } func (l *RedisLock) Unlock() error { _, err := bm.Do("DEL", l.Key) return err }
Proses pelaksanaan khusus adalah seperti yang diterangkan di atas: Gunakan pilihan NX bagi arahan yang ditetapkan untuk mengelakkan masalah persaingan kunci berjaya diperolehi, Kemudian Kunci dikunci dalam tempoh masa tertentu tidak wujud, dan pelanggan lain tidak boleh mendapatkan kunci itu, dengan itu memastikan ketekalan data.
Akhir sekali, laksanakan kunci teragih digabungkan dengan pembilang:
var counter int64 func Add() { l := RedisLock{ Key: "counter_lock", Token: "token", Timeout: 3, } err := l.Lock() if err != nil { fmt.Println("acquire lock fail, err:", err) return } defer l.Unlock() counter = counter + 1 fmt.Println("current counter number is", counter) }
Dapatkan objek kunci l dalam fungsi Tambah, dan panggil kaedah l.Lock() untuk mengunci; berjaya, Operasi data dan panggil kaedah l.Unlock() untuk melepaskan kunci.
3. Ringkasan
Melalui pengenalan artikel ini, kami telah mempelajari cara menggunakan Redis untuk melaksanakan kunci teragih dalam Beego. Setnx operasi atom yang disediakan oleh Redis sangat cekap untuk melaksanakan kunci teragih. Dalam rangka kerja Beego, pelaksanaan kunci yang diedarkan Redis menjadi mudah dan intuitif dengan menggunakan pakej cache untuk sambungan dan operasi Redis.
Akhir sekali, perlu diingat bahawa walaupun pelaksanaan kunci teragih dapat memastikan konsistensi data dengan berkesan, ia tidak dapat menyelesaikan semua masalah konkurensi dalam sistem teragih. Sebagai contoh, pelaksanaan kunci yang diedarkan perlu mempertimbangkan isu seperti tamat masa kunci dan anti-kebuntuan Selain itu, kunci nilai kunci yang disediakan oleh kunci yang diedarkan boleh menyebabkan kegagalan kunci akibat kegelisahan rangkaian, kerosakan, dll. Pembangun juga perlu. pertimbangkan senario perniagaan tertentu Buat penambahbaikan dan pengoptimuman tertentu.
Atas ialah kandungan terperinci Menggunakan Redis untuk melaksanakan kunci teragih dalam Beego. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!