首页  >  文章  >  后端开发  >  实现具有 TTL 和磁盘持久性的高性能缓存

实现具有 TTL 和磁盘持久性的高性能缓存

WBOY
WBOY原创
2024-08-14 10:39:10688浏览

Go High-Performance Cache with TTL and Disk Persistence

一、简介

加速您的 Golang 项目,无需每次开始新项目时设置数据库的麻烦。厌倦了从头开始配置数据库?只是为了面对新的问题吗?别再犹豫了 在这篇博客中,我们将研究 Golang 缓存库,它支持 TTL磁盘持久性哈希数据类型

GoSwift

2.前提条件

  • Golang基础知识
  • 了解典型缓存的工作原理

三、特点

  1. 设置和获取命令
  2. 更新命令
  3. 删除命令
  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 命令 && 存在命令

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

支持Hash数据类型(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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn