>백엔드 개발 >Golang >golang 함수 캐시와 타사 저장소 결합 실습

golang 함수 캐시와 타사 저장소 결합 실습

PHPz
PHPz원래의
2024-05-05 09:36:021113검색

함수 캐싱은 반복 계산을 방지하고 성능을 향상시키기 위해 사용되는 최적화 기술입니다. 캐시 크기가 메모리 제한을 초과하는 경우 Redis를 사용하는 등 타사 스토리지를 결합하여 캐시 용량을 확장할 수 있습니다. 실제로 Redis에서는 많은 수의 쿼리 결과를 캐시할 수 있으므로 성능이 크게 향상됩니다.

golang 함수 캐시와 타사 저장소 결합 실습

Golang 함수 캐시와 타사 저장소 결합 연습

함수 캐시는 반복 계산을 방지하고 애플리케이션 성능을 향상시키는 데 사용되는 최적화 기술입니다. Golang에서 sync/syncmap 패키지는 간단한 함수 캐시 구현을 제공합니다. 그러나 캐시 집약적인 애플리케이션의 경우 타사 스토리지를 활용하여 캐시 용량을 확장해야 할 수도 있습니다.

간단한 캐싱을 위해 sync/syncmap을 사용하세요

import (
    "sync"
)

var cache = sync.Map{}

func Get(key string) (interface{}, bool) {
    return cache.Load(key)
}

func Set(key string, value interface{}) {
    cache.Store(key, value)
}

타사 저장소로 확장

캐시 크기가 메모리 제한을 초과하는 경우 타사 저장소를 결합하여 캐시 용량을 확장할 수 있습니다. Redis를 스토리지 백엔드로 사용하는 예는 다음과 같습니다.

import (
    "context"
    "sync"
    "time"

    "github.com/go-redis/redis/v8"
)

// 将 sync/syncmap 作为一级缓存
var cache = sync.Map{}

// 使用 Redis 作为二级缓存
var redisClient = redis.NewClient(&redis.Options{
    Addr:     "localhost:6379",
    Password: "",
    DB:       0,
})

// 设置缓存超时时间(秒)
var cacheTimeout = 600

// 从一级缓存获取数据,如果没有则从 Redis 获取并设置到一级缓存中
func Get(key string) (interface{}, bool) {
    if val, ok := cache.Load(key); ok {
        return val, true
    }

    val, err := redisClient.Get(context.Background(), key).Result()
    if err != nil {
        return nil, false
    }

    cache.Store(key, val)
    return val, true
}

// 设置缓存数据,同时存储到 Redis 中
func Set(key string, value interface{}) {
    cache.Store(key, value)
    expireCtx := context.Background()
    if err := redisClient.Set(expireCtx, key, value, cacheTimeout*time.Second).Err(); err != nil {
        // 处理可能的错误
    }
}

실용적인 예: 다수의 쿼리 결과 캐싱

동일한 데이터베이스 쿼리를 다수 수행해야 하는 애플리케이션이 있다고 가정해 보겠습니다. 성능을 최적화하기 위해 함수 캐싱을 활용하여 반복 쿼리를 방지할 수 있습니다. 그러나 쿼리 결과 집합이 크기 때문에 모든 결과를 메모리에 저장하면 사용 가능한 메모리를 초과하게 됩니다.

타사 스토리지와 결합된 기능 캐시를 사용하면 자주 쿼리하는 결과를 Redis에 저장할 수 있습니다. 이렇게 하면 메모리 제한이 초과되더라도 애플리케이션이 이러한 결과에 빠르게 액세스할 수 있어 성능이 크게 향상됩니다.

위 내용은 golang 함수 캐시와 타사 저장소 결합 실습의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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