初识 Redis - 分布式,内存数据存储,缓存

news2024/12/23 20:15:17

目录

1. 什么是 Redis

1.1 Redis 内存数据存储

1.2 Redis 用作数据库

1.3 Redis 用作缓存 (cache)

1.4 用作消息中间件


1. 什么是 Redis

The open source , in-memory data store used by millions of developers as a database, cache, streaming engine, and message broker.

开源的内存数据存储,被数百万开发人员用作数据库、缓存、流引擎和消息中间件

从官网得到这句话来看, Redis 它最核心的作用就是用来在内存中存储数据.

1.1 Redis 内存数据存储

【思考】这时候我们就会想, 定义变量不就是在内存中存储数据嘛, 为啥需要 redis 来存 ??

如果只是单机程序的话, 直接通过变量来存储数据的方式, 确实是更优的选择.  而 Redis 是在分布式系统中, 才能发挥出它的威力的. 而如果在分布式系统中使用变量在内存中存储数据, 那是玩不转的, 因为定义变量是在当前服务器进程的内部去存储的, 而进程之间有个东西叫 "隔离性", 也就是说进程 A 它没法直接读取进程 B 内存中的数据. 在这样的一个前提之下, 如果是一个分布式系统, 势必会涉及到多个进程, 甚至这多个进程是在不同的主机上, 那么此时, 你想直接访问其他进程内存里面的变量, 这件事情就变得困难起来了.

而 Redis 就是针对上述这样一个需求点做了一个封装, 既然我们没法直接突破进程之间进行访问, 那我们应该怎么办呢 ?

【进程间通信】

我们之前在学进程的时候, 进程里有个东西叫做进程间通信, 而进程间通信最主流的方法就是基于网络来实现, 它既可以让同一个主机之间的多个进程间通信, 它还可以跨主机, 跨不同的主机实现进程间通信.

Redis 就是基于网络, 把自己内存中的变量分享给别的进程, 甚至别的主机的进程来进行使用, 而这就是 Redis 最核心的部分.

1.2 Redis 用作数据库

谈到数据库, 我们就会自然而然的联想到 MySQL, MySQL 是目前主流的数据库之一, 它也可以在一个分布式系统中帮我们存储数据, 并且也能管理好数据; 但是MySQL它最大的问题在于, 访问速度 "比较慢"!!  有句话说的好 : "天下武功唯快不破", 尤其是现在很多互联网产品中, 对于性能要求是很高的. 

所以相比于 MySQL 来说, Redis 也可以作为数据库来使用, 它和 MySQL 相比, Redis的优点就是"快"!! 而且是快上万倍, MySQL 的数据是在硬盘中存储, 而 Redis 的数据是在内存中存储. (可以参照下表)

谷歌公司给出的各层级硬件执行速度 :

上表是从定性的角度可以知道 Redis 比 MySQL 快很多, 具体快多少, 是很难定量衡量的. 因为 MySQL 和 Redis 支持的功能上差异很大, 如果要定量衡量, 得在相同功能, 相同应用场景中, 进行控制变量法才可以衡量. 

那既然 Redis 那么快, 为啥还要使用 MySQL 呢 ??

Redis 和 MySQL 相比,, 最大的劣势就是 "小" !! 存储空间有限. 虽然有不少的互互联网产品对于性能的要求比较高, 但是大部分的互联网产品对于性能的要求还是没那么高的.

如果性能没那么高, 同时我们又希望存储更多的数据, 用更低的成本来存, 那么相较于 Redis,  MySQL 必然是首选, 而且 MySQL 相较于 Redis 提供了更多的功能, 提供了更加丰富的增删改查能力. 

所以在 "功能" 上和 "存储空间" 上来说, MySQL 还是更胜一筹的!!

1.3 Redis 用作缓存 (cache)

【思考】既然 MySQL 它大但是速度慢, Redis 小但速度快, 那有没有一种方式, 可以做到又大又快呢??

