Redis:功能特性和应用场景

article/2025/6/18 18:39:21

🌈 个人主页:Zfox_
🔥 系列专栏:Redis

本篇开始对于 Redis 进行正式介绍和学习

🔥 认识 Redis

在开始 Redis 学习前,要先认识一下 Redis

Redis 的设计,是想要把它当做是一个数据库,一个缓存,或者说是一个消息中间件等,它的主要目的是可以在内存当中进行数据的存储

那么现在问题是,对于数据库来说,应该已经有 MySQL 这样的内容,那为什么还需要有 Redis 来作为一个数据库呢?

🦋 Redis 和 MySQL

不可否认,MySQL 确实是一个很不错的数据库软件,但是它最大的问题在于,它的访问速度比较慢,这个慢是相较于在内存当中的,因为 MySQL 本质上是存储在磁盘上的,而如果使用 Redis 作为数据库,必然会比在磁盘上要快很多,因为这是在内存当中的

但是 Redis 就一定比 MySQL 要强吗?这必然也不是的,Redis 和 MySQL 比起来最大的劣势在于,它的存储空间是有限的,这是一个很严重的问题,这就意味着,虽然有很多需要用到高性能的地方,但是终究是少数,大多数的业务其实都不需要用到特别高的性能

那么有什么特别好的方案呢?可以中和一下 Redis 和 MySQL 的优点,并且还能有一个比较好的解决方案?那就是把 Redis 和 MySQL 结合起来进行使用,也就是我们平时所说的二八原则

🦋 二八原则

所谓二八原则,说的是 20% 的热点数据可以满足 80% 数据的要求,所以一个比较好的解决方案是,如果能够把 MySQL 当中比较常用的数据缓存到 Redis 当中,这样就能对于大多数的请求都能得到数据,而对于不常用的数据再到对应的磁盘去读取,这就是一个比较不错的解决方案

🦋 Redis 的场景

Redis 是工作在分布式系统中的,它在这个环境中才能发挥出它应有的实力,如果只是单纯的单机程序,那么本质上来说如果使用变量来进行数据的存储其实是一个比较不错的解决方式,此时其实是比使用 Redis 更加优秀的选择

我们在学习操作系统的时候知道,在进行进程的通信时,不能直接进行数据的访问,这是因为进程和进程之间是可以进行数据的隔离的,数据要被进程进行隔离的,而有一种进程通信是借助网络进行通信,所以 Redis 本质上来说就可以把自己内存中的变量给其他的进程,甚至可以直接用其他主机的进程来进行数据的访问,这样就解决了刚才所说的场景,这也是 Redis 的一个使用场景

🦋 Redis 的设计

Redis 设计的初心,是打算把它当做一个消息中间件来进行处理的,也就是所谓的消息队列,这样就可以在分布式系统下使用一个生产者消费者的模型,但是遗憾的是,现在很少有这样的使用场景,反而是有更加专业的消息中间件来取代 Redis 的功能,不过 Redis 依旧是被使用十分广泛的中间件

🔥 Redis 的特性和优点

Redis 是一个内存中存储数据的中间件,所以下面开始就进行分析,Redis 作为一个数据库,作为数据缓存,是如何在分布式系统中进行工作的?它的能力是什么?

🦋 在内存中存储数据

MySQL 中主要是通过表的方式来进行存储组织数据的,这种也叫做是一种关系型数据库,而在 Redis 中,则更多的是使用一种 键值对 的方式来进行数据的组织和存储,这种叫做是非关系型数据库,而内存的数据存储

🦋 编程能力

针对于 Redis 的操作,可以通过一些简单的交互式的命令来进行操作,也可以通过一些脚本的方式,批量化的执行一些操作,或者是带有逻辑,更重要的是,可以使用一个 Lua 的脚本语言,来进行编写

🦋 扩展能力

Redis 还提供了一组原生的API,借助这个API就可以使得在原有的基础上进行扩展,例如可以使用C、C++或者是 Rust 来进行编写扩展,本质上来说就是一个动态链接库

🦋 持久化

