Redis是什么?架构是怎么样的?

目录

前言

一,Redis架构

1.1 本地缓存

1.2 远程缓存

二,强大的Redis优点

2.1 支持多种数据类型

2.2 内存过期策略

2.3 内存淘汰策略

2.4 持久化

三,Redis是什么


前言

我是一个程序员,维护了一个商品服务,它的背后直连Mysql数据库,假设商品服务对外每秒需要提供1万次查询,但背后的mysql每秒只能提供每秒5K次的查询,那mysql肯定顶不住,分分钟压垮,这种大流量场景很常见,比如双十一购物,春节抢车票.

那么问题来了?有没有什么办法在Mysql不被压垮的同时,让商品服务支持每秒!万次的查询?当然有!没有什么是加一层中间层不能解决的,如果有,那就再加一层,这次我们要加的中间层就是Redis.

一,Redis架构

我们知道查询内存的速度要比查询磁盘要快,Mysql的数据主要存放在磁盘里,如果能将Mysql的数据放在内存里,完全不走磁盘,那必然能大大提升查询性能

1.1 本地缓存

对于上面的问题,我们很容易想到,在我们商品服务中申请一个内存字典,python中就是dict,java中就是map,其中Key是商品ID,value是商品数据,通过商品ID就能查到商品数据

当我们发生查询时,优先去查询内存字典,没有结果再跑到Mysql的数据库里查询,并将查询到的结果放在我们的数据字典里面,并返回给用户,这样下次就能从内存里面查出来啦,像这种在服务内存放数据的内存,就是所谓的本地缓存,有了本地缓存的加持,真正打到Mysql的查询就会少很多

1.2 远程缓存

为了保证服务高可用,商品服务经常不止一个实例,如果每个实例都重复缓存一份本地内存,那就有些浪费内存条,所以更好的解决方案就是,将这部分字典内存抽出来,单独做一个服务,他就是远程缓存服务.

但问题又来了,多个商品服务,去读写同一分远程缓存,会存在并发问题,那怎么办?很简单,对外我们不管有多少个网络连接,收到读写命令后,都统一塞到一个线程上,再一个线程上对字典进行读写,这样什么并发问题,线程切换开销,完全不存在

这个远程缓存服务足以满足大部分场景,但是他过于简陋,下来我们看如何优化它!!!

二,强大的Redis优点

2.1 支持多种数据类型

如上面所说的远程缓存服务里只有一个字典类型,key和value都是字符串,但是我们平时写代码的时候还会用到其他内存里的数据结构,例如python的list,set,因此在Redis中对value进行了扩展

        1,支持先进先出的队列List

        2,支持去重的Set

        3,支持排序的ZSet

这样缓存服务就更强了

2.2 内存过期策略

当我们的缓存服务支持的数据结构类型变多了之后,塞到内存里的数据就会越来越多,内存又小又贵,那该怎么办呢?

我们可以给缓存里的数据加一个过期时间,一旦数据过期就从内存里删掉,可以很大程度上延缓内存增长速度,那么那些数据该设置多长时间过期?这个就交给用户方去做判断,让用户通过EXPIRED命令来指定那些数据多久过期

2.3 内存淘汰策略

但如果大家都不设置过期时间,内存还是会爆炸!这该如何解决?就是在内存接近上限的时候,根据一些策略删除一些内存,比如可以将最近最少使用的内存删掉,这样不仅解决了内存问题,还能让缓存里面的数据都是热点数据,一箭双雕

2.4 持久化

MySql之所以过得这么舒服,那是因为前面有个缓存服务挡住了大部分流量,一旦缓存服务重启,那内存数据就丢了,这时候流量就会全部打到Mysql身上,这时候Mysql又就原地爆炸了.

因此我们还需要给内存服务加入最大程度的持久化保证,确保服务重启后什么数据都没有,于是可以在缓存服务里面加一个异步子进程,定期将全量内存数据持久化到磁盘文件里,当重启服务的时候就会加载之前的内存数据

