Penyelidikan mengenai mekanisme kunci cache fungsi serentak golang

WBOY
Lepaskan: 2024-04-30 18:18:02
asal
783 orang telah melayarinya

Dalam senario konkurensi tinggi, menggunakan cache fungsi boleh mengelakkan pengiraan berulang, dan memperkenalkan mekanisme kunci boleh memastikan keselamatan serentak data cache. Caching boleh dilaksanakan dalam bahasa Go melalui sync.Map, dan kunci mutex diperkenalkan untuk setiap item cache untuk mencapai keselamatan serentak. Dalam kes praktikal, mekanisme cache dan kunci digunakan untuk menyimpan secara cekap hasil pengiraan jujukan Fibonacci.

Penyelidikan mengenai mekanisme kunci cache fungsi serentak golang

Meneroka Mekanisme Kunci Cache bagi Fungsi Serentak dalam Bahasa Go

Kata Pengantar
Dalam senario serentak tinggi, untuk mengelakkan pengiraan berulang penggunaan fungsi mekanisme, anda boleh. Untuk memastikan keselamatan serentak data cache, mekanisme kunci perlu diperkenalkan. Artikel ini akan membincangkan pelaksanaan kunci cache fungsi dalam bahasa Go dan menunjukkannya melalui kes praktikal.

Pelaksanaan cache
Cara paling mudah untuk melaksanakan caching fungsi ialah menggunakan jenis sync.Map, yang menyediakan fungsi pemetaan nilai kunci yang cekap dan selamat benang.

import "sync"

type Cache struct {
    sync.Map
}

func (c *Cache) Get(key string) (interface{}, bool) {
    return c.Load(key)
}

func (c *Cache) Set(key string, value interface{}) {
    c.Store(key, value)
}
Salin selepas log masuk

Mekanisme kunci
Untuk memastikan keselamatan serentak data cache, kunci mutex boleh diperkenalkan untuk setiap item cache.

type CacheWithLock struct {
    sync.Map
    locks map[string]*sync.Mutex
}

func (c *CacheWithLock) Get(key string) (interface{}, bool) {
    c.locks[key].Lock()
    defer c.locks[key].Unlock()
    return c.Load(key)
}

func (c *CacheWithLock) Set(key string, value interface{}) {
    c.locks[key].Lock()
    defer c.locks[key].Unlock()
    c.Store(key, value)
}
Salin selepas log masuk

Kes praktikal
Berikut ialah contoh mudah menggunakan mekanisme cache dan kunci, yang menunjukkan cara untuk cache hasil pengiraan jujukan Fibonacci.

package main

import (
    "fmt"
    "sync"
)

var cache *CacheWithLock
var fibFuncs = map[int]func(n int) int{}

func init() {
    cache = &CacheWithLock{
        Map:   make(sync.Map),
        locks: make(map[string]*sync.Mutex),
    }
    fibFuncs[0] = func(n int) int { return 0 }
    fibFuncs[1] = func(n int) int { return 1 }
}

func fib(n int) int {
    f, ok := fibFuncs[n]
    if ok {
        return f(n)
    }
    fibFuncs[n] = func(n int) int {
        return fib(n-1) + fib(n-2)
    }
    return fib(n)
}

func main() {
    for i := 0; i < 10; i++ {
        go func(n int) {
            fmt.Println(cache.Get(n))
            cache.Set(n, fib(n))
        }(i)
    }
}
Salin selepas log masuk

Hasil berjalan

0
1
1
2
3
5
8
13
21
34
Salin selepas log masuk

Dalam contoh ini, goroutine serentak mengira jujukan Fibonacci secara serentak, dan menyimpan hasil pengiraan dengan betul untuk mengelakkan pengiraan berulang.

Atas ialah kandungan terperinci Penyelidikan mengenai mekanisme kunci cache fungsi serentak golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!