SoFunction
Updated on 2025-04-13

Actual battle between Redis cache and local memory cache in Go language

In modern high concurrency systems, caching technology is a key means to improve performance and reduce database pressure. Whether it is the Redis cache in a distributed system or the local efficient local memory cache, reasonable use can make your application more powerful. Today, we will be based ongo-dev-frame/sponge/pkg/cacheThe library's code examples deeply explore the principles and usage methods of these two caches, and take you to master the cache technology from zero to one.

The principle of caching: Why it is so important

The core idea of ​​caching is to reduce direct requests to underlying storage (such as databases) by storing frequently accessed data in a fast-read medium. Taking Redis as an example, it is a high-performance key-value pair storage system that supports persistent and network distributed deployment, suitable for large-scale distributed applications. Local memory cache uses the RAM when the program runs, which is faster but has limited capacity, and is usually used in single-airport scenarios or temporary data storage. The common goal of both is:Reduce latency and improve throughput

existcacheIn the library, both Redis and local memory caches are encapsulated through a unified interface.SetGetandDeleteoperate. This design not only simplifies development, but also provides flexibility and scalability. Next, we will analyze their implementation and application one by one through code examples.

Using Redis Cache: Protecting Distributed Performance

Redis is known for its high availability and rich data structure. existcacheIn this article, we can quickly integrate the Redis cache through the following code:

package main

import (
	"context"
	"fmt"
	"time"

	"/redis/go-redis/v9"
	"/go-dev-frame/sponge/pkg/cache"
	"/go-dev-frame/sponge/pkg/encoding"
)

// User structure exampletype User struct {
	ID   int
	Name string
}

func main() {
	// Initialize the Redis client	redisClient := (&{
		Addr:     "localhost:6379",
		Password: "",
		DB:       0,
	})

	cachePrefix := "user:"
	jsonEncoding := {}
	newObject := func() interface{} {
		return &User{}
	}

	// Create Redis cache instance	c := (redisClient, cachePrefix, jsonEncoding, newObject)

	ctx := ()
	user := &User{ID: 1, Name: "Alice"}

	// Set cached data	err := (ctx, "1", user, 10*)
	if err != nil {
		("Cached storage failed:", err)
		return
	}

	// Get cached data	var cachedUser User
	err = (ctx, "1", &cachedUser)
	if err != nil {
		("Cached read failed:", err)
		return
	}
	("Get user from cache:", cachedUser)

	// Delete the cache	(ctx, "1")
}

Principle analysis

NewRedisCacheFunctions through Redis client,cachePrefix(key prefix, used for namespace isolation),jsonEncoding(Serialization method) andnewObject(Deserialize the target object constructor) Initialize the cache instance.SetMethod serializes the data into JSON and saves it into Redis.GetThe method is deserialized back to the specified object. This design takes into account flexibility and type safety, making it ideal for scenarios where data is shared across services is required.

Using local memory cache: the ultimate pursuit of stand-alone performance

For distributed scenarios that do not rely on, local memory cache is a lightweight and efficient choice. The following is a basedsponge/pkg/cacheExample of local memory cache:

package main

import (
	"context"
	"fmt"
	"time"

	"/go-dev-frame/sponge/pkg/cache"
	"/go-dev-frame/sponge/pkg/encoding"
)

// User structure exampletype User struct {
	ID   int
	Name string
}

func main() {
	// Initialize memory cache	cachePrefix := "user:"
	jsonEncoding := {}
	newObject := func() interface{} {
		return &User{}
	}

	// Create a memory cache instance	c := (cachePrefix, jsonEncoding, newObject)

	ctx := ()
	user := &User{ID: 2, Name: "Bob"}

	// Set cached data	err := (ctx, "2", user, 10*)
	if err != nil {
		("Cached storage failed:", err)
		return
	}

	// Get cached data	var cachedUser User
	err = (ctx, "2", &cachedUser)
	if err != nil {
		("Cached read failed:", err)
		return
	}
	("Get user from cache:", cachedUser)

	// Delete the cache	(ctx, "2")
}

Principle analysis

Local memory cache is based on local RAM implementation, and defaults to use similarbigcacheThe underlying library supports configuration of maximum capacity and elimination strategies (such as LRU). passInitGlobalMemoryYou can customize cache parameters, but you can use the default configuration directly without initialization. Its advantage is that it does not require network IO and has extremely low latency, which is suitable for high-frequency reading and writing scenarios.

Redis vs local memory cache: How to choose?

Redis: Suitable for distributed systems, scenarios where data needs to be persisted or shared across processes. The disadvantage is that the network overhead and deployment cost are high.

Local memory cache: Suitable for high-performance single-machine or temporary data storage, simple and easy to use, but limited capacity, and data is lost after restart.

Summarize

passcacheLibrary, Go developers can easily integrate Redis and local memory cache to meet the performance needs of different scenarios. Whether it is Redis for distributed systems or local memory cache for single-airport scenarios, they all reduce learning costs with a unified interface while retaining a high degree of flexibility.

This is the introduction to this article about the actual combat of Redis cache and local memory cache in Go language. For more related contents of Go Redis cache and local memory cache, please search for my previous articles or continue browsing the related articles below. I hope everyone will support me in the future!