大家好,豆小匠终于开始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解读下↓↓↓
大概意思就是Redis缓存每次获取时间是本地缓存的6455倍。(不同机器测试有差异)
看着服务器上运行的Redis,降本增效这么简单?
本地缓存这么nb,只能玩单机吗?
当然,不是了…
应该说,什么场景适合使用本地缓存。
下面描述这个场景:
- 频繁读取的数据。
- 对读取速度敏感的数据。
- 相对稳定不经常变化的数据。
- 能容忍一定延迟更新的数据。
不一定完全满足上述的条件,只是满足的越多,越适合使用本地缓存。
频繁读取和读取速度敏感的数据很容易理解,使用本地缓存就是为了快,还可以缓解远程共享缓存的压力。
但是如果我们的服务器多起来了,每台实例都缓存有一份数据,如果数据有更新,同步到其他实例的成本就会升高。
如果能满足第三点相对稳定的数据,我们仍旧可以使用本地缓存,否则使用远程共享缓存。
那么第四点呢,这个数据实在太稳定了,稳定到我们可能不需要第一时间察觉到它的更新,这时候甚至不需要实例间的同步,只需要实例定时刷新这个数据就行。
比如一杯豆浆的价格,常年都是2元,某一天升到3元,我5分钟刷新一次价目表,最多延迟个5分钟才更新价格,其实还可以接受的。
这期就喵到这!收!