Redis - 为什么我要来安利你学习 Redis ?

news2024/11/24 12:42:30

目录

前言

一、Redis 的特性(优点)

1. Redis 是在内存中存储数据的

2.可编程性

3.可扩展性

4.持久化

5.支持集群

6.高可用

二、Redis 为什么快?

三、 Redis 使用场景

优势场景

1.将 Redis 当作数据库

2.作为缓存和存储 session 信息

3. 消息队列

劣势场景 

四、Redis不能做的事情?


前言


主要是,她是真的快啊!!!

Redis 是一个使用内存存储数据的中间件,一般作为 内存数据库、缓存、消息队列,接下来就具体带你了解一下她的特性以及使用场景,是真的香~

一、Redis 的特性(优点)


1. Redis 是在内存中存储数据的

 在内存中存储数据相比于在硬盘中存储数据最大的优点就是 “快” !

并且我们知道, MySQL 主要是通过 “表” 的方式来存储组织数据的 “关系型数据库”,而 Redis 主要是通过 “键值对” 的方式来存储组织数据的 “非关系型数据库”  ,Redis 这样处理数据带来的好处就是底层数据操作简单,访问和存储的速度快!

Redis 存储的 key 都是 string 类型,value 则可以是上图中描述的数据结构~

2.可编程性

如何理解可编程性呢?针对 Redis 的操作可以直接通过见到那的交互命令进行操作,也可以通过一些脚本的方式(比如说 lua "读作:撸啊" 这个编程语言来实现),批量执行一些操作(可以带有一些逻辑)。

3.可扩展性

可扩展性也就是说可以在 Redis 原有的功能基础上通过 C、C++、Rust 这些语言编写 Redis 扩展(本质上就是动态链接库,也就是 windows 上的 .dll ,可以让 .exe 去调用里面很多的代码,Linux 上的动态库是 .so 虽然和 .dll 格式不同,但本质是一样的),比如 Redis 自身已经提供了很多数据结构和命令,通过扩展让 Redis 支持更多的数据结构和更多的命令~

4.持久化

如果单纯的再内存中存储数据是很容易丢失的(进程退出/系统重启),因此 Redis 可以把数据存储字硬盘上(内存为主、硬盘为辅),硬盘相当于是对数据备份了一下,如果 Redis 重启了,就会再重启时加载硬盘中备份的数据,加载到内存中,使数据恢复如初~

5.支持集群

Redis 作为一个分布式系统中间件,能够支持集群式很关键的, 上图中提到的 Horizontal 就是它具有水平扩展能力,类似于 “分库分表”。

具体的,一个 Redis 能存储的数据是有限的(内存空间有限)引入多个主机,部署多个 Redis 结点,每个 Redis 存储数据的一部分。

6.高可用

Redis 是支持 “主从” 结构的,从节点相当于对主节点的备份,这样即使哪一个 Redis 主结点挂了也不至于整体瘫痪,可以将从节点提升为主节点,因而更快的修复~

二、Redis 为什么快?


  1. Redis 数据在内存中,就比访问硬盘的数据库要快很多.
  2. Redis 核心功能都是一些比较简单的逻辑,都是简单的操作内存中的数据结构.
  3. Redis 从网路角度上,使用了 IO 多路复用的方式(epoll),也就是使用一个线程管理多个 socket.
  4. Redis 使用的是单线程模型(更高的版本使用的多线程),这样的单线程模型,减少了不必要的线程之间竞争的开销(线程并不是越多越好,多线程提高效率的前提是,CPU 密集型任务,使用多个线程可以充分利用 CPU 多核资源,当你的 CPU 吃满了,再多的线程来了不但浪费,而且还会提高加锁竞争的概率,大大降低效率)。
  5. 网上还有一种说法是 Redis 是使用 C 语言开发,所以快。这点我个人不是很认可,因为 MySQL 也是同样也是 C 语言开发的,凭什么 Redis 就更快呢?

三、 Redis 使用场景


优势场景

1.将 Redis 当作数据库

虽然大多数情况下数据的存储有限考虑到是 “大”,但是仍然有些场景考虑的是 “快”,“快”的这些场景就需要使用 redis 作为数据库来进行存储了~

2.作为缓存和存储 session 信息

作为缓存,使用 “二八原则”,也就是说,使用 MySQL 用来存储全量数据,把热点数据提取出来存储在 redis 上,这样不仅充分利用了两者的优点,还使得 redis 一旦宕机数据丢失,还可以从 mysql 这边再加载回来.

