Skip to content

缓存

go-cache 是一个轻量级的内存缓存库,使用简单且高效,非常适合在 Go 项目中实现本地缓存。它支持自动过期、缓存清理等功能,适合临时数据存储场景。


安装

使用 go get 安装:

bash
go get -u github.com/patrickmn/go-cache

基本用法

以下是 go-cache 的基本操作示例:

初始化缓存

go
package main

import (
	"fmt"
	"time"

	"github.com/patrickmn/go-cache"
)

func main() {
	// 创建一个缓存对象,默认超时时间为 5 分钟,每 10 分钟清理一次过期数据
	c := cache.New(5*time.Minute, 10*time.Minute)

	// 设置一个值,带默认超时时间
	c.Set("foo", "bar", cache.DefaultExpiration)

	// 设置一个值,带自定义超时时间
	c.Set("baz", 42, 1*time.Minute)

	// 获取值
	val, found := c.Get("foo")
	if found {
		fmt.Println("Found:", val)
	} else {
		fmt.Println("Key not found")
	}

	// 删除值
	c.Delete("baz")

	// 检查值是否存在
	_, found = c.Get("baz")
	if !found {
		fmt.Println("Key 'baz' has been deleted or expired")
	}
}

主要功能

1. 添加数据

go
c.Set("key", "value", cache.DefaultExpiration)
c.Set("key", "value", 10*time.Second) // 自定义过期时间

2. 获取数据

go
value, found := c.Get("key")
if found {
    fmt.Println("Value:", value)
} else {
    fmt.Println("Key not found")
}

3. 删除数据

go
c.Delete("key")

4. 延长数据有效期

go
c.Set("key", "value", 10*time.Second)
c.Increment("key", 1)

5. 清空缓存

go
c.Flush()

高级功能

自动过期

go-cache 支持为每个键设置独立的过期时间。如果键超过有效期,会自动从缓存中清理。

批量操作

可以批量存储和获取数据:

go
items := c.Items()
for k, v := range items {
    fmt.Printf("Key: %s, Value: %v\n", k, v.Object)
}

存储复杂对象

go-cache 支持存储任意类型的数据,例如结构体:

go
type User struct {
	Name  string
	Email string
}

user := User{Name: "Alice", Email: "alice@example.com"}
c.Set("user", user, cache.DefaultExpiration)

if val, found := c.Get("user"); found {
	u := val.(User)
	fmt.Println("User:", u.Name, u.Email)
}

用例场景

  1. 短时缓存 用于存储计算结果,减少重复计算。

  2. 配置缓存 将一些配置信息加载到缓存中,减少数据库读取。

  3. 令牌验证 缓存用户会话令牌,快速验证请求。

  4. API 缓存 存储外部 API 调用结果,减少请求次数。


注意事项

  1. 单机限制go-cache 是单机的内存缓存,适合单实例项目。如果需要分布式缓存,推荐使用 Redis 或 Memcached。

  2. 内存占用 数据存储在内存中,需控制缓存大小,以免内存溢出。

  3. 并发安全go-cache 是线程安全的,可以在多线程环境中使用。


如果需要更多高级功能或结合项目的具体场景,请随时告诉我! 😊