Redis 的数据是存储在内存中的,但是内存是有弊端的,比如它的内容是很容易被丢失的,当进程退出或者是系统重启的时候,就会把信息进行丢失,那为了解决这样的问题,所以 Redis 还会把数据再硬盘上进行存储一次,内存为主,硬盘为辅,那么硬盘中的数据其实就是相当于对于 Redis 的内存数据进行了一个备份,那么当 Redis 重启的时候,就会在加载硬盘中进行备份数据的加载,就会让 Redis 的内存恢复到原来重启前的状态

🦋 支持集群

Redis 作为是一个分布式系统的中间件,它的另外一个能力是可以支持集群,这是一个相当重要的能力,这代表的是可以进行水平扩展,换句话说就是支持分表和分库这样的类似操作

本质上来说,这是因为 Redis 能够存储的数据是有限的,这就意味着如果有太多的数据是不能放在一个 Redis 当中的,因此就有了集群的概念,可以引入多个主机,部署多个 Redis 节点,每个 Redis 的节点来存储数据的一部分

🦋 高可用

Redis 自身也是支持主从结构的,从属节点就相当于是对于主节点的备份那这就意味着当主节点出现问题的时候,可以直接让从属节点对于主节点进行替换,这样就可以满足主节点的要求,而不会导致程序出错

🦋 快

下面说的是 Redis 的最大的特点,那就是 Redis 很快

为什么快?

  1. Redis 的数据是存储在内存当中的,就好比访问磁盘的数据库,当然要快很多
  2. Redis 的核心功能都比较简单,都是隶属于是一些比较基础的项目逻辑,一些核心功能都是存储在一些操作内存的数据结构,那这就意味着不需要和 MySQL 一样调用复杂的接口和进行条件判断
  3. 从网络的角度来讲,Redis 使用的是IO多路复用的方式,这点也不再多说,多路复用必然是可以提高效率的
  4. Redis 的线程模型来说,它本身是一个单线程的模型,虽然在高版本的 Redis 当中确实引入了多线程的操作,但是不管怎么说,单线程的模型也可以减少线程之间不必要的竞争开销
  5. Redis 是使用 C语言 进行开发的,虽然这个理由并不太好,但也勉强算是它快的理由吧

🔥 Redis 的应用场景

下面说说 Redis 的一些场景

🦋 Redis 作为数据库

在大多数情况下,考虑到数据存储,优先考虑的是容量,但是在一些极端的场景下,也不排除需要比较快的场景

例如在一些搜索引擎的项目当中,对于搜索的性能要求是非常高的,那么此时从数据库中进行读取的效率就不高,所以在搜素引擎中是不可以使用 MySQL 这样的内容的,因此就需要把这些要进行检索的数据都存储在内存当中,这样就可以使用类似于 Redis 这样的内存级别的数据库来帮助完成

当然这样的数据库就需要硬件资源的支持了

Redis 当中存储的是全量数据,这里的数据是不可以进丢弃的

🦋 Redis 作为缓存

使用 MySQL 进行存储数据,优点是内存大,但是缺点是很慢,由于二八原则的存在,所以我们可以把热点数据从 MySQL 中拿出来,存储在 Redis 中,而 Redis 就提供了这样缓存的功能,Redis 中存储的是部分的数据,全量数据还是以 MySQL 为主,哪怕 Redis 的数据丢掉了,也还可以从 MySQL 中存储出来,这和上面的 Redis 作为数据库是不一样的,这个数据库是一种对于 MySQL 这样的硬盘级别的数据库的内容的一种备份

🦋 Redis 作为会话存储对象

在 HTTP 的学习中,知道了 HTTP 是一个无状态的协议,因此引入的解决方案是使用了一个 cookie来进行解决,cookie 可以实现用户身份信息的保存,这也就可以保证在浏览器的这一段存储了一个用户的身份标识,而在服务器端是存储的是用户的数据,在服务器端也叫做是 session

那这意味着什么?假设现在有一个浏览器想要进行登录操作,而在服务端是采用的是负载均衡的模式,那么在负载均衡器要分配到各个应用服务器,那么服务器怎么进行 cookie 的识别呢?

下面提供两种解决的方式

  1. 想办法让负载均衡器,把同一个用户的请求始终放到一个机器上,比如可以使用 ID 进行取模的方式来解决,进行机器的分配
  2. 把会话的数据单独拿出来,放到一个或者一组独立的机器上进行存储,这个其实就是 Redis ,那这也就意味着,当应用程序重启的时候会话不会丢失

