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

Jennifer Aniston
发布: 2024-08-14 10:39:10
原创
575 人浏览过

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中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!