Go语言高速缓存Caching

目录GCache分布式缓存GCacheGCache简介定义:GCache是一个高性能的内存缓存库,用于在Go语言中实现本地缓存功能。特点:高性能支持多种缓存策略简单易用安装GCachegoget-ugithub.com/patrickmn/go-cac

目录


GCache

GCache 简介

定义:GCache 是一个高性能的内存缓存库,用于在 Go 语言中实现本地缓存功能。

特点

  • 高性能
  • 支持多种缓存策略
  • 简单易用

安装 GCache

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.DefaultExpiration
  • 自定义过期时间:time.Duration
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", 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.SetMulti
  • 批量获取:c.GetMulti
package 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.Delete
  • 清空所有键:c.Flush
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)

    // 删除键
    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 (Least Recently Used)

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 (Least Frequently Used)

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...

剩余50%的内容订阅专栏后可查看

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论