golang支持多数据源驱动的高性能缓存框架插件库nscache的使用

Golang支持多数据源驱动的高性能缓存框架插件库nscache的使用

安装

go get -u github.com/no-src/nscache

快速开始

首先需要导入缓存驱动包,然后使用指定的连接字符串创建缓存组件实例并使用它。

当前支持以下缓存驱动:

驱动 导入驱动包 连接字符串示例
Memory github.com/no-src/nscache/memory memory:
Redis github.com/no-src/nscache/redis redis://127.0.0.1:6379
Redis Cluster github.com/no-src/nscache/redis_cluster redis-cluster://127.0.0.1:7001?addr=127.0.0.1:7002&addr=127.0.0.1:7003
BuntDB github.com/no-src/nscache/buntdb buntdb://:memory:buntdb://buntdb.db
Etcd github.com/no-src/nscache/etcd etcd://127.0.0.1:2379?dial_timeout=5s
BoltDB github.com/no-src/nscache/boltdb boltdb://boltdb.db
FreeCache github.com/no-src/nscache/freecache freecache://?cache_size=50mib
BigCache github.com/no-src/nscache/bigcache bigcache://?eviction=10m
FastCache github.com/no-src/nscache/fastcache fastcache://?max_bytes=50mib
Memcached github.com/no-src/nscache/memcached memcached://127.0.0.1:11211
Proxy github.com/no-src/nscache/proxy/client proxy://127.0.0.1:8080

以下是一个初始化内存缓存并写入、读取和删除数据的完整示例:

package main

import (
	"time"

	_ "github.com/no-src/nscache/memory" // 导入内存缓存驱动

	"github.com/no-src/log"
	"github.com/no-src/nscache"
)

func main() {
	// 初始化缓存驱动
	c, err := nscache.NewCache("memory:")
	if err != nil {
		log.Error(err, "init cache error")
		return
	}
	defer c.Close()

	// 写入数据
	k := "hello"
	c.Set(k, "world", time.Minute)

	// 读取数据
	var v string
	if err = c.Get(k, &v); err != nil {
		log.Error(err, "get cache error")
		return
	}
	log.Info("key=%s value=%s", k, v)

	// 删除数据
	if err = c.Remove(k); err != nil {
		log.Error(err, "remove cache error")
		return
	}
}

命令行工具

可以使用命令行工具操作nscache支持的所有缓存驱动。

安装命令行工具nscache-cli

go install github.com/no-src/nscache/cmd/nscache-cli@latest

运行cli工具并指定缓存驱动连接字符串来操作缓存:

nscache-cli memory:

代理

代理服务器

安装代理服务器nscache-server

go install github.com/no-src/nscache/cmd/nscache-server@latest

运行代理服务器并指定监听地址和缓存驱动连接字符串:

nscache-server -addr=:8080 -conn=memory:

代理客户端

可以使用代码操作缓存代理服务器,类似于快速开始部分的示例代码。或者使用nscache-cli连接到代理服务器并操作缓存:

nscache-cli proxy://127.0.0.1:8080

更多关于golang支持多数据源驱动的高性能缓存框架插件库nscache的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang支持多数据源驱动的高性能缓存框架插件库nscache的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


NSCache - Go语言多数据源驱动的高性能缓存框架

NSCache 是一个支持多数据源驱动的高性能 Go 缓存框架插件库,它提供了统一的缓存接口,支持多种后端存储(如内存、Redis、Memcached等),并具有高性能和易扩展的特点。

主要特性

  1. 统一缓存接口,支持多种后端存储
  2. 高性能设计,低延迟
  3. 支持缓存过期策略
  4. 支持批量操作
  5. 易于扩展新的存储驱动

安装

go get github.com/nscache/nscache

基本使用示例

1. 内存缓存示例

package main

import (
	"fmt"
	"time"
	
	"github.com/nscache/nscache"
	"github.com/nscache/nscache/drivers/memory"
)

