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
更多关于golang支持多数据源驱动的高性能缓存框架插件库nscache的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
NSCache - Go语言多数据源驱动的高性能缓存框架
NSCache 是一个支持多数据源驱动的高性能 Go 缓存框架插件库,它提供了统一的缓存接口,支持多种后端存储(如内存、Redis、Memcached等),并具有高性能和易扩展的特点。
主要特性
- 统一缓存接口,支持多种后端存储
- 高性能设计,低延迟
- 支持缓存过期策略
- 支持批量操作
- 易于扩展新的存储驱动
安装
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())
}
性能建议
- 对于高频访问的小数据,使用内存缓存
- 对于分布式场景,使用Redis或Memcached
- 考虑使用多级缓存架构
- 合理设置TTL,避免缓存雪崩
NSCache 通过统一的接口和多种驱动实现,为Go开发者提供了灵活高效的缓存解决方案。根据你的具体场景选择合适的驱动和配置,可以显著提升应用性能。