🦋 Redis 作为消息队列

Redis 作为消息队列的场景其实不多,因为 Redis 的初心虽然是设计为一个消息队列,来支持一个生产者和消费者的模型,但是事实上,它并没有被广泛的使用,因此 Redis 作为消息队列的这场景在实际的应用场景中并不多

🦋 总结

Redis 其实就是一个使用内存进行存储数据的中间件,一般可以作为有内存级别的数据库,缓存信息,或者是消息队列来进行使用,更主要的是,Redis 很快

🔥 共勉

😋 以上就是我对 Redis:功能特性和应用场景 的理解, 觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~ 😉
在这里插入图片描述


http://www.hkcw.cn/article/YJpRtFQdFa.shtml

相关文章

etcd详解

一、核心特性二、架构原理三、应用场景四、运维实践五、常见问题与解决方案六、与 ZooKeeper 和 Consul 的对比总结 etcd 是一个高可用的分布式键值存储系统,广泛应用于云原生领域,尤其作为 Kubernetes 的核心组件,用于存储集群的配置、状态和…

CTFHub-RCE 命令注入-综合练习

观察源代码 代码里面可以发现过滤了运算符、目录分隔符、分号、空格还有一些关键字也被过滤了 判断是Windows还是Linux 源代码中有 ping -c 4 说明是Linux 查看有哪些文件 用换行符的url值(%0a)代替分号注意:在url中输入 ?ip127.0.0.1%0a#…

网络编程1_网络编程引入

为什么需要网络编程? 用户再在浏览器中,打开在线视频资源等等,实质上说通过网络,获取到从网络上传输过来的一个资源。 与打开本地的文件类似,只是这个文件的来源是网络。相比本地资源来说,网络提供了更为…

性能优化 - 理论篇:性能优化的七类技术手段

文章目录 Pre引言性能优化的七类技术手段性能优化策略一览表1. 复用优化2. 计算优化2.1 并行执行2.2 变同步为异步2.3 惰性加载 3. 结果集优化3.1 数据格式与协议选择3.2 字段精简与按需返回3.3 批量处理与分页3.4 索引与位图加速 4. 资源冲突优化4.1 锁的分类与特点4.2 无锁与…

Android之ListView

1:简单列表(ArrayAdapter) 1:运行的结果: 2:首先在MyListView里面创建一个按钮,点击的时候进行跳转。 这里让我吃惊的是,Button里面可以直接设置onClick .java里面的方法。 也即是点击这个按钮之后就会去…

Unity程序集

对于Unity的程序集,具体内容可以参考Unity官方文档,程序集定义 - 预定义程序集 比如Unity的默认程序集,Assembly-CSharp.dll,还有其他的比如 Assembly-CSharp-Editor.dll,Assembly-CSharp-firstpass.dll 没有指定或…

【算法】递归与分治策略

一、算法整体思想 一般情况下,问题的规模越大,解题所需的计算时间越长,并且解题的难度可能会变得很大。 问题的规模越小,解题所需的计算时间往往越短,也比较容易处理。 当直接解决一个较大的问题时,有时是…

NVIDIA Mellanox BlueField-2 DPU(Data Processing Unit)智能网卡的调试和使用

专有名词 OOB: BMC: BFB: EMMC: 关键词解释eMMCEmbedded Multi-Media Card——把 NAND 闪存颗粒与控制器封装在一起的板载存储件,类似手机里的“内置储存” .deb:文件是​​Debian软件包格式​​的专…

(LeetCode 每日一题) 909. 蛇梯棋 (广度优先搜索bfs)

题目&#xff1a;909. 蛇梯棋 思路&#xff1a;广度优先搜索bfs队列&#xff0c;时间复杂度0(6*n^2)。 细节看注释 C版本&#xff1a; class Solution { public:int snakesAndLadders(vector<vector<int>>& board) {int nboard.size();// vis[i]&#xff1a;…

医疗多模态共情推理与学习一体化网络构成初探

1 引言:多模态共情推理的概念内涵与技术背景 在当今医疗人工智能领域,多模态共情推理正逐步成为突破临床决策支持系统瓶颈的关键范式。这一技术通过融合认知共情与情感共情的双重机制,模拟人类医生的综合诊断思维过程,实现对患者全方位健康状态的深度理解。医疗环境中的共…