典型的方案就是把 Redis 和 MySQL 结合起来使用, 也就是把 Redis 作为 MySQL 的 cache, 让热点数据存储在 Redis 中, 让全量数据存储在 MySQL 中, 也就是我们平时所说的 "二八原则" : 20% 的热点数据能够满足 80% 的访问需求.

这样做确实可以实现, 但是有得必有失, 这样玩带来的代价就是 :

  • 系统的复杂程度大大提升了
  • 如果数据发生修改, 还涉及到 Redis 和 MySQL 之间的数据同步问题

1.4 用作消息中间件

Redis 的初心就是用来作为一个 "消息中间件(消息队列)", 主要是为了实现分布式系统下的生产者消费者模型.

虽然 Redis 最初是想用来作为消息中间件来使用, 但是呢, 它偏偏有心栽花花不放, 无心插柳柳成荫. 随着 Redis 的发展, 他们突然发现把这个 Redis 作为一个数据库, 或者作为一个缓存好像更香, 而拿 Redis 作为一个消息中间件这件事反而非常少, 而且业界又演化出了更多更专用的一些消息中间件, 所以 Redis 它很少会被作为一个消息中间件来使用.

【总结】

       对 Redis 有了简单的了解后, 谈到 Redis, 三句话离不开一个词 - "分布式", 如果抛开分布式式系统, 那么 Redis 是没有太大的优势的, 所以要想能够更好的理解 Redis, 就得去了解一下分布式系统了, 下一篇博客来简单聊聊分布式系统.

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

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

相关文章

使用 Elastic 时间序列数据流探索 Nginx 指标

作者:Lalit Satapathy Elasticsearch 最近发布了用于指标的时间序列数据流。 这不仅为 Elastic Observability 提供了更好的指标支持,而且还有助于降低存储成本。 我们在之前的博客中讨论过这个问题。 在本博客中,我们通过回顾什么是时间序列…

rar文件怎么打开?简单4步,轻松解决!

什么是rar文件? Rar文件是一种专用的文件格式,比较常用于归档打包和数据的压缩,我们可以将原有的文件数据压缩后保存为rar文件格式。其常用于将文件夹或者大型文件压缩为单个文件,以便更方便地传输和存储。 在日常的工作中&…

jmeter 终端命令执行jmx文件 生成jtl日志文件

终端命令执行jmx文件 生成jtl日志文件, 步骤如下: 步骤1:终端进入jmx文件目录 步骤2:执行命令:jmeter -n -t ****.jmx -l ****.jtl -n 以cli模式(命令行运行模式)运行jmeter -t 需要运行的…

怎么快速敲代码,最简单的代敲代码工具,codeWhisperer走起

题记:谁不想提升工作效率,谁不想有人帮你敲代码,来吧,上菜; 第一步:下载并安装AWS Toolkit(下载有点慢,请耐心等待); 第二步:点击start。 第三步…

【论文阅读笔记】Attack-Resistant Federated Learning with Residual-based Reweighting

个人阅读笔记,如有错误欢迎指出 Arxiv 2019 [1912.11464] Attack-Resistant Federated Learning with Residual-based Reweighting (arxiv.org) 问题: 联邦学习容易受到后门攻击 创新: 提出一种基于残差的重新加权聚合算法 聚合算法…

windows系统下jdk8和jdk17灵活切换

安装了jdk8和jdk17后环境变量path中会多出2条 C:\Program Files\Common Files\Oracle\Java\javapath C:\Program Files (x86)\Common Files\Oracle\Java\javapath 将它们下移到最下面,点击确认 这样做的原因是为了JAVA_HOME的优先级最高,达到更换JAVA…

分布式应用之监控Zabbix

分布式应用之监控Zabbix 一、什么是Zabbix? ●zabbix 是一个基于 Web 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。 ●zabbix 能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决存…

深入Vite核心编译能力

