Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Penyelidikan mengenai mekanisme kunci cache fungsi serentak golang

Penyelidikan mengenai mekanisme kunci cache fungsi serentak golang

WBOY
WBOYasal
2024-04-30 18:18:02755semak imbas

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)
}

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)
}

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)
    }
}

Hasil berjalan

0
1
1
2
3
5
8
13
21
34

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!

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