ホームページ  >  記事  >  バックエンド開発  >  TTL とディスク永続性を備えた高性能キャッシュを実現する

TTL とディスク永続性を備えた高性能キャッシュを実現する

WBOY
WBOYオリジナル
2024-08-14 10:39:10681ブラウズ

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 とディスク永続性を備えた高性能キャッシュを実現するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。