作为 session 信息存储的仓库,是因为我们之前 session 信息是存储在应用服务器上的,而对于有多个应用服务器的分布式系统来说就存在一个问题,当用户再次发起登录请求时,负载均衡该去哪个应用服务器上寻找 session 信息?如下图:

解决办法有以下两种:

1.想办法让负载均衡器把同一个用户的请求始终打到同一个机器上(通过 userid 的方式来分配),但存在一个问题就是应用程序一旦重启,会话就会丢失.

2.把会话单独拎出来,放在一独立的机器 Redis 上来存储,即使应用程序重启了,会话也不丢失,如下图

3. 消息队列

基于这个就可以实现一个网络版的 生产者 消费者 模型~

对于分布式系统来说,服务器和服务器之间,有时也需要使用生产者和消费者模型,因为他是针对香,有以下两个优势:

  • 1.解耦合
  • 2.削峰填谷

但是业界也有很多知名中间件,提供了更强劲的消息队列: RabbitMQ、Kafka...... 那为什么还要使用 Redis 的消息队列呢?

如果当前场景中,对于消息队列的功能依赖不是很多,但又不想引入额外的依赖了, redis 可以作为一个选择~

劣势场景 

咱么说 redis 快,是相对于 mysql 这种关系型数据库的,但是相比较于在直接在内存中操作变量(例如创建一个变量并赋值)相比就要慢很多了,因为 redis 是先通过网络,再操作内存.

例如场景:存储用户访问量,点赞数量,那么是使用 redis 来存,还是直接在内存中创建一个 hashmap 来存呢?

对于上述场景,是否需要使用 redis 是要根据实际的需求来确定的:

  • 劣势:引入 redis 的缺点就是会更慢 .
  • 优势:1.有了 redis 之后,就可以把数据单独存储,后续应用服务器重启也不会影响到数据内容。2.未来要扩展成分布式系统,使用 redis 自然是更好的~

四、Redis不能做的事情?


存储大规模的数据~

实际的开发中,我们还是主要以 MySQL 为主(存储全量数据), Redis 为辅的(存储热点数据,例如 session 信息)~

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

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

相关文章

【数据分享】1929-2022年全球站点的逐日平均压力数据(Shp\Excel\12000个站点)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、能见度等指标,说到气象数据,最详细的气象数据是具体到气象监测站点的数据! 对于具体到监测站点的气象数据,之前我们分享过1929-2022年全球气象…

【LeetCode每日一题合集】2023.7.10-2023.7.16(dfs 换根DP)

文章目录 16. 最接近的三数之和排序 双指针 1911. 最大子序列交替和解法——动态规划 2544. 交替数字和(简单模拟)931. 下降路径最小和(线性DP)979. 在二叉树中分配硬币⭐⭐⭐⭐⭐(dfs)算法分析补充&#…

PWM呼吸灯+流水灯设计

完成任务: 在流水灯基础上加入pwm呼吸灯设计,关于pwm呼吸灯设计可以看博主上一篇博客PWM呼吸灯设计 ,开发板上灯每两秒进行一次切换,每一个的亮灭间隔为一秒。 代码参考: module pwm_led_change(input wire …

软件测试人员和程序开发人员是死对头吗?

这两天闲来无事刷知乎,看到有些朋友问到关于测试与开发的关系,在这里想和大家稍微来聊一聊这个事儿。 有的人说呢,测试和开发是死对头;也有人说测试和开发是处在对立面的;还有人说测试与开发两者都不能互相理解。当然&…

再战算法-奋进

再战算法-奋进 算法入门痛苦经历总结收获 算法入门 在大学期间我直至觉得【算法】是很重要的一项,最开始接触的是c语言,算是第一门接触的,给了我很大的惊喜🥰,大二下的时候开始接触到Java语言,通过Java的入…

【C++进阶】C++11基础

文章目录 一、C11简介二、统一的列表初始化1. {}初始化2、std::initializer_list 三、 声明1.auto2. decltype3.nullptr 三、范围for 一、C11简介 在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1),使得C03这个名字已经取代了C98称为C…

Python3实现画小提琴图(包含分组)

说在前面 Python如何画一个小提琴图呢?先看下必备的数据集合(自己构建,样式参考) 默认必有X列、Y列(数值),画分组需要包含分组的列group等数据参数准备 可以参考下面的数据样例: 除此之外,对于画图使用的参数,提前准备的知识如下: sns.violinplot所必备的参数…

