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

大家好,豆小匠终于开始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/opPASSgoos: 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,只能玩单机吗?

当然,不是了…


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

下面描述这个场景:

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

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

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

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

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

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

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


这期就喵到这!收!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/145327.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

传输层协议-UDP协议

目录 传输层再谈端口号端口号范围划分认识知名端口号 UDP协议UDP协议格式UDP数据封装UDP数据分用 UDP协议的特点面向数据报 UDP缓冲区UDP使用注意事项基于UDP的应用层协议 传输层 实际上我们应用层的数据并不是直接发给网络的&#xff0c;而是需要先将数据发送给传输层&#xf…

客户下单时如何自动匹配到最近的门店

有些商家有多个门店&#xff0c;当客户下单时&#xff0c;希望能够将客户下的订单分配给最近的门店。下面就具体介绍一下在采云小程中是如何实现的。 首先&#xff0c;为了简便起见&#xff0c;请确定门店高级设置保持着默认设定。因为单独的商品管理模式以及独享的商品信息模…

一篇博客读懂队列——Queue

目录 一、队列的概念和结构 ​二、队列的实现 2.1队列的初始化QueueInit 2.2队列的摧毁QueueDestroy 2.3插入结点QueuePush 2.4删除结点QueuePop 2.5返回队头QueueFront 2.6返回队尾QueueBack 2.7判断队列为空QueueEmpty 2.8统计队列数目QueueSize 一、队列的概念和…

Vue computed 计算属性

1.计算属性的相关知识 概念 &#xff1a;基于现有的数据&#xff0c;计算出来的新属性。依赖数据的变化&#xff0c;自动重新计算。 语法&#xff1a; ① 声明在 computed 配置项 中&#xff0c;一个计算属性对应一个函数 ② 使用起来和普通属性一样使用 {{ 计算属性名 …

Vue3+Element Plus表格多字段组合排序方法

一、问题描述 默认el-table是单个字段排序的&#xff0c;点击表格头排序&#xff0c;老排序字段的排序箭头样式并没有保留&#xff0c;仅仅保留了新点击字段的样式。 二、实现效果 选择多列组合排序时可以高亮多列箭头。 三、解决方法 3.1 如何记录多个字段被选择&#xff…

C++编译器对临时对象的优化

思考&#xff1a;我们在构造运算符重载号重载的时候会构造那些函数呐&#xff1f;&#xff1f;&#xff1f; 例子&#xff1a;小dome //该运算重载函数 由 左操作数调用&#xff0c;右操作数当做实参传递给该函数//触发t1t3->t1.operator (t3)Test operator (const Test &a…

js写轮播图,逐步完善

目录 1、自动轮播 2、点击更换 3、自动播放加左右箭头点击切换 4、完整版轮播图 1、自动轮播 用定时器setInterval()来写&#xff0c;可以实现自动播放 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><met…

【开源】基于JAVA的超市商品管理系统

目录 一、摘要1.1 简介1.2 项目详细录屏 二、研究内容2.1 数据中心模块2.2 超市区域模块2.3 超市货架模块2.4 商品类型模块2.5 商品档案模块 三、系统设计3.1 用例图3.2 时序图3.3 类图3.4 E-R图 四、系统实现4.1 登录4.2 注册4.3 主页4.4 超市区域管理4.5 超市货架管理4.6 商品…

http接口测试—自动化测试框架设计

一、测试需求描述 对服务后台一系列的http接口功能测试。 输入&#xff1a;根据接口描述构造不同的参数输入值&#xff08;Json格式&#xff09; 输出&#xff1a;字符串&#xff08;传入的方式传入的字符串&#xff09; http://localhost:8090/lctest/TestServer 二、程序设计…

CTFhub-RCE-命令注入

构造payload :127.0.0.1|ls 127.0.0.1|cat 80203153621323.php F12

成绩发布快捷方式

