欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go+Redis緩存設(shè)計(jì)與優(yōu)化實(shí)現(xiàn)

 更新時(shí)間:2025年02月11日 08:27:38   作者:程序員林北北  
本文主要介紹了Go+Redis緩存設(shè)計(jì)與優(yōu)化實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

在本節(jié)中,我們將通過(guò)一個(gè)實(shí)際的項(xiàng)目案例,演示如何在 Go 中使用 Redis 實(shí)現(xiàn)高效的緩存設(shè)計(jì)與優(yōu)化。

業(yè)務(wù)需求

假設(shè)我們正在開發(fā)一個(gè)電商平臺(tái),需要緩存商品信息以提高頁(yè)面加載速度。商品信息經(jīng)常被查詢,但修改頻率較低,因此使用 Redis 作為緩存會(huì)大大減少數(shù)據(jù)庫(kù)的查詢壓力。

1. 緩存設(shè)計(jì)

  • 緩存粒度 :我們將每個(gè)商品的信息作為一個(gè)緩存項(xiàng)進(jìn)行存儲(chǔ),緩存的鍵為商品的 ID,值為商品的 JSON 數(shù)據(jù)。
  • 緩存失效策略:設(shè)置緩存的過(guò)期時(shí)間為 10 分鐘,這樣商品信息會(huì)在 10 分鐘后自動(dòng)失效,防止過(guò)期數(shù)據(jù)的出現(xiàn)。
  • 緩存預(yù)熱:在系統(tǒng)啟動(dòng)時(shí),我們通過(guò)預(yù)加載常見商品的數(shù)據(jù)到緩存中,減少首次訪問(wèn)時(shí)的緩存未命中的情況。

2. Go+Redis代碼實(shí)現(xiàn)

package main

import (
	"context"
	"encoding/json"
	"fmt"
	"log"
	"time"

	"github.com/go-redis/redis/v8"
)

var ctx = context.Background()

// 商品結(jié)構(gòu)體
type Product struct {
	ID    string `json:"id"`
	Name  string `json:"name"`
	Price float64 `json:"price"`
}

func getProductFromDB(productID string) (*Product, error) {
	// 模擬從數(shù)據(jù)庫(kù)獲取商品數(shù)據(jù)
	return &Product{
		ID:    productID,
		Name:  "Example Product",
		Price: 99.99,
	}, nil
}

func getProductFromCache(rdb *redis.Client, productID string) (*Product, error) {
	// 從緩存中獲取商品數(shù)據(jù)
	val, err := rdb.Get(ctx, productID).Result()
	if err == redis.Nil {
		// 緩存未命中,查詢數(shù)據(jù)庫(kù)
		return nil, nil
	} else if err != nil {
		return nil, err
	}

	var product Product
	err = json.Unmarshal([]byte(val), &product)
	if err != nil {
		return nil, err
	}
	return &product, nil
}

func setProductToCache(rdb *redis.Client, product *Product) error {
	// 將商品數(shù)據(jù)緩存到 Redis
	productData, err := json.Marshal(product)
	if err != nil {
		return err
	}

	return rdb.Set(ctx, product.ID, productData, 10*time.Minute).Err()
}

func getProduct(rdb *redis.Client, productID string) (*Product, error) {
	// 嘗試從緩存中獲取商品
	product, err := getProductFromCache(rdb, productID)
	if err != nil {
		return nil, err
	}

	if product == nil {
		// 緩存未命中,查詢數(shù)據(jù)庫(kù)并將結(jié)果緩存
		product, err = getProductFromDB(productID)
		if err != nil {
			return nil, err
		}

		err = setProductToCache(rdb, product)
		if err != nil {
			return nil, err
		}
	}

	return product, nil
}

func main() {
	rdb := redis.NewClient(&redis.Options{
		Addr:     "localhost:6379", // Redis 地址
		Password: "",               // 密碼
		DB:       0,                // 默認(rèn)數(shù)據(jù)庫(kù)
	})

	// 獲取商品
	productID := "12345"
	product, err := getProduct(rdb, productID)
	if err != nil {
		log.Fatalf("獲取商品失敗: %v", err)
	}

	fmt.Printf("商品信息: %+v\n", product)
}

3. 代碼解析

  • 獲取商品信息:首先,我們嘗試從 Redis 緩存中獲取商品信息。如果緩存未命中,我們會(huì)從數(shù)據(jù)庫(kù)中查詢商品數(shù)據(jù),并將查詢結(jié)果存入緩存。
  • 緩存設(shè)置過(guò)期時(shí)間:商品信息被存入緩存時(shí),我們?cè)O(shè)置了 10 分鐘的過(guò)期時(shí)間,這樣緩存會(huì)自動(dòng)失效。
  • 緩存穿透與擊穿防范:通過(guò)合理的緩存失效時(shí)間和商品信息的緩存設(shè)計(jì),避免了緩存穿透和緩存擊穿的問(wèn)題。