我们知道,Vite 在开发阶段实现了一个按需加载的服务器,每一个文件请求进来都会经历一系列的编译流程,然后 Vite 会将编译结果响应给浏览器。而在生产环境下,Vite 同样会执行一系列编译过程,将编译结果交给 Rollup 进行…

CP AUTOSAR中的CanTrcv

环境 CanTrcv驱动实际上是要实现CanIf指出的接口,包括5个API函数 CanTrcv_SetOpMode CanTrcv_GetOpMode CanTrcv_GetBusWuReason CanTrcv_SetWakeupMode CanTrcv_CheckWakeup CanIf接口会有对应的接口回调CanTrcv的API,包括5个A…

CODESYS 联合体变量(Union)

联合Union也是一种特殊的自定义类型这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体),联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的…

Drools用户手册翻译——第三章 构建,部署,应用和运行(三)运行

主要对于运行相关内容的介绍,又多了很多新的概念,还没有着手去尝试,感觉很多内容确实有用,等我把这一章结束时候,实际跑一跑代码感受一下。 甩锅声明:本人英语一般,翻译只是为了做个笔记&#…

在Vue种使用Vant框架

第一步:打开Vant框架地址 https://vant-contrib.gitee.io/vant/v2/#/zh-CN/home 第二步: 安装 第三步:引入(我这里使用的是按需导入) 执行命令: npm i babel-plugin-import -D ①:src下创建个…

pycharm 配置github

文章目录 环境必备操作步骤1.在pycharm中配置git和github2.获取ssh密钥3.将本地项目与github仓库连接4.同步本地项目到github 相关问题参考文章 环境必备 pycharm 2020.1:集成开发环境,需要安装并配置环境 PyCharm 开发环境搭建指南:安装、配…

【RISC-V】寄存器及 PCS(过程调用标准)

文章目录 寄存器与别名函数入栈示例代码作用为什么需要保存 函数出栈示例代码作用为什么需要恢复 浮点寄存器的保存示例代码作用 浮点寄存器的恢复示例代码作用 寄存器与别名 Caller(调用者)指的是调用(或执行)一个函数的代码段或…

Pandas 和 CSV文件读取导出小纪

要从CSV文件中访问数据,我们需要一个函数read_csv(),它以数据帧的形式检索数据。 read_csv() 语法: pd.read_csv(filepath_or_buffer, sep’ ,’ , header’infer’, index_colNone, usecolsNone, engineNone, skiprowsNone, nrowsNone) 参…

vue启动编译时报错:134(内存溢出)

项目环境:win7 vue2 webpack2 最近开发过程中项目莫名其妙就起不来了,报错大致如下: 经过一番搜索,尝试了多种方法都不行,比如: 1. npm install increase-memory-limit npm install cross-env 在package.json中添加…

首个!AI开发者创作激励计划开启,有成长、有收入

各种视频网站都有什么创作激励!那什么时候有专属于AI开发者的创作激励?好!那AI开发者的福利来了!!既能潜心进行模型开发,又能提升技术能力,还能领一份创作金!!飞桨AI Stu…

Codeforces Round 882 (Div. 2)(视频讲解A——D)

[TOC](Codeforces Round 882 (Div. 2)&#xff08;视频讲解A——D&#xff09;) 讲解在B站&#xff1a;Codeforces Round 882 (Div. 2)&#xff08;视频讲解A——D&#xff09; A The Man who became a God #include<bits/stdc.h> #define endl \n #define INF 0x3f3…

k8s 大量 pod 处于 ContainerStatusUnknown 状态

如图所示&#xff0c;nexus 正常运行&#xff0c;但产生了大量的状态不明的 pod&#xff0c;原因也无从所知 解决办法&#xff0c;删除多余的 pod&#xff0c;一个一个删除&#xff0c;非常费劲 获取 namespace 中状态为 ContainerStatusUnknown 的 pod&#xff0c;并删除 …