三,Redis是什么

上面我们说了这么多,再回头来看看Redis到底是什么?我们从开始的一个简陋的缓存服务慢慢就变成了一个高性能,高可用,支持多种数据类型,支持各种缓存淘汰策略,并提供一定持久化能力的超强缓存服务,这就是我们常说的Redis

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

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

相关文章

蓝桥杯真题——传送阵

原题连接:蓝桥杯2024年第十五届省赛真题-传送阵 - C语言网 知识点:并查集 题目描述 小蓝在环球旅行时来到了一座古代遗迹,里面并排放置了 n 个传送阵,进入第 i 个传送阵会被传送到第 ai 个传送阵前,并且可以随时选择…

彩虹表攻击

1. 引言 密码安全一直是信息安全领域的重要课题。攻击者可以利用**暴力破解(Brute-Force Attack)和字典攻击(Dictionary Attack)等方式尝试破解密码。然而,计算机性能的提升使得这些方法的效率不断提高,其中彩虹表攻击(Rainbow Table Attack)**是一种极具威胁性的密码…

Vue2 监听器 watcher

文章目录 前言监听器的作用:工作流程:基本用法1. 简单监听2. 对象形式配置 使用场景1. 执行异步操作2. 监听路由变化3. 复杂对象/数组变化 关键配置项与计算属性的区别动态添加监听器注意事项 前言 提示:这里可以添加本文要记录的大概内容&a…

Linux系统程序设计:从入门到高级Day02

这一篇 我带大家复习一下,C语言中的文件 那一部分 大家注意 这里的图并非原创 是当时我老师的图片 本片作用主要是 后续会有文件相关操作,这篇帮大家复习C语言文件中的内容 有助于大家后面的理解。 文章中代码大多是图片格式,是因为这是我…

N元语言模型的时间和空间复杂度计算

对于N元语言模型,时间复杂度是O(V ^ {N-1}),空间复杂度是O(V ^ {N}),N是词汇表的大小。 空间复杂度:存储所有可能的N-1元组及其对应的词的频次需要大量的存储空间。例如,对于一个三元模型(N3)&…

Tmux 核心操作速查指南

Tmux 最常用操作笔记 1. 基本概念 会话(Session):一个tmux会话可以包含多个窗口,适合长期任务管理。窗口(Window):每个窗口是一个独立的终端界面,可包含多个面板。面板&#xff08…

哈希表系列一>两数之和

