Go语言中,两个比较流行的缓存库

在 Go 中实现带有过期时间的缓存通常需要一个可以自动处理键值过期的缓存系统。虽然标准库中没有直接提供这种功能,但有几个流行的第三方库可以很好地满足这一需求。下面我会介绍两个比较流行的 Go 缓存库:go-cache 和 bigcache。

1. go-cache

go-cache 是一个内存中的键值对缓存库,支持可过期条目。它是一个线程安全的缓存库,可以设定每个缓存项的生存时间(TTL)。

安装 go-cache:

bash 复制代码
go get github.com/patrickmn/go-cache

使用示例:

Go 复制代码
package main

import (
    "fmt"
    "github.com/patrickmn/go-cache"
    "time"
)

func main() {
    // 创建一个缓存,设置默认过期时间为 5 分钟,每 10 分钟清理过期项目
    c := cache.New(5*time.Minute, 10*time.Minute)

    // 设置一个键值,过期时间为 1 分钟
    c.Set("key1", "value1", 1*time.Minute)

    // 从缓存中获取键值
    val, found := c.Get("key1")
    if found {
        fmt.Println("key1:", val)
    }

    // 等待超过 1 分钟后再次尝试获取
    time.Sleep(70 * time.Second)
    val, found = c.Get("key1")
    if found {
        fmt.Println("key1 still:", val)
    } else {
        fmt.Println("key1 has expired")
    }
}

在这个示例中,我们创建了一个 go-cache 实例,并添加了一个键值对,设置了 1 分钟的过期时间。通过 Set 和 Get 方法可以轻松地添加和检索缓存项。

2. bigcache

bigcache 是一个高效的键值缓存,专为单机环境优化。它不自带过期处理,但可以配置以在设置时启用。

安装 bigcache

bash 复制代码
go get github.com/allegro/bigcache

使用示例:

Go 复制代码
package main

import (
    "fmt"
    "github.com/allegro/bigcache"
    "time"
)

func main() {
    config := bigcache.DefaultConfig(10 * time.Minute)
    config.CleanWindow = 5 * time.Minute

    // 创建一个缓存
    cache, err := bigcache.NewBigCache(config)
    if err != nil {
        panic(err)
    }

    // 添加键值
    cache.Set("key1", []byte("value1"))

    // 获取键值
    entry, err := cache.Get("key1")
    if err != nil {
        fmt.Println("Error retrieving key1:", err)
    } else {
        fmt.Println("key1:", string(entry))
    }

    // 模拟时间推移
    time.Sleep(15 * time.Minute)
    _, err = cache.Get("key1")
    if err != nil {
        fmt.Println("key1 has expired")
    }
}

bigcache 更适合处理大量数据和高负载情况,但其配置和使用相对复杂一些。

这两个库都能在 Go 中实现带有过期时间的缓存,选择哪一个取决于你的具体需求和应用场景。如果你对这些库有任何疑问或者需要进一步的帮助,请随时联系我!

相关推荐
Java面试题总结6 分钟前
Python 开发技巧 · 高级装饰器 —— 从基础到工业级实战
开发语言·python
liulilittle1 小时前
Exhaustive drift-fix simulation V2 — KCC on shared-bottleneck wired path.
开发语言·网络·python·tcp/ip·计算机网络·信息与通信·通信
名字还没想好☜2 小时前
Go error 处理:errors.Is/As 与错误包装
开发语言·后端·golang·go·错误处理
红糖奶茶2 小时前
Python 中 while 循环计数异常的常见原因分析与正确搓搓
开发语言·python
Lucky_Turtle2 小时前
【论文写作】PDF图片不清晰,打印生成PDF空白大,PDF字体嵌入
开发语言·pdf·c#
csdndenglu2 小时前
Easy3D:一个轻量级、易用、高效的C++库,用于处理和渲染3D数据,无复杂要求时可替代VTK
开发语言·c++·图形渲染·3d渲染
byte轻骑兵2 小时前
【AVRCP】规范精讲[41]:AV/C指令帧解析,蓝牙遥控交互的底层语言
c语言·开发语言·人机交互·智能制造·avrcp
发光小北2 小时前
Bronze100系列plc Modbus及自由口通信案例
开发语言·php
snow@li2 小时前
Java:后端项目会有一个类似前端node_modules的目录吗 / jar包在本地仓库 ~/.m2/repository 中按版本共存
java·开发语言·前端
geovindu2 小时前
java: Builder Pattern
java·开发语言·后端·设计模式·建造者模式·生成器模式