一个破单机,也要用远程缓存?

大家好,豆小匠终于开始Coding了,这期来聊聊实战相关的杂谈。

正文开始!


作为编程萌新的时候,总想着把程序做复杂,堆技术栈。

但是程序是为场景服务的,比如,我想提高接口的响应速度,应该怎么做呢?

一个简单粗暴的方法就是加内存型的数据库,比如Redis,Memcache等。

那么怎么加?Redis单机实例?Redis集群?

等等,我现在就一台服务器额…

或许后端服务和Redis部署在同一台服务器,速度还能快不少。

但是这样的话,为什么不把数据直接存到内存呢!


简单测试下Redis缓存和本地缓存的性能差异:

package cache_test

import (
	"context"
	"log"
	"testing"

	"github.com/patrickmn/go-cache"
	"github.com/redis/go-redis/v9"
)

var localCache *cache.Cache
var redisCache *redis.Client

func TestMain(m *testing.M) {
	// 初始化一个默认永不过期的本地缓存
	localCache = cache.New(cache.NoExpiration, cache.NoExpiration)

	// 连接本地启动的redis
	redisCache = redis.NewClient(&redis.Options{
		Addr:     "127.0.0.1:6379",
		Password: "",
		DB:       0,
		PoolSize: 100,
	})
	_, err := redisCache.Ping(context.Background()).Result()
	if err != nil {
		log.Fatalf("redis client init failed: %v", err)
	}
	m.Run()
}

func BenchmarkRedisCacheStore_Get(b *testing.B) {
	b.StopTimer()
	ctx := context.Background()
	redisCache.Set(ctx, "key", "value", 0)
	b.StartTimer()
	for i := 0; i < b.N; i++ {
		redisCache.Get(ctx, "key")
	}
}

func BenchmarkLocalCacheStore_Get(b *testing.B) {
	b.StopTimer()
	localCache.Set("foo", "bar", cache.NoExpiration)
	b.StartTimer()
	for i := 0; i < b.N; i++ {
		localCache.Get("foo")
	}
}
redis cache测试结果 local cache测试结果
goos: windowsgoarch: amd64pkg: github.com/anjude/backend-superone/test/cache_testcpu: AMD Ryzen 7 6800H with Radeon GraphicsBenchmarkRedisCacheStore_GetBenchmarkRedisCacheStore_Get-16 31167 34784 ns/opPASS goos: windowsgoarch: amd64pkg: github.com/anjude/backend-superone/test/cache_testcpu: AMD Ryzen 7 6800H with Radeon GraphicsBenchmarkLocalCacheStore_GetBenchmarkLocalCacheStore_Get-16 217163282 5.389 ns/opPASS

让ChatGPT解读下↓↓↓

一个破单机,也要用远程缓存?_第1张图片

大概意思就是Redis缓存每次获取时间是本地缓存的6455倍。(不同机器测试有差异)


看着服务器上运行的Redis,降本增效这么简单?

本地缓存这么nb,只能玩单机吗?

当然,不是了…


应该说,什么场景适合使用本地缓存。

下面描述这个场景:

  1. 频繁读取的数据。
  2. 对读取速度敏感的数据。
  3. 相对稳定不经常变化的数据。
  4. 能容忍一定延迟更新的数据。

不一定完全满足上述的条件,只是满足的越多,越适合使用本地缓存。

频繁读取和读取速度敏感的数据很容易理解,使用本地缓存就是为了快,还可以缓解远程共享缓存的压力。

但是如果我们的服务器多起来了,每台实例都缓存有一份数据,如果数据有更新,同步到其他实例的成本就会升高。

如果能满足第三点相对稳定的数据,我们仍旧可以使用本地缓存,否则使用远程共享缓存。

那么第四点呢,这个数据实在太稳定了,稳定到我们可能不需要第一时间察觉到它的更新,这时候甚至不需要实例间的同步,只需要实例定时刷新这个数据就行。

比如一杯豆浆的价格,常年都是2元,某一天升到3元,我5分钟刷新一次价目表,最多延迟个5分钟才更新价格,其实还可以接受的。


这期就喵到这!收!

你可能感兴趣的:(聊点实战,缓存)