目录 题目:方法:暴力代码:优化后代码: 题目: 链接: link 方法: 暴力代码: public int[] twoSum(int[] nums, int target) {解法一:暴力解法:int n nums.length;for(int…

端到端机器学习流水线(MLflow跟踪实验)

目录 端到端机器学习流水线(MLflow跟踪实验)1. 引言2. 项目背景与意义2.1 端到端机器学习流水线的重要性2.2 MLflow的作用2.3 工业级数据处理需求3. 数据集生成与介绍3.1 数据集构成3.2 数据生成方法4. 机器学习流水线与MLflow跟踪4.1 端到端机器学习流水线4.2 MLflow跟踪实验…

英语学习:读科技论文的难处

如果读起科技论文, 我们就知道自己到底欠缺什么知识了, 那是一个挨着一个的缺。 而且还没有维基百科可用。 怎么办?没办法!硬看! 而且还要面临语言的差异性困难。比如这一句怎么翻译比较合适?还是直接不翻译…

001 使用单片机实现的逻辑分析仪——吸收篇

本内容记录于韦东山老师的毕设级开源学习项目,含个人观点,请理性阅读。 个人笔记,没有套路,一步到位,欢迎交流! 00单片机的逻辑分析仪与商业版FPGA的逻辑分析仪异同 对比维度自制STM32逻辑分析仪商业版逻…

基数排序算法解析与TypeScript实现

基数排序(Radix Sort)是一种高效的非比较型整数排序算法,通过逐位分配与收集的方式实现排序。本文将深入解析其工作原理,并给出完整的TypeScript实现。 一、算法原理 1. 核心思想 多关键字排序:将整数按位数切割成不同…

最新全开源码支付系统,赠送3套模板

最新全开源码支付系统,赠送3套模板 码支付是专为个人站长打造的聚合免签系统,拥有卓越的性能和丰富的功能。它采用全新轻量化的界面UI 让您能更方便快捷地解决知识付费和运营赞助的难题,同时提供实时监控和管理功能,让您随时随地…

PHP基础二【变量/输出/数据类型/常量/字符串/运算符】

PHP基础二 1. PHP变量2. PHP输出3. 数据类型3.1 字符串3.2 整型3.3 浮点型3.4 布尔型3.5 数组3.6 对象3.7 NULL3.8 资源类型3.9 类型比较 4. 常量5. 运算符 1. PHP变量 1. 我们来看一个实例&#xff1a; <?php$x 5;$y 6;$z $x $y;echo $z; // echo 是输出&#xff0c;…

ue5 仿鬼泣5魂类游戏角色和敌人没有碰撞

UE5系列文章目录 文章目录 UE5系列文章目录前言一、问题原因二、设置碰撞2.读入数据 总结 前言 ue5 仿鬼泣5魂类游戏角色和敌人没有碰撞 一、问题原因 在UE5中&#xff0c;角色和敌人没有碰撞可能是由多种原因导致的&#xff0c;以下是一些可能的原因及解决方法&#xff1a…

《AdaBoost:从弱分类器到强模型的进化之路》

目录 1. AdaBoost 的核心思想 2. AdaBoost 的关键步骤 步骤 1&#xff1a;初始化样本权重 步骤 2&#xff1a;迭代训练弱分类器 步骤 3&#xff1a;组合弱分类器 3. 用例子详解 AdaBoost 数据集&#xff1a; 迭代过程&#xff1a; 第1轮&#xff08;t1&#xff09;&am…

Android Settings 有线网设置界面优化

Android Settings 有线网设置界面优化 文章目录 Android Settings 有线网设置界面优化一、前言二、简单修改1、修改的EthernetSettings代码&#xff1a;2、有线网ip获取代码&#xff1a;3、AndroidManifest.xml定义有线网的Activity4、修改后界面&#xff1a; 三、其他1、有线网…

基于web的生产过程执行管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 随着世界经济信息化、全球化的到来和电子商务的飞速发展&#xff0c;推动了很多行业的改革。若想达到安全&#xff0c;快捷的目的&#xff0c;就需要拥有信息化的组织和管理模式&#xff0c;建立一套合理、畅通、高效的线上管理系统。当前的生产过程执行管理存在管理效率…

XSS 攻击风险与防御实践

✅ 框架与 XSS 防护概况 框架是否默认转义高危场景建议防御措施React✅ 是使用 dangerouslySetInnerHTML避免使用&#xff0c;必要时做内容清洗Vue.js✅ 是使用 v-html避免使用&#xff0c;或使用 DOMPurify 清洗Angular✅ 是使用 innerHTML、bypassSecurityTrustHtml谨慎绕过…

Cesium 时间线 及 坐标转换

文章目录 Cesium 基础理解&#xff08;二&#xff09;TimeLine & Clock 应用场景核心代码实例及解释代码解释 Cesium 之 实体动画构建实体动画的技巧1. 利用时间属性2. 组合动画效果3. 使用动画曲线 优化点1. 减少属性更新频率2. 优化实体数量3. 合理使用材质和纹理 注意事…

ngx_regex_init

定义在 src\core\ngx_regex.c void ngx_regex_init(void) { #if !(NGX_PCRE2)pcre_malloc ngx_regex_malloc;pcre_free ngx_regex_free; #endif } NGX_PCRE21 #if !(NGX_PCRE2) 就为假 条件不成立 ngx_regex_init 函数就成了空实现 NGX_PCRE2 被定义&#xff0c;则表示 Ngin…