Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Menggunakan Redis untuk melaksanakan kunci teragih dalam Beego

Menggunakan Redis untuk melaksanakan kunci teragih dalam Beego

WBOY
WBOYasal
2023-06-22 15:57:11988semak imbas

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:

  1. Pelanggan cuba mendapatkan kunci, meminta Redis untuk memasukkan Kunci dan menetapkan nilai kepada token rentetan rawak yang unik.
  2. Jika hasil yang dikembalikan ialah 1, ini bermakna pemerolehan kunci berjaya, jika tidak pemerolehan kunci gagal.
  3. Sebelum kunci dilepaskan, pelanggan perlu memuat semula masa tamat tempoh Kunci dengan kerap. Ini kerana selepas pelanggan memperoleh kunci, ia mungkin tidak mempunyai peluang untuk melepaskan kunci secara aktif kerana ranap program atau sebab lain semasa pelaksanaan logik perniagaan.
  4. Selepas pemprosesan perniagaan selesai, pelanggan perlu melepaskan kunci secara aktif dan memanggil arahan Redis del untuk memadamkan Kunci.

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.

  1. Menggunakan Redis dalam 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
    }
}
  1. Pelaksanaan kunci teragih

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn