TTL 및 디스크 지속성을 갖춘 Go 고성능 캐시

WBOY
풀어 주다: 2024-08-14 10:39:10
원래의
667명이 탐색했습니다.

Go High-Performance Cache with TTL and Disk Persistence

1.소개

새 프로젝트를 시작할 때마다 데이터베이스를 설정하는 번거로움 없이 Golang 프로젝트를 가속화하세요. 처음부터 데이터베이스를 구성하는 데 지치셨나요? 새로운 문제에 직면하게 될까요? 더 이상 보지 마세요. 이 블로그에서는 TTL, 디스크 지속성해시 데이터 유형

을 지원하는 Golang 캐싱 라이브러리를 살펴볼 것입니다.

GoSwift.

2.선행조건

  • Golang의 기본지식
  • 일반적인 캐시 작동 방식에 대한 지식

3.특징

  1. 명령 설정 및 가져오기
  2. 업데이트 명령
  3. Del 명령
  4. 존재 명령
  5. TTL 지원
  6. 디스크 저장(스냅샷) 지원
  7. 해시 데이터 유형 지원(Hset, Hget, HgetAll, HMset)
  8. 안전한 잠금

설정 및 가져오기 명령

import (
    "fmt"
    "github.com/leoantony72/goswift"
)

func main(){
    cache := goswift.NewCache()

    // Value 0 indicates no expiry
    cache.Set("key", "value", 0)

    val, err := cache.Get("key")
    if err !=nil{
        fmt.Println(err)
        return
    }
    fmt.Println("key", val)
}
로그인 후 복사

업데이트 명령

// Update value
// @Update(key string, val interface{}) error
err = cache.Update("key","value2")
if err != nil{
    fmt.Println(err)
    return
}
로그인 후 복사

Del 명령 && Exists 명령

// Delete command
// @Del(key string)
cache.Del("key")

// Exist command
// @Exists(key string) bool
value = cache.Exists("key")
fmt.Println(value) // returns false
로그인 후 복사

TTL 지원

// Set Value with Expiry
// @Set(key string, val interface{}, exp int)
// Here expiry is set to 1sec
cache.Set("key","value",1000)

// Hset command
// @Hset(key, field string, value interface{}, exp int)
// in this case the "key" expires in 1sec
cache.Hset("key","name","value",1000)
cache.Hset("key","age",18,1000)
로그인 후 복사

해시 데이터 유형 지원(Hset, Hget, HgetAll, HMset)

// Hset command
// @Hset(key, field string, value interface{}, exp int)
// in this case the "key" expires in 1sec
cache.Hset("key","name","value",1000)
cache.Hset("key","age",18,1000)


// HMset command
// @HMset(key string, d interface{}, exp int) error
// Set a Hash by passing a Struct/Map
// ---by passing a struct---
type Person struct{
    Name  string
    Age   int
    Place string
}

person1 := &Person{Name:"bob",Age:18,Place:"NYC"}
err = cache.HMset("key",person1)
if err != nil{
    fmt.Println(err)
    return
}

// ---by passing a map---
person2 := map[string]interface{Name:"john",Age:18,Place:"NYC"}
err = cache.HMset("key",person2)
if err != nil{
    fmt.Println(err)
    return
}


// Hget command
// @HGet(key, field string) (interface{}, error)
// get individual fields in Hash
data,err := cache.HGet("key","field")
if err != nil{
    fmt.Println(err)
    return
}
fmt.Println(data)

// HgetAll command
// @HGetAll(key string) (map[string]interface{}, error)
// gets all the fields with value in a hash key
// retuns a map[string]interface{}
data,err = cache.HGetAll("key")
if err != nil{
    fmt.Println(err)
    return
}

로그인 후 복사

스냅샷

opt := goswift.CacheOptions{
        EnableSnapshots:  true,
        SnapshotInterval: time.Second*5,
    }
c := goswift.NewCache(opt)
로그인 후 복사

5초마다 데이터의 스냅샷을 찍어 Snapshot.data 파일에 저장합니다. 기본적으로 스냅샷은 비활성화되어 있으며 SnapshotInterval이 제공되지 않은 경우 기본값은 5초입니다.

참고: EnableSnapshot이 false인 경우 파일에 저장된 데이터를 가져오지 않습니다

오류 처리

const (
    ErrKeyNotFound   = "key does not Exists"
    ErrFieldNotFound = "field does not Exists"
    ErrNotHashvalue  = "not a Hash value/table"
    ErrHmsetDataType = "invalid data type, Expected Struct/Map"
)
로그인 후 복사

다음은 코드를 작성하는 동안 발생할 수 있는 일반적인 오류입니다. 이러한 변수는 오류를 확인하기 위한 명확하고 쉬운 오류 비교 방법을 제공합니다.

data,err := cache.Get("key")
if err != nil {
    if err.Error() == goswift.ErrKeyNotFound {
        //do something
}
}    
로그인 후 복사

캐시 만료의 내부 작동

3초마다 **sweaper **함수가 호출되어 해시 테이블에서 만료된 값을 지웁니다. 우리는 해시 맵을 가리키는 최소 힙을 유지합니다. 최상위 요소는 TTL이 가장 작은 키가 됩니다. TTL이 현재 시간보다 클 때까지 트리를 순회합니다.

요약

이 기능을 프로덕션에서는 사용하지 말라고 조언하고 싶지만, 소규모 프로젝트에서는 자유롭게 사용해 보세요. 시도해 보시고 버그가 발견되면 GitHub 저장소에 문제를 제기해 주세요.

이메일: leoantony102@gmail.com
Github: https://github.com/leoantony72
저장소: https://github.com/leoantony72/goswift

위 내용은 TTL 및 디스크 지속성을 갖춘 Go 고성능 캐시의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!