SoFunction
Updated on 2025-04-06

Go+Redis cache design and optimization implementation

In this section, we will demonstrate how to use Redis in Go to achieve efficient cache design and optimization through a practical project case.

Business Requirements

Suppose we are developing an e-commerce platform that needs to cache product information to improve page loading speed. Product information is often queried, but it is modified at a low frequency, so using Redis as a cache will greatly reduce the query pressure of the database.

1. Cache Design

  • Cache granularity: We store the information of each product as a cache item. The cached key is the product ID and the value is the product's JSON data.
  • Cache invalidation policy: Set the cache expiration time to 10 minutes, so that the product information will automatically expire after 10 minutes, preventing the occurrence of expired data.
  • Cache preheating: When the system starts, we preload data of common products into the cache to reduce the cache misses during the first visit.

2. Go+Redis code implementation

package main

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

	"/go-redis/redis/v8"
)

var ctx = ()

// Product structuretype Product struct {
	ID    string `json:"id"`
	Name  string `json:"name"`
	Price float64 `json:"price"`
}

func getProductFromDB(productID string) (*Product, error) {
	// Simulate to obtain product data from the database	return &Product{
		ID:    productID,
		Name:  "Example Product",
		Price: 99.99,
	}, nil
}

func getProductFromCache(rdb *, productID string) (*Product, error) {
	// Get product data from cache	val, err := (ctx, productID).Result()
	if err ==  {
		// Cache misses, query the database		return nil, nil
	} else if err != nil {
		return nil, err
	}

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

func setProductToCache(rdb *, product *Product) error {
	// Cache product data to Redis	productData, err := (product)
	if err != nil {
		return err
	}

	return (ctx, , productData, 10*).Err()
}

func getProduct(rdb *, productID string) (*Product, error) {
	// Try to get the item from the cache	product, err := getProductFromCache(rdb, productID)
	if err != nil {
		return nil, err
	}

	if product == nil {
		// Cache misses, query the database and cache the results		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 := (&{
		Addr:     "localhost:6379", // Redis Address		Password: "",               // password		DB:       0,                // Default database	})

	// Get the product	productID := "12345"
	product, err := getProduct(rdb, productID)
	if err != nil {
		("Failed to obtain product: %v", err)
	}

	("Product Information: %+v\n", product)
}

3. Code parsing

  • Get product information: First, we try to get product information from the Redis cache. If the cache misses, we will query the product data from the database and store the query results in the cache.
  • Cache setting expiration time: When the product information is stored in the cache, we set an expiration time of 10 minutes, so that the cache will automatically expire.
  • Cache penetration and breakdown prevention: Through reasonable cache failure time and product information cache design, cache penetration and cache breakdown problems are avoided.

4. Performance optimization

Through the above design, we significantly reduce the number of database queries, reduce the load of the database, and improve the system's response speed and throughput.

This is the end of this article about Go+Redis cache design and optimization. For more related Go Redis cache content, please search for my previous articles or continue browsing the related articles below. I hope everyone will support me in the future!