目录GCache分布式缓存GCacheGCache简介定义:GCache是一个高性能的内存缓存库,用于在Go语言中实现本地缓存功能。特点:高性能支持多种缓存策略简单易用安装GCachegoget-ugithub.com/patrickmn/go-cac
定义:GCache 是一个高性能的内存缓存库,用于在 Go 语言中实现本地缓存功能。
特点:
go get -u github.com/patrickmn/go-cache
package main
import (
"fmt"
"time"
"github.com/patrickmn/go-cache"
)
func main() {
// 初始化缓存
c := cache.New(5*time.Minute, 10*time.Minute)
// 设置键值对
c.Set("key", "value", cache.DefaultExpiration)
// 获取值
val, found := c.Get("key")
if found {
fmt.Println("Value:", val)
} else {
fmt.Println("Key not found")
}
}
cache.DefaultExpirationtime.Durationpackage main
import (
"fmt"
"time"
"github.com/patrickmn/go-cache"
)
func main() {
// 初始化缓存
c := cache.New(5*time.Minute, 10*time.Minute)
// 设置键值对及过期时间
c.Set("key", "value", 1*time.Minute)
// 等待一段时间
time.Sleep(2 * time.Minute)
// 尝试获取值
val, found := c.Get("key")
if found {
fmt.Println("Value:", val)
} else {
fmt.Println("Key expired or not found")
}
}
c.SetMultic.GetMultipackage main
import (
"fmt"
"time"
"github.com/patrickmn/go-cache"
)
func main() {
// 初始化缓存
c := cache.New(5*time.Minute, 10*time.Minute)
// 批量设置键值对
items := map[string]interface{}{
"key1": "value1",
"key2": "value2",
}
c.SetMulti(items, cache.DefaultExpiration)
// 批量获取值
vals, err := c.GetMulti([]string{"key1", "key2"})
if err == nil {
fmt.Println("Values:", vals)
} else {
fmt.Println("Error:", err)
}
}
c.Deletec.Flushpackage main
import (
"fmt"
"time"
"github.com/patrickmn/go-cache"
)
func main() {
// 初始化缓存
c := cache.New(5*time.Minute, 10*time.Minute)
// 设置键值对
c.Set("key", "value", cache.DefaultExpiration)
// 删除键
c.Delete("key")
// 尝试获取值
val, found := c.Get("key")
if found {
fmt.Println("Value:", val)
} else {
fmt.Println("Key deleted or not found")
}
// 清空所有键
c.Flush()
// 尝试获取值
val, found = c.Get("key")
if found {
fmt.Println("Value:", val)
} else {
fmt.Println("Cache flushed")
}
}
LRU 算法:当缓存满时,移除最近最少使用的项。
package main
import (
"fmt"
"time"
"github.com/patrickmn/go-cache"
)
func main() {
// 初始化缓存
c := cache.New(5*time.Minute, 10*time.Minute)
// 设置键值对
c.Set("key1", "value1", cache.DefaultExpiration)
c.Set("key2", "value2", cache.DefaultExpiration)
c.Set("key3", "value3", cache.DefaultExpiration)
// 获取值
val, found := c.Get("key1")
if found {
fmt.Println("Value:", val)
} else {
fmt.Println("Key not found")
}
// 再次设置键值对
c.Set("key4", "value4", cache.DefaultExpiration)
// 尝试获取值
val, found = c.Get("key1")
if found {
fmt.Println("Value:", val)
} else {
fmt.Println("Key removed by LRU")
}
}
LFU 算法:当缓存满时,移除最不常用的项。
package main
import (
"fmt"
"time"
"github.com/patrickmn/go-cache"
)
func main() {
// 初始化缓存
c := cache.New(5*time.Minute, 10*time.Minute)
// 设置键值对
c.Set("key1", "value1", cache.DefaultExpiration)
c.Set("key2", "value2", cache.DefaultExpiration)
c.Set("key3", "value3", cache.DefaultExpiration)
// 获取值
val, found := c.Get("key1")
if found {
fmt.Println("Value:", val)
} else {
fmt.Println("Key not found")
}
// 再次获取值
val, found = c.Get("key1")
if found {
fmt.Println("Value:", val)
} else {
fmt.Println("Key not found")
}
// 再次设置键值对
c.Set("key4", "value4", cache.DefaultExpiration)
// 尝试获取值
val, found = c.Get("key2")
if found {
fmt.Println("Value:", val)
} else {
fmt.Println("Key removed by LFU")
}
}
检查错误:if err != nil { ... }
package main
import (
"fmt"
"time"
"github.com/patrickmn/go-cache"
)
func main() {
// 初始化缓存
c := cache.New(5*time.Minute, 10*time.Minute)
// 设置键值对
err := c.Set("key", "value", cache.DefaultExpiration)
if err != nil {
fmt.Println("Error setting key:", err)
return
}
// 获取值
val, found := c.Get("key")
if !found {
fmt.Println("Key not found")
return
}
fmt.Println("Value:", val)
}
并发安全:GCache 默认是线程安全的。
package main
import (
"fmt"
"sync"
"time"
"github.com/patrickmn/go-cache"
)
func main() {
// 初始化缓存
c := cache.New(5*time.Minute, 10*time.Minute)
var wg sync.WaitGroup
wg.Add(10)
// 并发设置键值对
for i := 0; i < 10; i++ {
go func(i int) {
defer wg.Done()
err := c.Set(fmt.Sprintf("key%d", i), fmt.Sprintf("value%d", i), cache.DefaultExpiration)
if err != nil {
fmt.Println("Error setting key:", err)
return
}
}(i)
}
wg.Wait()
// 获取值
for i := 0; i < 10; i++ {
val, found := c.Get(fmt.Sprintf("key%d", i))
if found {
fmt.Println("Value:", val)
} else {
fmt.Println("Key not found")
}
}
}
使用测试框架:testing
p... 如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!