golang,go,博客,开源,编程

go服务常用的cache

Published on with 0 views and 0 comments

Golang 中,常见的缓存框架主要是用于加速应用程序的性能,通过减少频繁的数据库查询或复杂计算的需求。以下是一些 Golang 常见的缓存框架:

1. GoCache

  • 简介GoCache 是一个强大的内存缓存库,提供了类似于 Memcached 的缓存功能,支持过期时间和自动清除失效缓存。
  • 特点
    • 内存存储:数据存储在内存中,支持数据过期和自动清理。
    • 并发安全:线程安全,可以在多个 Goroutine 中使用。
    • 支持定时清理:可以设置缓存失效时间,支持基于 TTL(Time to Live)的缓存清理。
  • 安装
    go get github.com/patrickmn/go-cache
    
  • 使用示例
    package main
    
    import (
        "fmt"
        "github.com/patrickmn/go-cache"
        "time"
    )
    
    func main() {
        c := cache.New(5*time.Minute, 10*time.Minute)
    
        // 设置缓存
        c.Set("foo", "bar", cache.DefaultExpiration)
    
        // 获取缓存
        val, found := c.Get("foo")
        if found {
            fmt.Println("Found:", val)
        } else {
            fmt.Println("Not Found")
        }
    }
    

2. BigCache

  • 简介BigCache 是一个高效的内存缓存库,设计用于解决大规模、高并发的缓存场景。它提供了高效的内存管理,特别适用于大数据量缓存。
  • 特点
    • 高效内存管理:优化内存使用,防止内存碎片。
    • 并发友好:支持高并发操作。
    • 内存回收机制:支持缓存淘汰策略,避免内存溢出。
  • 安装
    go get github.com/allegro/bigcache
    
  • 使用示例
    package main
    
    import (
        "fmt"
        "github.com/allegro/bigcache/v3"
        "time"
    )
    
    func main() {
        cache, _ := bigcache.NewBigCache(bigcache.DefaultConfig(10 * time.Minute))
    
        // 设置缓存
        cache.Set("foo", []byte("bar"))
    
        // 获取缓存
        val, err := cache.Get("foo")
        if err == nil {
            fmt.Println("Found:", string(val))
        } else {
            fmt.Println("Not Found")
        }
    }
    

3. Ristretto

  • 简介Ristretto 是一个非常高效的缓存库,旨在提供更高性能和更低延迟。它使用了一种高效的缓存替换算法。
  • 特点
    • 高性能:特别适用于高性能和低延迟要求的应用。
    • LRU(Least Recently Used)算法:使用高效的 LRU 算法来管理缓存。
    • 并发控制:支持高并发,线程安全。
    • 支持缓存的空间管理:支持设置缓存的最大内存大小,超出则进行淘汰。
  • 安装
    go get github.com/dgraph-io/ristretto
    
  • 使用示例
    package main
    
    import (
        "fmt"
        "github.com/dgraph-io/ristretto"
        "log"
    )
    
    func main() {
        cache, err := ristretto.NewCache(&ristretto.Config{
            NumCounters: 1e7, // Number of keys to track frequency of (10M).
            MaxCost:     1 << 30, // Maximum cost of cache (1GB).
            BufferItems: 64,
        })
        if err != nil {
            log.Fatal(err)
        }
    
        // 设置缓存
        cache.Set("foo", "bar", 1)
    
        // 获取缓存
        val, found := cache.Get("foo")
        if found {
            fmt.Println("Found:", val)
        } else {
            fmt.Println("Not Found")
        }
    }
    

4. Groupcache

  • 简介Groupcache 是一个分布式缓存库,类似于 Memcached,但具有更强的分布式特性。它特别适用于大规模分布式缓存应用。
  • 特点
    • 分布式缓存:适合分布式系统,能够将缓存数据分布到多个节点上。
    • 自我管理:每个节点自动管理自己的缓存,并根据需求从其他节点获取缓存数据。
    • 支持缓存回退机制:缓存缺失时可以通过回退机制从其他节点获取数据。
  • 安装
    go get github.com/golang/groupcache
    
  • 使用示例
    package main
    
    import (
        "fmt"
        "github.com/golang/groupcache"
    )
    
    var peers = groupcache.NewHTTPPool("localhost:8080")
    
    func main() {
        cache := groupcache.NewGroup("example", 64<<20, groupcache.GetterFunc(func(ctx groupcache.Context, key string, dest groupcache.Sink) error {
            // 回退获取数据的逻辑,例如从数据库中加载数据
            dest.SetString("This is the data for " + key)
            return nil
        }))
    
        // 获取缓存
        var data string
        err := cache.Get(nil, "key1", groupcache.StringSink(&data))
        if err != nil {
            fmt.Println("Error:", err)
        }
        fmt.Println("Cached Data:", data)
    }
    

5. Go-Redis (缓存)

  • 简介Go-Redis 是一个高性能的 Redis 客户端,可以将 Redis 作为 Golang 中的缓存层。通过使用 Redis,开发者可以利用 Redis 强大的分布式缓存、持久化、队列等功能。
  • 特点
    • 支持 Redis:基于 Redis 实现缓存,支持分布式、高可用等特性。
    • 丰富的缓存功能:除了简单的键值缓存,还支持多种 Redis 数据结构,如 List、Set、SortedSet、Hash 等。
    • 持久化支持:Redis 可以选择是否持久化数据到磁盘,适用于对持久化有需求的场景。
  • 安装
    go get github.com/go-redis/redis/v8
    
  • 使用示例
    package main
    
    import (
        "fmt"
        "github.com/go-redis/redis/v8"
        "context"
    )
    
    var rdb *redis.Client
    
    func init() {
        rdb = redis.NewClient(&redis.Options{
            Addr: "localhost:6379",
        })
    }
    
    func main() {
        ctx := context.Background()
    
        // 设置缓存
        err := rdb.Set(ctx, "foo", "bar", 0).Err()
        if err != nil {
            panic(err)
        }
    
        // 获取缓存
        val, err := rdb.Get(ctx, "foo").Result()
        if err != nil {
            panic(err)
        }
        fmt.Println("Found:", val)
    }
    

6. Cache2go

  • 简介Cache2go 是一个非常简单的 Golang 内存缓存库,支持缓存失效和定时清理。
  • 特点
    • 内存缓存:数据存储在内存中,支持缓存过期。
    • 线程安全:支持并发操作,适合高并发应用。
    • 简单易用:API 设计简单,容易上手。
  • 安装
    go get github.com/muesli/cache2go
    
  • 使用示例
    package main
    
    import (
        "fmt"
        "github.com/muesli/cache2go"
    )
    
    func main() {
        cache := cache2go.Cache("example")
    
        // 设置缓存
        cache.Add("foo", 0, "bar")
    
        // 获取缓存
        item, err := cache.Value("foo")
        if err == nil {
            fmt.Println("Found:", item.Data)
        } else {
            fmt.Println("Not Found")
        }
    }
    

总结

这些缓存框架各有特点,选择合适的框架取决于应用需求:

  • 如果需要高性能、简单的内存缓存,GoCacheBigCache 是不错的选择。
  • 如果对缓存的性能和管理要求较高,尤其是需要大数据量缓存,可以选择 BigCacheRistretto
  • 如果需要分布式缓存,支持更复杂的数据类型和持久化功能,可以考虑 Redis
  • 如果是想要构建分布式缓存并且需要数据回退,Groupcache 可能适合你的需求。

标题:go服务常用的cache
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/01/06/1736154508605.html
联系:scotttu@163.com