最新公告
  • 欢迎您光临码农资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!加入我们
  • 如何处理 Golang 缓存失效的情况?

    在处理 golang 中的缓存失效时,可以遵循以下策略:使用时间戳标记缓存项,并在过期时获取新数据。使用锁,当协程获取缓存项时对缓存进行加锁,并在缓存项不存在或过期时解锁缓存并获取新数据。

    如何处理 Golang 缓存失效的情况?

    如何处理 Golang 缓存失效的情况?

    在 Golang 程序中使用缓存时,应对缓存失效的情况至关重要,以确保数据的一致性和可靠性。以下是两种处理策略:

    1. 使用时间戳

    • 将缓存项与时间戳关联起来。
    • 当缓存项过期时,获取新数据并更新缓存。
    type CacheItem struct {
        Value interface{}
        Timestamp time.Time
    }
    
    var cache = make(map[string]CacheItem)
    
    func SetCache(key string, value interface{}) {
        cache[key] = CacheItem{Value: value, Timestamp: time.Now()}
    }
    
    func GetCache(key string) (interface{}, bool) {
        item, ok := cache[key]
        if ok && time.Since(item.Timestamp) < time.Second*30 {
            return item.Value, true
        }
        return nil, false
    }

    2. 使用锁

    • 当一个协程获取缓存项时,对缓存进行加锁。
    • 如果缓存项不存在或已过期,则解锁缓存并获取新数据。
    var cache = sync.Map{}
    
    func SetCache(key string, value interface{}) {
        cache.Store(key, value)
    }
    
    func GetCache(key string) (interface{}, bool) {
        if value, ok := cache.Load(key); ok {
            return value, true
        }
    
        lock := sync.Mutex{}
        lock.Lock()
        defer lock.Unlock()
    
        if value, ok := cache.Load(key); ok {
            return value, true
        }
    
        newValue, err := fetchNewValue(key)
        if err == nil {
            cache.Store(key, newValue)
        }
    
        return newValue, err == nil
    }

    实战案例

    假设我们在一个 RESTful API 中使用缓存来存储用户的详细信息。

    package main
    
    import (
        "encoding/json"
        "fmt"
        "net/http"
        "time"
    
        "<a style='color:#f60; text-decoration:underline;' href="https://www.codesou.cn/" target="_blank">git</a>hub.com/go-<a style='color:#f60; text-decoration:underline;' href="https://www.codesou.cn/" target="_blank">redis</a>/redis/v8"
    )
    
    var redisClient = redis.NewClient(&redis.Options{})
    
    type User struct {
        ID   int
        Name string
    }
    
    func main() {
        // 添加缓存处理
        http.HandleFunc("/users/:id", func(w http.ResponseWriter, r *http.Request) {
            var user User
            id := r.URL.Path[len("/users/"):]
    
            // 尝试从缓存中获取用户数据
            cachedUser, ok := GetCache(id)
            if ok {
                // 缓存命中
                fmt.Fprintf(w, "User from cache: %+v", cachedUser)
                return
            }
    
            // 缓存未命中
            // 从数据库中获取用户数据
            err := db.Get(id, &user)
            if err != nil {
                // 数据库中不存在此用户
                fmt.Fprintf(w, "User not found")
                return
            }
    
            // 设置缓存,有效期为 30 秒
            SetCache(id, user, time.Second*30)
            fmt.Fprintf(w, "User from database: %+v", user)
        })
    
        http.ListenAndServe(":8080", nil)
    }
    
    func GetCache(key string) (User, bool) {
        result, err := redisClient.Get(key).Bytes()
        if err != nil {
            return User{}, false
        }
    
        var user User
        err = json.Unmarshal(result, &user)
        if err != nil {
            return User{}, false
        }
    
        return user, true
    }
    
    func SetCache(key string, user User, expiration time.Duration) {
        jsonBytes, err := json.Marshal(user)
        if err != nil {
            return
        }
    
        err = redisClient.Set(key, jsonBytes, expiration).Err()
        if err != nil {
            return
        }
    }
    想要了解更多内容,请持续关注码农资源网,一起探索发现编程世界的无限可能!
    本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
    如有侵权请发送邮件至1943759704@qq.com删除

    码农资源网 » 如何处理 Golang 缓存失效的情况?
    • 5会员总数(位)
    • 22375资源总数(个)
    • 770本周发布(个)
    • 77 今日发布(个)
    • 176稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情