当一名老师&#xff0c;每到学期中期末&#xff0c;是不是觉得成绩发布就像个老大难&#xff1f;学生急着要知道自己的成绩&#xff0c;家长也频繁私信询问成绩&#xff0c;而传统的成绩发布方式却往往效率低下&#xff0c;费时费力。今天就来聊聊如何通过查询系统、各类代码、…

Python数据容器(集合)

集合 1.集合的定义2.集合中常用操作4.常用功能总结5.集合的特点6.练习 思考&#xff1f; 我们目前接触到了列表、元组、字符串三个数据容器了。基本满足大多数的使用场景。为何要学新的集合类型呢&#xff1f; 通过特性分析 列表可以修改、支持重复元素且有序元组、字符串不可修…

EtherNET转Profibus网关使用 AB PLC的配置方法

兴达易控EtherNET转Profibus网关&#xff08;XD-EPPB20&#xff09;是一款功能强大的通讯设备&#xff0c;具备Profibus从站功能。它的主要作用是将EtherNET/IP设备无缝接入到PROFIBUS网络中。通过连接到Profibus总线&#xff0c;它可以作为从站使用&#xff0c;并且通过连接到…

【C++】一维字符数组 与 二维字符数组

一维字符数组 一维字符数组 可以通过数组名直接进行整体输入和输出&#xff08;注意&#xff1a;当使用一维字符数组存储字符串时&#xff0c;因为元素尾部会有一个空字符\0,所以需要给空字符\0留一个位置&#xff09; char a[5]; cin>>a; cout<<a;二维字符数组 …

书单 | 11月程序员新书播报

11月最新上架计算机书籍 1、人工智能&#xff08;第3版&#xff09; 美国经典人工智能教材第3版&#xff0c;人工智能的百科全书&#xff0c;新增深度学习及人工智能编程等内容&#xff0c;理论阐释结合动手实践&#xff0c;附赠PPT课件、配套视频及代码文件。 1.人工智能经典…

SpringCloud微服务:Ribbon负载均衡

目录 负载均衡策略&#xff1a; 负载均衡的两种方式&#xff1a; 饥饿加载 1. Ribbon负载均衡规则 规则接口是IRule 默认实现是ZoneAvoidanceRule&#xff0c;根据zone选择服务列表&#xff0c;然后轮询 2&#xff0e;负载均衡自定义方式 代码方式:配置灵活&#xff0c;但修…

tensorflow 1.15 gpu docker环境搭建;Nvidia Docker容器基于TensorFlow1.15测试GPU;——全流程应用指南

前言: TensorFlow简介 TensorFlow 在新款 NVIDIA Pascal GPU 上的运行速度可提升高达 50%&#xff0c;并且能够顺利跨 GPU 进行扩展。 如今&#xff0c;训练模型的时间可以从几天缩短到几小时 TensorFlow 使用优化的 C 和 NVIDIA CUDA 工具包编写&#xff0c;使模型能够在训练…

轻量封装WebGPU渲染系统示例<31>- 若干线条对象(源码)

线条对象包括: AABB包围盒&#xff0c;OBB包围盒, 曲线&#xff0c;直线&#xff0c;圆&#xff0c;坐标轴&#xff0c;视锥体线框&#xff0c;矩形网格等。 当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/LineOb…

rk3588 usb网络共享连接

出门在外总会遇到傻 X 地方 没有能连接公网的 网口给香橙派连网 而我的香橙派5plus 没有wifi模块。。。话不多说 在手机上看一眼手机的mac地址&#xff0c; 在rk3588 上执行以下命令&#xff1a; sudo ifconfig usb0 down sudo ifconfig usb0 hw ether 58:F2:FC:5D:D4:7A //该m…

【备忘】ChromeDriver 官方下载地址 Selenium,pyppetter依赖

https://googlechromelabs.github.io/chrome-for-testing/#stable windows系统选择win64版本下载即可