4. 性能優(yōu)化

通過(guò)上述設(shè)計(jì),我們顯著減少了數(shù)據(jù)庫(kù)查詢次數(shù),降低了數(shù)據(jù)庫(kù)的負(fù)載,提高了系統(tǒng)的響應(yīng)速度和吞吐量。

到此這篇關(guān)于Go+Redis緩存設(shè)計(jì)與優(yōu)化的文章就介紹到這了,更多相關(guān)Go Redis緩存內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解讀rand.Seed(time.Now().UnixNano())的作用及說(shuō)明

    解讀rand.Seed(time.Now().UnixNano())的作用及說(shuō)明

    這篇文章主要介紹了關(guān)于rand.Seed(time.Now().UnixNano())的作用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2023-03-03
  • golang默認(rèn)Logger日志庫(kù)在項(xiàng)目中使用Zap日志庫(kù)

    golang默認(rèn)Logger日志庫(kù)在項(xiàng)目中使用Zap日志庫(kù)

    這篇文章主要為大家介紹了golang默認(rèn)Logger日志庫(kù)在項(xiàng)目中使用Zap日志庫(kù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • Go秒爬博客園100頁(yè)新聞

    Go秒爬博客園100頁(yè)新聞

    利用go語(yǔ)言的協(xié)程并發(fā)優(yōu)勢(shì)爬取網(wǎng)頁(yè)速度相當(dāng)之快,博客園100頁(yè)新聞標(biāo)題只需一秒即可全部爬取,跟著小編一起去看看如何實(shí)現(xiàn)的,希望大家可以從中受益
    2018-09-09
  • golang實(shí)現(xiàn)unicode轉(zhuǎn)換為字符串string的方法

    golang實(shí)現(xiàn)unicode轉(zhuǎn)換為字符串string的方法

    這篇文章主要介紹了golang實(shí)現(xiàn)unicode轉(zhuǎn)換為字符串string的方法,實(shí)例分析了Go語(yǔ)言編碼轉(zhuǎn)換的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2016-07-07
  • 解決Golang并發(fā)工具Singleflight的問(wèn)題

    解決Golang并發(fā)工具Singleflight的問(wèn)題

    前段時(shí)間在一個(gè)項(xiàng)目里使用到了分布式鎖進(jìn)行共享資源的訪問(wèn)限制,后來(lái)了解到Golang里還能夠使用singleflight對(duì)共享資源的訪問(wèn)做限制,于是利用空余時(shí)間了解,將知識(shí)沉淀下來(lái),并做分享
    2022-05-05
  • Go并發(fā)編程sync.Cond的具體使用

    Go并發(fā)編程sync.Cond的具體使用

    Go 標(biāo)準(zhǔn)庫(kù)提供 Cond 原語(yǔ)的目的是,為等待 / 通知場(chǎng)景下的并發(fā)問(wèn)題提供支持,本文主要介紹了Go并發(fā)編程sync.Cond的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-05-05
  • golang中獲取變量類型的方法總結(jié)

    golang中獲取變量類型的方法總結(jié)

    golang中是沒有提供內(nèi)置函數(shù)來(lái)獲取變量的類型的,但是通過(guò)一定的方式也可以獲取,下面主要給大家介紹了幾個(gè)golang獲取變量類型的幾種方式,需要的朋友可以參考下
    2025-03-03
  • 從生成CRD到編寫自定義控制器教程示例

    從生成CRD到編寫自定義控制器教程示例

    這篇文章主要為大家介紹了從生成CRD到編寫自定義控制器的教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • 一文帶你吃透Golang中net/http標(biāo)準(zhǔn)庫(kù)服務(wù)端

    一文帶你吃透Golang中net/http標(biāo)準(zhǔn)庫(kù)服務(wù)端

    這篇文章將從服務(wù)端(Server)作為切入點(diǎn)和大家分享一下Go語(yǔ)言net/http標(biāo)準(zhǔn)庫(kù)的實(shí)現(xiàn)邏輯,進(jìn)而一步步分析http標(biāo)準(zhǔn)庫(kù)內(nèi)部是如何運(yùn)作的,感興趣的可以了解下
    2024-03-03
  • golang 實(shí)現(xiàn)對(duì)Map進(jìn)行鍵值自定義排序

    golang 實(shí)現(xiàn)對(duì)Map進(jìn)行鍵值自定義排序

    這篇文章主要介紹了golang 實(shí)現(xiàn)對(duì)Map進(jìn)行鍵值自定義排序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04

最新評(píng)論