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 - Golang多数据源驱动的高性能缓存框架
NSCache是一个支持多数据源驱动的高性能缓存框架插件库,它提供了统一的缓存操作接口,支持多种后端存储(如内存、Redis、Memcached等),并具有高性能和易扩展的特点。
主要特性
- 统一的操作接口,支持多种缓存后端
- 高性能设计,适合高并发场景
- 支持多级缓存
- 插件化架构,易于扩展
- 支持缓存过期策略
- 支持分布式缓存
安装
go get github.com/xxx/nscache
基本使用示例
package main
import (
"fmt"
"time"
"github.com/xxx/nscache"
"github.com/xxx/nscache/drivers/memory"
)
func main() {
// 创建内存缓存驱动
memDriver := memory.NewDriver()
// 创建缓存实例
cache := nscache.New(memDriver)
// 设置缓存
err := cache.Set("user:1", []byte("{\"name\":\"John\",\"age\":30}"), 10*time.Minute)
if err != nil {
fmt.Println("设置缓存失败:", err)
return
}
// 获取缓存
data, err := cache.Get("user:1")
if err != nil {
fmt.Println("获取缓存失败:", err)
return
}
fmt.Println("获取到的缓存数据:", string(data))
// 删除缓存
err = cache.Delete("user:1")
if err != nil {
fmt.Println("删除缓存失败:", err)
}
}
多数据源支持
NSCache支持多种缓存后端,以下是使用Redis作为缓存后端的示例:
package main
import (
"fmt"
"time"
"github.com/xxx/nscache"
"github.com/xxx/nscache/drivers/redis"
)
func main() {
// 创建Redis缓存驱动
redisDriver := redis.NewDriver(&redis.Options{
Addr: "localhost:6379",
Password: "", // 无密码
DB: 0, // 默认DB
})
// 创建缓存实例
cache := nscache.New(redisDriver)
// 设置缓存
err := cache.Set("product:1001", []byte("{\"name\":\"Laptop\",\"price\":999.99}"), 30*time.Minute)
if err != nil {
fmt.Println("设置缓存失败:", err)
return
}
// 获取缓存
data, err := cache.Get("product:1001")
if err != nil {
fmt.Println("获取缓存失败:", err)
return
}
fmt.Println("获取到的产品信息:", string(data))
}
多级缓存示例
NSCache支持多级缓存,例如内存+Redis的两级缓存:
package main
import (
"fmt"
"time"
"github.com/xxx/nscache"
"github.com/xxx/nscache/drivers/memory"
"github.com/xxx/nscache/drivers/redis"
"github.com/xxx/nscache/multilevel"
)
func main() {
// 创建内存缓存驱动
memDriver := memory.NewDriver()
// 创建Redis缓存驱动
redisDriver := redis.NewDriver(&redis.Options{
Addr: "localhost:6379",
Password: "",
DB: 0,
})
// 创建多级缓存
multiCache := multilevel.New(
memDriver, // 第一级:内存缓存
redisDriver, // 第二级:Redis缓存
)
// 设置缓存
err := multiCache.Set("config:site", []byte("{\"title\":\"My Site\",\"theme\":\"dark\"}"), 1*time.Hour)
if err != nil {
fmt.Println("设置缓存失败:", err)
return
}
// 获取缓存
data, err := multiCache.Get("config:site")
if err != nil {
fmt.Println("获取缓存失败:", err)
return
}
fmt.Println("站点配置:", string(data))
}
高级功能
批量操作
// 批量设置
items := map[string][]byte{
"user:1": []byte("{\"name\":\"Alice\"}"),
"user:2": []byte("{\"name\":\"Bob\"}"),
}
err := cache.MSet(items, 10*time.Minute)
// 批量获取
keys := []string{"user:1", "user:2"}
results, err := cache.MGet(keys)
缓存统计
stats := cache.Stats()
fmt.Printf("缓存命中率: %.2f%%\n", stats.HitRate()*100)
性能优化建议
- 对于高频访问的小数据,使用内存缓存
- 对于大数据或需要持久化的数据,使用Redis或Memcached
- 合理设置缓存过期时间
- 使用多级缓存架构减少网络IO
- 批量操作减少网络往返
自定义驱动实现
如果需要实现自定义的缓存驱动,只需实现nscache.Driver
接口:
type MyDriver struct{}
func (d *MyDriver) Get(key string) ([]byte, error) {
// 实现获取逻辑
}
func (d *MyDriver) Set(key string, value []byte, ttl time.Duration) error {
// 实现设置逻辑
}
// 实现其他必要方法...
// 然后可以这样使用
myDriver := &MyDriver{}
cache := nscache.New(myDriver)
NSCache通过这种插件化设计,使得它可以轻松支持各种缓存后端,同时保持统一的API接口,方便开发者使用和切换不同的缓存方案。