>  기사  >  백엔드 개발  >  golang 동시 기능 캐시 잠금 메커니즘 연구

golang 동시 기능 캐시 잠금 메커니즘 연구

WBOY
WBOY원래의
2024-04-30 18:18:02803검색

동시성이 높은 시나리오에서 함수 캐시를 사용하면 반복 계산을 피할 수 있으며 잠금 메커니즘을 도입하면 캐시된 데이터의 동시성 안전성을 보장할 수 있습니다. 캐싱은 sync.Map을 통해 Go 언어로 구현할 수 있으며, 동시성 안전성을 달성하기 위해 각 캐시 항목에 뮤텍스 잠금이 도입됩니다. 실제 사례에서는 피보나치 수열의 계산 결과를 효율적으로 캐시하기 위해 캐시 및 잠금 메커니즘이 사용됩니다.

golang 동시 기능 캐시 잠금 메커니즘 연구

Go 언어에서 동시 함수의 캐시 잠금 메커니즘 탐색

머리말
동시성이 높은 시나리오에서는 함수의 반복 계산을 피하기 위해 캐시 메커니즘을 사용할 수 있습니다. 캐시된 데이터의 동시성 보안을 보장하려면 잠금 메커니즘을 도입해야 합니다. 이 기사에서는 Go 언어의 함수 캐시 잠금 구현에 대해 논의하고 실제 사례를 통해 이를 보여줍니다.

캐시 구현
함수 캐싱을 구현하는 가장 간단한 방법은 효율적이고 스레드로부터 안전한 키-값 매핑 기능을 제공하는 sync.Map 유형을 사용하는 것입니다.

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

잠금 메커니즘
캐시된 데이터의 동시성 안전성을 보장하기 위해 각 캐시 항목에 대해 뮤텍스 잠금을 도입할 수 있습니다.

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

실용 사례
다음은 피보나치 수열의 계산 결과를 캐시하는 방법을 보여주는 캐시 및 잠금 메커니즘을 사용하는 간단한 예입니다.

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

Running results

0
1
1
2
3
5
8
13
21
34

이 예에서 동시 고루틴은 피보나치 수열을 동시에 계산하고, 계산 결과를 올바르게 캐시하여 반복 계산을 방지합니다.

위 내용은 golang 동시 기능 캐시 잠금 메커니즘 연구의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.