RFID技术深度剖析:从原理、协议到S50卡与FM17550读写

知识点1【RFID的概述】 学习目标是学习对这个卡片的读写 用已有的手册实现对卡片内数据的读写操作 RFID&#xff1a;&#xff08;Radio Frequency Identification&#xff09;无线射频识别 通过无线识别目标&#xff0c;并读写相关数据&#xff0c;而无需接触 位于感知层&…

4-香豆酸:CoA连接酶晶体-文献精读138

Crystal structures of a Populus tomentosa 4-coumarate:CoA ligase shed light on its enzymatic mechanisms 杨树&#xff08;Populus tomentosa&#xff09;4-香豆酸&#xff1a;CoA连接酶的晶体结构揭示了其酶促机制 摘要 4-香豆酸&#xff1a;CoA连接酶&#xff08;4CL…

VTK|实现类似CloundCompare的测量功能

文章目录 CloundCompare在点、线、面三种模式下的显示内容✅ 图1&#xff1a;点模式✅ 图2&#xff1a;线模式✅ 图3&#xff1a;面模式 增加控制菜单栏实现测量功能类如何调用项目git链接 CloundCompare在点、线、面三种模式下的显示内容 点 线 面 三张图展示了 CloudComp…

Android15 userdebug版本不能remount

背景描述&#xff1a; 最近调试Android Vendor Hal的时候发现一个奇怪的现象: android userdebug版本刷到设备中&#xff0c;执行adb root没提示错误&#xff0c;但是没有获取到root权限。 Android设备运行的系统版本有三种情况&#xff1a;user版本、userdebug版本和eng版本…

伊朗外长:将适当回应美方核谈判提案

△伊朗外交部长阿拉格齐(资料图)当地时间5月31日,伊朗外交部长阿拉格齐在社交平台表示,当天阿曼外交大臣巴德尔访问伊朗并向其介绍了美方有关核谈判的提案。阿拉格齐表示,伊朗将根据原则、国家利益和伊朗人民的权利对此作出适当的回应。白宫新闻秘书莱维特当地时间31日表示…

27 C 语言编程核心:main 主函数(基本形式、返回值、参数、命令行传参)、多文件编程实践

1 main 主函数 1.1 主函数的作用 在 C 语言中&#xff0c;main 主函数是程序的入口函数&#xff0c;所有 C 程序必须包含一个名为 main 的函数。程序总是从该函数开始执行&#xff0c;没有它程序就无法启动。 主函数可以调用其他函数。其他函数不能调用主函数。主函数不能调用…

GIS常见数据及主要应用综述:类型解析、应用案例与未来趋势全景解读

&#x1f30f; GIS常见数据及主要应用综述&#xff1a;类型解析、应用案例与未来趋势全景解读 地理信息系统&#xff08;GIS&#xff09;是支撑空间决策、资源管理、城市治理的重要技术体系。本文从常见数据类型入手&#xff0c;结合中国及国际资源&#xff0c;梳理典型GIS应用…

系统性学习C语言-第十二讲-深入理解指针(2)

系统性学习C语言-第十二讲-深入理解指针&#xff08;2&#xff09; 1. const 修饰指针1.1 const 修饰变量1.2 const 修饰指针变量 2. 野指针2.1 野指针成因2.2 如何规避野指针2.2.1 指针初始化2.2.2 小心指针越界2.2.3 指针变量不再使用时&#xff0c;及时置 NULL &…

Linux安装redis

Linux redis路径 https://download.redis.io/releases/解压安装Redis 解压 tar -zvxf redis-6.0.5.tar.gz 由于redis是c语言编写的&#xff0c;所以我们需要先安装gcc&#xff0c;安装的命令如下&#xff1a; yum install gcc-c安装 输入命令&#xff1a; make PREFIX/usr/…

NumPy 数组计算:广播机制

文章目录 NumPy 数组计算&#xff1a;广播机制一、广播机制简介二、广播机制的规则1. 广播机制示例 12. 广播机制示例 23. 广播机制示例 3 三、广播机制实战1. 数组的中心化2. 绘制二维函数 NumPy 数组计算&#xff1a;广播机制 我们在NumPy数组的计算&#xff1a;通用函数中看…