数据结构-堆排序代码实现(详解)

内容:堆排序的代码实现及注解,思路详解 代码实现: 交换函数: void Swap(int* p1, int* p2) {int tmp *p1;*p1 *p2;*p2 tmp; } 堆排序函数: 1 向下调整建堆函数:这里建立大堆,小堆思路也…

Litedram仿真验证(三):AXI接口完成仿真(FPGA/Modelsim)

日常唠嗑 不知不觉,从开始接触Litedram已经过去了4个月,期间断断续续做了好多其他任务,导致进度比较慢,直到前天才把Litedram完全仿真起来。(坑很多,很多东西需要注意) 目录 日常唠嗑一、AXI用…

C—数据的储存(下)

文章目录 前言🌟一、练习一下🌏1.例一🌏2.例二🌏3.例三🌏4.例四 🌟二、浮点型在内存中的储存🌏1.浮点数🌏2.浮点数存储💫(1).二进制浮点数&#x…

快速入门java微服务架构SpringBoot之一

Springboot概念: Springboot提供了一种快速使用Springboot的方式,基于约定优于配置的思想。 可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编辑中,从而大大提高了开发的效率,…

matlab主成分分析算法在人脸识别的具体应用

主成分析(Principal Component Analysis,简称PCA)是一种常用的降维算法,可以将高维数据转化为低维数据,同时保留原始数据的最重要特征。PCA算法在人脸识别中有广泛的应用,可以提取人脸图像中的主要特征&…

《啊哈算法》第二章--队列 栈 链表

文章目录 前言一、数据结构基础知识(衔接知识)二、队列三、栈四、链表总结 前言 上一节我们学习了排序算法当中的快速排序 冒泡排序 桶排序 ,那么本节得主要学习内容是队列 栈 链表得相关数据结构得知识 一、数据结构基础知识(衔接知识) 基于学习这本书得都是一些…

《英雄联盟》丢失d3dcompiler_47.dll怎么办,推荐这个修复方案

不知道大家有么有遇到过,在打开《英雄联盟》的时候,计算机提示丢失d3dcompiler_47.dll,无法继续执行此代码。d3dcompiler_47.dll是一个动态链接库文件,它是与Direct3D编译器相关的组件之一。像是photoshop等软件,英雄联…

IEEE754 标准是如何制定浮点数的存储的

1. IEEE754 标准简介 IEEE754 标准是一种用于浮点数表示和运算的标准,由国际电工委员会(IEEE)制定。它定义了浮点数的编码格式、舍入规则以及基本的算术运算规则,旨在提供一种可移植性和一致性的方式来表示和处理浮点数 IEEE754 …

c#使用ThreadPool

说到ThreadPool,都知道是线程池。在c#中,有很多方式可以实现线程。从时间上来排序,大概是这样的,Thread,backgroundworker,ThreadPool,Parallel,Task。其中后面2种是最新的&#xff…

第十八章:Auto-DeepLab:用于语义图像分割的层次化神经架构搜索

0.摘要 最近,神经架构搜索(NAS)已经成功地识别出在大规模图像分类任务上超越人工设计的神经网络架构。在本文中,我们研究了NAS在语义图像分割任务中的应用。现有的工作通常集中在搜索可重复的基本单元结构,而手动设计控…

一些有趣的Git学习资料

Git 可以说是程序员必备的技能之一了,基于 Github/Gitlab 以及相关工作流的使用,Git 已经融入到了我们的日常工作中,这里分享一些有趣的 Git 学习资料,希望可以帮助大家更好的理解 Git。 1. Welcome to Learn Git Branching 以动…

第二周笔记

public class Calc { //加法, 把和作为一个结果返回出去, 返回给调用者 public int add3(int num1, int num2){ if(num1 0 && num2 0){ return 0; //隐式包含一个if-else结构 } //使用return 关键字 return nu…

【Linux操作系统】多线程抢票逻辑——学习互斥量(锁)函数接口

文章目录 1.进程线程间的互斥相关背景概念2.联系代码学习同步互斥问题3.互斥量(锁)的函数接口3.1初始化互斥量3.2销毁互斥量3.3互斥量加锁和解锁3.4改进多线程抢票代码 1.进程线程间的互斥相关背景概念 临界资源:多线程执行流共享的资源就叫…