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

news2024/10/7 7:35:16

大家好,豆小匠终于开始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分钟才更新价格,其实还可以接受的。


这期就喵到这!收!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

酷柚易汛ERP- 组装单与拆卸单操作

1、功能介绍 组装单用来处理企业组装等加工业务&#xff0c;拆卸单用来处理企业拆卸等加工业务&#xff0c;支持一对多的产品加工业务。 2、主要操作 2.1 新增组装单 打开【仓库】-【组装单】新增组装单。 录入组合件与子件&#xff0c;单据审核后&#xff0c;系统根据存货…

如何在Qemu上跑Milk-duo开发板

前言 &#xff08;1&#xff09;PLCT实验室实习生长期招聘&#xff1a;招聘信息链接 &#xff08;2&#xff09;学习本文之前&#xff0c;要求先看一下Milk-V Duo快速上手的环境搭建部分&#xff0c;创建好镜像文件。 正文 编译milk-duo qemu &#xff08;1&#xff09;下面步…

【STM32/FreeRTOS】SysTick定时器及FreeRTOS系统节拍

目录 一、SysTick定时器 1、SysTick寄存器介绍 &#xff08;1&#xff09;控制及状态寄存器 &#xff08;2&#xff09;重装载数值寄存器 &#xff08;3&#xff09;当前数值寄存器 2、SysTick寄存器配置函数 二、FreeRTOS中的SysTick定时器 1、SysTick配置函数及分析 …

传输层协议-UDP协议

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

网工内推 | 网工校招,金融、软件行业,HCIE认证优先,最高15薪

01 长威信息科技 招聘岗位&#xff1a;网络工程师&#xff08;24届校招&#xff09; 职责描述&#xff1a; 1、负责网络类、安全类产品的安装部署、调试和运行维护&#xff0c;以及网络故障分析、定位和处理&#xff1b; 2、负责实施项目各类文档编制工作&#xff0c;包括技术…

MySQL主从复制、读写分离(利用Amoeba和Mycat)、完全同步

目录 一、主从复制 1、概念 1.1主从复制延迟问题&#xff1a; 1.2、MySQL安全和性能配置&#xff1a; 1.3、主从复制的工作过程&#xff1a; 1.4、mysql主从复制注意点&#xff1a; 1.5、MySQL的主从复制的模式&#xff1a; 2、主从复制实验&#xff1a; 二、读写分离&…

springcloud旅游网站源码

开发技术&#xff1a; jdk1.8&#xff0c;mysql5.7&#xff0c;idea&#xff0c;nodejs&#xff0c;vscode springcloud springboot mybatis vue 功能介绍&#xff1a; 用户端&#xff1a; 登录注册 首页显示搜索景区&#xff0c;轮播图&#xff0c;旅游攻略列表 点击攻…

Pytorch数据集读出到transform全过程

最近写代码又遇见了这个问题&#xff0c;又忘记了&#xff0c;于是写一篇博客记录一下。 一般我们使用pytorch获取CIFAR10数据集&#xff0c;一般这样写&#xff1a; mean [0.4914, 0.4822, 0.4465] std [0.2023, 0.1994, 0.2010] transform transforms.Compose([transform…

【动手学大模型】(通俗易懂 快速上手) Task1 大模型简介

1.发展历程 语言建模始于20世纪90年代,采用的是统计学习方法. 2003年,深度学习的思想融入到语言模型中,相较于上个时代,该方法可以更好地捕捉语言中的复杂关系. 2018年左右,Transformer架构的神经网络模型被引入,通过大量文本训练模型,使它对语言有了更深的理解. 最近,模型规模…

F : DS图遍历--广度优先搜索

Description 给出一个图的邻接矩阵&#xff0c;对图进行广度优先搜索&#xff0c;从顶点0开始 注意&#xff1a;图n个顶点编号从0到n-1 如果图不连通&#xff0c;则对尚未访问的编号结点继续进行广度优先搜索&#xff0c;直到所有结点被访问 Input 第一行输入t&#xff0c…

vscode设置vue3代码格式化

vscode设置vue3代码格式化 vscode设置vue3代码格式化 下载插件设置格式化时选用的插件实际使用 使用Prettier默认配置使用Prettier添加自定义配置使用Volar 完整配置文件参考链接 下载插件 可以使用Volar或Prettier 设置格式化时选用的插件 mac&#xff1a;【shift】【op…

基于单片机教室人数实时检测系统仿真及源程序

一、系统方案 1、本设计采用51单片机作为主控器。 2、红外传感器检测进出人数&#xff0c;液晶1602显示。 3、按键最多容纳人数&#xff0c;烟雾报警。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 void lcd_init() { lcd_write_com(0x38…

【IDEA】IntelliJ IDEA的使用2.0——结合实际场景提升工具使用

前言 IDEA作为一款非常不错的Java开发编辑工具&#xff0c;需要不断学习如何更好地使用IEDA工具&#xff0c;打造成得心应手的斧头。 本篇博客是结合实际场景提升IDEA使用的博客&#xff0c;会陆续收集一些实际使用场景&#xff0c;结合这些场景阐述如何更好地使用IDEA工具。…

zabbix的服务器端 server端部署

zabbix的服务器端 server 主机iplocalhost&#xff08;centos 7&#xff09;192.168.10.128 zabbix官网部署教程 但是不全&#xff0c;建议搭配这篇文章一起看 zabbixAgent部署 安装mysql 所有配置信息和Zabbix收集到的数据都被存储在数据库中。 下载对应的yum源 yum ins…

YOLO改进系列之注意力机制(CloAttention模型介绍)

CloAttention来自清华大学的团队提出的一篇论文CloFormer&#xff0c;作者从频域编码的角度认为现有的轻量级视觉Transformer中&#xff0c;大多数方法都只关注设计稀疏注意力&#xff0c;来有效地处理低频全局信息&#xff0c;而使用相对简单的方法处理高频局部信息。很少有方…

内网穿透(frp和proxychains4)

一、准备工作 需要三台机器&#xff0c;去哦这里准备的是win7&#xff08;目标主机&#xff09;&#xff0c;kali&#xff08;攻击者&#xff09;&#xff0c;红帽&#xff08;跳板&#xff09; 攻击机&#xff08;kali&#xff09;&#xff1a;192.168.10.15 跳板机&#xff0…

Python二级 每周练习题26

如果你感觉有收获&#xff0c;欢迎给我打赏 ———— 以激励我输出更多优质内容 练习一: 从键盘输入任意字符串&#xff0c;按照下面要求分离字符串中的字符&#xff1a; 1、分别取出该字符串的第偶数位的元素&#xff08;提醒注意&#xff1a;是按照从左往右数的 方式确定字…

【Linux】Ubuntu16.04系统查看已安装的python版本,及其配置

前情提示&#xff1a;我已经在Ubuntu16.04里用源码安装了python3.8.11&#xff0c;Ubuntu16.04系统默认安装2.7.12与3.5.2 1.查看已安装版本 python2 --version #查看python2安装版本 python3 --version #查看python3安装版本 python3.5 --version #查看python3.5安装…

Python入门:一文详解Python列表(List)操作方法

文章目录 前言一、创建一个列表二、访问列表中的值三、更新列表四、删除列表元素六、Python列表截取七、Python列表操作的函数和方法关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②…