func main() {
	// 创建内存缓存实例
	cache := memory.New()
	
	// 设置缓存项,10秒过期
	err := cache.Set("user:1", []byte("John Doe"), 10*time.Second)
	if err != nil {
		fmt.Println("Set error:", err)
		return
	}
	
	// 获取缓存项
	val, err := cache.Get("user:1")
	if err != nil {
		fmt.Println("Get error:", err)
		return
	}
	
	fmt.Println("User:", string(val))
	
	// 等待过期
	time.Sleep(11 * time.Second)
	
	// 再次获取,应该已过期
	val, err = cache.Get("user:1")
	if err != nil {
		fmt.Println("Get after expiration:", err)
	}
}

2. Redis 缓存示例

package main

import (
	"fmt"
	"time"
	
	"github.com/nscache/nscache"
	"github.com/nscache/nscache/drivers/redis"
)

func main() {
	// 创建Redis缓存实例
	cache, err := redis.New(&redis.Options{
		Addr:     "localhost:6379",
		Password: "", // 无密码
		DB:       0,  // 默认DB
	})
	if err != nil {
		fmt.Println("Redis init error:", err)
		return
	}
	
	// 设置缓存项,30秒过期
	err = cache.Set("session:abc123", []byte("user_data_here"), 30*time.Second)
	if err != nil {
		fmt.Println("Set error:", err)
		return
	}
	
	// 批量获取
	items, err := cache.GetMulti("session:abc123", "nonexistent")
	if err != nil {
		fmt.Println("GetMulti error:", err)
		return
	}
	
	for key, val := range items {
		if val != nil {
			fmt.Printf("%s: %s\n", key, string(val))
		} else {
			fmt.Printf("%s: not found\n", key)
		}
	}
}

3. 多级缓存示例

NSCache 支持创建多级缓存(如内存+Redis):

package main

import (
	"fmt"
	"time"
	
	"github.com/nscache/nscache"
	"github.com/nscache/nscache/drivers/memory"
	"github.com/nscache/nscache/drivers/redis"
	"github.com/nscache/nscache/multilevel"
)

func main() {
	// 创建内存缓存(一级缓存)
	memCache := memory.New()
	
	// 创建Redis缓存(二级缓存)
	redisCache, err := redis.New(&redis.Options{
		Addr: "localhost:6379",
	})
	if err != nil {
		fmt.Println("Redis init error:", err)
		return
	}
	
	// 创建多级缓存
	multiCache := multilevel.New(memCache, redisCache)
	
	// 设置缓存
	err = multiCache.Set("config:app", []byte("app_config_data"), 5*time.Minute)
	if err != nil {
		fmt.Println("Set error:", err)
		return
	}
	
	// 获取缓存 - 会先查内存,再查Redis
	val, err := multiCache.Get("config:app")
	if err != nil {
		fmt.Println("Get error:", err)
		return
	}
	
	fmt.Println("Config:", string(val))
}

高级功能

1. 自定义缓存驱动

实现 nscache.Cache 接口即可创建自定义驱动:

type MyCacheDriver struct {
	// 实现细节
}

func (c *MyCacheDriver) Get(key string) ([]byte, error) {
	// 实现Get方法
}

func (c *MyCacheDriver) Set(key string, value []byte, ttl time.Duration) error {
	// 实现Set方法
}

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

// 使用自定义驱动
cache := &MyCacheDriver{}

2. 缓存统计

部分驱动支持缓存统计:

if stats, ok := cache.(nscache.Stats); ok {
	fmt.Println("Hits:", stats.Hits())
	fmt.Println("Misses:", stats.Misses())
	fmt.Println("Keys:", stats.Keys())
}

性能建议

  1. 对于高频访问的小数据,使用内存缓存
  2. 对于分布式场景,使用Redis或Memcached
  3. 考虑使用多级缓存架构
  4. 合理设置TTL,避免缓存雪崩

NSCache 通过统一的接口和多种驱动实现,为Go开发者提供了灵活高效的缓存解决方案。根据你的具体场景选择合适的驱动和配置,可以显著提升应用性能。

回到顶部