golang高性能缓存与缓存填充插件库groupcache的使用
Golang高性能缓存与缓存填充插件库groupcache的使用
概述
groupcache是一个分布式缓存和缓存填充库,旨在替代许多情况下的一组memcached节点。
与memcached的比较
与memcached相似之处:
- 通过键分片来选择哪个节点负责该键
与memcached不同之处:
- 不需要运行单独的服务器组,大大减少了部署/配置的麻烦
- 带有缓存填充机制,防止"惊群效应"
- 不支持版本化值、缓存过期时间或显式缓存驱逐
- 支持自动镜像超热项目到多个进程
- 目前仅适用于Go语言
加载过程
groupcache的Get("foo")
查找过程如下:
- 检查"foo"是否因为非常热门而存在于本地内存中,如果是则使用
- 检查"foo"是否因为当前节点是其所有者而存在于本地内存中,如果是则使用
- 如果不是当前节点负责的键,则RPC到负责的节点获取值
使用示例
下面是一个完整的groupcache使用示例:
package main
import (
"context"
"fmt"
"log"
"net/http"
"github.com/golang/groupcache"
)
func main() {
// 创建一个新的groupcache组
group := groupcache.NewGroup("users", 64<<20, groupcache.GetterFunc(
func(ctx context.Context, key string, dest groupcache.Sink) error {
// 当缓存未命中时,这个函数会被调用来填充缓存
log.Printf("Loading key %s from database", key)
// 模拟从数据库加载数据
value := fmt.Sprintf("value-for-%s", key)
// 将值存入缓存
dest.SetString(value)
return nil
},
))
// 设置HTTP服务用于peer间通信
peers := groupcache.NewHTTPPool("http://localhost:8080")
// 添加其他peer节点(在实际应用中会有多个节点)
peers.Set("http://localhost:8080", "http://localhost:8081")
// 启动HTTP服务器
go func() {
log.Println("Starting server on :8080")
log.Fatal(http.ListenAndServe(":8080", peers))
}()
// 使用缓存
var value string
ctx := context.Background()
// 获取键"user1"的值
if err := group.Get(ctx, "user1", groupcache.StringSink(&value)); err != nil {
log.Fatal(err)
}
fmt.Println("Got value:", value)
// 再次获取相同的键,这次会命中缓存
if err := group.Get(ctx, "user1", groupcache.StringSink(&value)); err != nil {
log.Fatal(err)
}
fmt.Println("Got cached value:", value)
}
实际应用
groupcache已在多个Google生产系统中使用,包括dl.google.com、Blogger部分功能、Google Code部分功能、Google Fiber部分功能以及Google生产监控系统的部分功能等。
获取帮助
如需任何讨论或问题,可以使用golang-nuts邮件列表。
更多关于golang高性能缓存与缓存填充插件库groupcache的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复