golang支持多驱动缓存组件插件库cachego的使用

Golang支持多驱动缓存组件插件库Cachego的使用

Cachego简介

Cachego是一个简单的缓存接口库,支持多种驱动实现。

安装

Cachego要求Go 1.21或更高版本。

go get github.com/faabiosr/cachego

使用示例

下面是一个使用Cachego的完整示例:

package main

import (
	"log"
	"time"

	"github.com/faabiosr/cachego/sync"
)

func main() {
	// 创建一个sync驱动的缓存实例
	cache := sync.New()

	// 保存数据到缓存,设置10秒过期时间
	if err := cache.Save("user_id", "1", 10*time.Second); err != nil {
		log.Fatal(err)
	}

	// 从缓存获取单个值
	id, err := cache.Fetch("user_id")
	if err != nil {
		log.Fatal(err)
	}

	log.Printf("user id: %s \n", id)

	// 批量获取多个缓存值
	keys := cache.FetchMulti([]string{"user_id", "user_name"})

	for k, v := range keys {
		log.Printf("%s: %s\n", k, v)
	}

	// 检查并删除缓存
	if cache.Contains("user_name") {
		cache.Delete("user_name")
	}

	// 尝试获取不存在的缓存
	if _, err := cache.Fetch("user_name"); err != nil {
		log.Printf("%v\n", err)
	}

	// 清空所有缓存
	if err := cache.Flush(); err != nil {
		log.Fatal(err)
	}
}

支持的驱动

Cachego支持以下多种驱动:

  • Bolt
  • Chain
  • File
  • Memcached
  • Mongo
  • Redis
  • Sqlite3
  • Sync

文档

完整文档请参考官方文档。

开发

要求

  • 安装docker
  • 安装docker-compose

Makefile命令

// 清理
$ make clean

// 运行测试并生成HTML覆盖率文件
$ make cover

// 启动docker容器进行测试
$ make docker

// 格式化所有go文件
$ make fmt

// 运行linter
$ make lint

// 运行测试
$ make test

许可证

该项目使用MIT许可证。


更多关于golang支持多驱动缓存组件插件库cachego的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang支持多驱动缓存组件插件库cachego的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang多驱动缓存组件插件库CacheGo使用指南

CacheGo是一个支持多驱动(Redis、Memcached、内存等)的Golang缓存组件库,提供了统一的接口来操作不同的缓存后端。

安装CacheGo

go get -u github.com/faabiosr/cachego

基本使用

1. 创建缓存实例

package main

import (
	"fmt"
	"time"
	
	"github.com/faabiosr/cachego"
	"github.com/faabiosr/cachego/file"
	"github.com/faabiosr/cachego/memcached"
	"github.com/faabiosr/cachego/memory"
	"github.com/faabiosr/cachego/redis"
)

func main() {
	// 内存缓存
	memCache := memory.New()
	
	// Redis缓存
	redisCache := redis.New("localhost:6379", "", 0)
	
	// Memcached缓存
	memcachedCache := memcached.New("localhost:11211")
	
	// 文件缓存
	fileCache := file.New("/tmp/cache")
	
	// 使用统一的接口操作
	useCache(memCache)
	useCache(redisCache)
	useCache(memcachedCache)
	useCache(fileCache)
}

func useCache(cache cachego.Cache) {
	// 设置缓存
	cache.Save("key", "value", 10*time.Minute)
	
	// 获取缓存
	value := cache.Fetch("key")
	fmt.Println(value)
	
	// 删除缓存
	cache.Delete("key")
	
	// 检查是否存在
	exists := cache.Contains("key")
	fmt.Println("Exists:", exists)
}

2. 支持的驱动

CacheGo支持以下驱动:

  • 内存缓存memory.New()
  • Redis缓存redis.New(addr, password string, db int)
  • Memcached缓存memcached.New(addr string)
  • 文件缓存file.New(path string)

3. 高级功能

批量操作

// 批量保存
items := map[string]cachego.Item{
	"key1": {Value: "value1", TTL: 5 * time.Minute},
	"key2": {Value: "value2", TTL: 10 * time.Minute},
}
cache.SaveMulti(items)

// 批量获取
values := cache.FetchMulti("key1", "key2")
fmt.Println(values)

原子操作

// 原子递增
newValue, err := cache.Increment("counter", 1)
if err != nil {
	fmt.Println("Increment error:", err)
}

// 原子递减
newValue, err = cache.Decrement("counter", 1)
if err != nil {
	fmt.Println("Decrement error:", err)
}

清空缓存

err := cache.Flush()
if err != nil {
	fmt.Println("Flush error:", err)
}

4. 自定义驱动

CacheGo支持自定义驱动,只需实现cachego.Cache接口:

type MyCache struct{}

func (c *MyCache) Save(key string, value interface{}, ttl time.Duration) error {
	// 实现保存逻辑
	return nil
}

func (c *MyCache) Fetch(key string) string {
	// 实现获取逻辑
	return ""
}

// 实现其他必要方法...

func main() {
	customCache := &MyCache{}
	useCache(customCache)
}

最佳实践

  1. 选择合适的驱动

    • 单机应用:内存缓存
    • 分布式系统:Redis或Memcached
    • 需要持久化:文件缓存或Redis
  2. 合理设置TTL

    // 根据数据特性设置合适的过期时间
    cache.Save("user:123", userData, 24*time.Hour)  // 用户数据缓存24小时
    cache.Save("temp:data", tempData, 5*time.Minute) // 临时数据缓存5分钟
    
  3. 错误处理

    if err := cache.Save("key", "value", 10*time.Minute); err != nil {
        log.Printf("Failed to save cache: %v", err)
        // 降级处理或重试
    }
    
  4. 缓存穿透防护

    value := cache.Fetch("key")
    if value == "" {
        // 从数据库获取
        dbValue := getFromDB("key")
        if dbValue != "" {
            cache.Save("key", dbValue, 5*time.Minute)
        } else {
            // 防止缓存穿透,设置空值短时间缓存
            cache.Save("key", "NULL", 1*time.Minute)
        }
    }
    

CacheGo通过统一的接口简化了多缓存后端的操作,使得在不同环境切换缓存实现变得非常简单,是Golang项目中处理缓存需求的优秀选择。

回到顶部