发布于2026-07-29 阅读(0)
扫一扫,手机访问
要搞定Debian上Golang的缓存机制,其实可选的路子挺多的,比如内存缓存、文件缓存,或者干脆上Redis这样的分布式缓存系统。下面咱们就从最基础的内存缓存说起,一步步看看怎么搭起来。
先把Golang装上。如果还没装,用下面这两行命令就能搞定:
sudo apt update
sudo apt install golang-go
接下来,咱们动手写一个简单的Go程序,演示一下内存缓存是怎么工作的。
mkdir cache-demo
cd cache-demo
新建一个main.go文件,把下面这段代码贴进去:
package main
import (
"fmt"
"sync"
"time"
)
// Cache 是一个简单的内存缓存结构
type Cache struct {
mu sync.Mutex
items map[string]interface{}
}
// NewCache 创建一个新的缓存实例
func NewCache() *Cache {
return &Cache{
items: make(map[string]interface{}),
}
}
// Get 获取缓存中的值
func (c *Cache) Get(key string) (interface{}, bool) {
c.mu.Lock()
defer c.mu.Unlock()
if value, found := c.items[key]; found {
return value, true
}
return nil, false
}
// Set 设置缓存中的值
func (c *Cache) Set(key string, value interface{}) {
c.mu.Lock()
defer c.mu.Unlock()
c.items[key] = value
}
// Delete 删除缓存中的值
func (c *Cache) Delete(key string) {
c.mu.Lock()
defer c.mu.Unlock()
delete(c.items, key)
}
func main() {
cache := NewCache()
// 设置缓存
cache.Set("key1", "value1")
cache.Set("key2", "value2")
// 获取缓存
if value, found := cache.Get("key1"); found {
fmt.Println("key1:", value)
} else {
fmt.Println("key1 not found")
}
// 删除缓存
cache.Delete("key1")
// 再次获取缓存
if value, found := cache.Get("key1"); found {
fmt.Println("key1:", value)
} else {
fmt.Println("key1 not found")
}
}
在项目目录下,直接运行:
go run main.go
输出结果应该是:
key1: value1
key1 not found
这就说明咱们自己手写的内存缓存跑通了。
如果项目里需要更复杂的缓存策略(比如缓存淘汰、过期时间、高并发下的性能优化),那直接用现成的第三方库会更省心。这里推荐两个:groupcache 和 ristretto。下面以 ristretto 为例,它来自 Dgraph 团队,性能很不错。
ristretto库go get github.com/dgraph-io/ristretto
ristretto把 main.go 换成下面这段代码:
package main
import (
"fmt"
"github.com/dgraph-io/ristretto"
)
func main() {
// 创建一个ristretto缓存实例
cache, err := ristretto.NewCache(&ristretto.Options{
NumCounters: 1e7, // number of keys to track frequency of (10M).
MaxCost: 1 << 30, // maximum cost of cache (1GB).
BufferItems: 64, // number of keys per Get buffer.
})
if err != nil {
panic(err)
}
// 设置缓存
cache.Set("key1", "value1", 1)
cache.Set("key2", "value2", 1)
// 获取缓存
if value, found := cache.Get("key1"); found {
fmt.Println("key1:", value)
} else {
fmt.Println("key1 not found")
}
// 删除缓存
cache.Del("key1")
// 再次获取缓存
if value, found := cache.Get("key1"); found {
fmt.Println("key1:", value)
} else {
fmt.Println("key1 not found")
}
}
再次执行:
go run main.go
输出和之前一样:
key1: value1
key1 not found
看到没?第三方库用起来更简洁,而且内部已经处理好了并发安全、内存控制等细节。实际项目中,如果只是简单缓存,手写一个也不会太麻烦;但如果要考虑性能、容量限制和自动淘汰,还是直接用 ristretto 这类库更稳妥。当然,要是业务规模更大,需要跨进程共享缓存,那就可以考虑上 Redis 了——不过那就是另一个话题了。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8