当前位置: 首页 > news >正文

Redis背景介绍

在这里插入图片描述

⭐️前言⭐️
本文主要做Redis相关背景介绍,包括核心能力、重要特性和使用场景。

🍉欢迎点赞 👍 收藏留言评论

🍉博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言

🍉博客中涉及源码及博主日常练习代码均已上传GitHub


请添加图片描述

📍内容导读📍

  • 🍅背景介绍
    • 🍅1.核心能力
    • 🍅2.重要特性
    • 🍅3.使用场景

🍅背景介绍

Redis是一个在内存中存储数据的中间件,它在分布式系统中能够大展拳脚。

以下是Redis官网中对于Redis的介绍:

img

in-memory data store:

内存中存储数据;Redis就是基于网络,把自己内存中的变量给别的进程,甚至别的主机的进程进行使用。

cache:

缓存;20%的热点数据,能满足80%的访问需求;在业界中Redis经常作为缓存来使用。

database:

数据库;Redis也可以作为数据库来使用,而且速度相较于MySQL而言会快很多;但是和MySQL相比最大的劣势是存储空间是有限的

streaming engine/message broker:

流式引擎(消息队列);这个也是Redis的初心,最初就是用来作为一个“消息中间件”的(消息队列)

消息队列其实就是分布式系统下的生产者消费者模型,当前很少会直接使用Redis作为消息中间件,因为业界有更多更专业的消息中间件。

🍅1.核心能力

img

In-memory data structures——内存中的数据结构

MySQL是“关系型数据库”,主要是通过“表”的方式来存储组织数据的;

而Redis是“非关系型数据库”,主要是通过“键值对”的方式来存储组织数据的,key都是string,value则可以是一些数据结构。

Programmability——可编程性

针对Redis的操作,可以直接通过简单的交互式命令进行操作,也可以通过一些脚本的方式,批量执行一些操作(可以带有一些逻辑)

Extensibility——扩展性

可以在Redis原有的功能基础上再进行扩展,Redis自身已经提供了很多的数据结构和命令,通过扩展,可以让Redis支持更多的数据结构,以及支持更多的命令(本质上就是一个动态链接库)

Persistence——持久化

Redis是把数据存储在内存上的,内存的数据是“易失”的,进程退出/系统重启都有可能导致数据丢失,为了解决这个问题,Redis会把数据存储在硬盘上,内存为主,硬盘为辅

硬盘相当于对内存的数据备份了一下,如果Redis重启了,就会在重启时加载硬盘中的备份数据,使Redis的内存恢复到重启前的状态

Clustering——集群

Redis作为一个分布式系统中的中间件,能够支持集群是很关键的;

支持水平扩展,类似于“分库分表”

一个Redis能存储的数据是有限的(内存空间有限),如果想存的更多,就需要引入多个主机,部署多个Redis节点,每个Redis存储数据的一部分,构成一个集群。

High availability——高可用

高可用-》冗余/备份,Redis自身是支持“主从结构”的,从节点就相当于主节点的备份了,一个节点挂了,就由另一个节点顶上去,这样就实现了高可用

🍅2.重要特性

天下武功唯快不过,Redis最重要的特性是,为什么快呢,有以下几个原因:

1、Redis的数据存储在内存中,就比访问硬盘的数据库,要快很多

2、Redis的核心功能都是都是比较简单的逻辑,核心功能都是比较简单的操作内存的数据结构

3、从网络角度上,Redis使用了IO多路复用的方式(使用一个线程,管理很多个socket)

4、Redis使用的是单线程模型,减少了不必要的线程之间的竞争开销

多线程提高效率的前提是CPU密集型的任务,使用多个线程可以充分利用CPU多核资源,但是Redis的核心任务,主要就是操作内存的数据结构,用不到多核CPU,如果非要使用多线程,还会产生一些列不必要的锁开销。

5、Redis是使用C语言开发的

网上这么说,但是个人不认可,因为MySQL也是C语言开发的,还是前四个理由更具说服力


我们谈到的Redis的快,是相对于MySQL这样的关系型数据库而言的,但是如果是直接和内存中的操作变量相比,就没有优势了,甚至更慢了;

现在有这样一个场景,假设有一个单机系统(短视频系统),里面只有一个应用服务器,这个应用服务器里需要存储一些数据,比如存储一下视频的用户点赞数,就需要以视频ID:点赞个数这样的键值对格式来存储,那么使用一个Redis来存,还是直接在内存中存储呢?

如果使用HashMap是直接操作内存,但如果使用Redis是先通过网络,再操作内存的;

所以我们是否要使用Redis,要结合实际的需求来确定,如果引入Redis,因为网络通信的开销很大,所以会更慢,但是有了Redis之后,就可以把数据单独存储,后续应用服务器重启,不会影响到数据内容,而且如果未来要扩展成分布式系统,使用Redis是更佳的。

🍅3.使用场景

img

Real-time data store——实时存储数据

这里就是把Redis作为数据库来使用,以键值对的形式来存储数据;

大多数情况下,考虑到数据存储,优先考虑的是“大”,但是仍然有一些场景,考虑的是“快”,比如像搜索引擎这样的场景,对于性能的要求是非常高的,这时候就不能用MySQL这样的数据库了,而是需要使用类似于Redis这样的内存数据库来完成,把所有需要检索的数据都存储在内存中。

Caching&session storage——缓存和会话存储

Caching:业界经常将MySQL和Redis结合来使用,全量数据存储在MySQL中,根据二八原则把热点数据拎出来,存储在Redis中,哪怕Redis的数据没了,还可以从MySQL这边再加载回来

session storage:浏览器中的cookie实现用户身份信息的保存,需要session来配合,cookie只是在浏览器这边存储了一个用户的身份标识session ID,服务器这里才真正存储了用户数据,session是存储在应用服务器上的;

如果在分布式系统中通过负载均衡将请求打到服务器上,就有可能导致同一个用户的多次请求,打到了不同的服务器上,而出现需要重新登录多次的情况;

为了解决上述问题,有以下两种解决方法:

1、想办法让负载均衡器,把同一个用户的请求始终打在同一个机器上,不能再轮询了,而是要通过user ID取余计算之类的方式来分配机器

2、把会话数据单独拎出来,放到一组独立的机器上存储(Redis),这样即使应用程序重启了,会话也不会丢失【具体实现见下图】

img

Streaming&mesaging——消息队列

消息队列(服务器)就是网络版本的生产者消费者模型,它的优势有解耦合削峰填谷;

Redis的初心是作为消息队列的,但是真正用Redis作消息队列的并不多,业界也有很多知名的消息队列,比如RabbitMQ,Kafka,RocketMQ


⭐️最后的话⭐️
总结不易,希望uu们不要吝啬你们的👍哟(^U^)ノ~YO!!如有问题,欢迎评论区批评指正😁

请添加图片描述

相关文章:

Redis背景介绍

⭐️前言⭐️ 本文主要做Redis相关背景介绍,包括核心能力、重要特性和使用场景。 🍉欢迎点赞 👍 收藏 ⭐留言评论 🍉博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言 🍉博客中涉及源码及博主…...

PPT演示设置:插入音频同步切换播放时长计算

PPT中插入音频&同步切换&放时长计算 一、 插入音频及音频设置二、设置页面切换和音频同步三、播放时长计算 一、 插入音频及音频设置 1.插入音频:点击菜单栏插入-音频-选择PC上的音频(已存在的音频)或者录制音频(现场录制…...

DIFY源码解析

偶然发现Github上某位大佬开源的DIFY源码注释和解析,目前还处于陆续不断更新地更新过程中,为大佬的专业和开源贡献精神点赞。先收藏链接,后续慢慢学习。 相关链接如下: DIFY源码解析...

[权限提升] Wdinwos 提权 维持 — 系统错误配置提权 - Trusted Service Paths 提权

关注这个专栏的其他相关笔记:[内网安全] 内网渗透 - 学习手册-CSDN博客 0x01:Trusted Service Paths 提权原理 Windows 的服务通常都是以 System 权限运行的,所以系统在解析服务的可执行文件路径中的空格的时候也会以 System 权限进行解析&a…...

【算法】回溯算法专题② ——组合型回溯 + 剪枝 python

目录 前置知识进入正题小试牛刀实战演练总结 前置知识 【算法】回溯算法专题① ——子集型回溯 python 进入正题 组合https://leetcode.cn/problems/combinations/submissions/596357179/ 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以…...

LeetCode:121.买卖股票的最佳时机1

跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:121.买卖股票的最佳时机1 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票…...

pytorch生成对抗网络

人工智能例子汇总:AI常见的算法和例子-CSDN博客 生成对抗网络(GAN,Generative Adversarial Network)是一种深度学习模型,由两个神经网络组成:生成器(Generator)和判别器&#xff0…...

Visual Studio Code应用本地部署的deepseek

1.打开Visual Studio Code,在插件中搜索continue,安装插件。 2.添加新的大语言模型,我们选择ollama. 3.直接点connect,会链接本地下载好的deepseek模型。 参看上篇文章:deepseek本地部署-CSDN博客 4.输入需求生成可用…...

用 HTML、CSS 和 JavaScript 实现抽奖转盘效果

顺序抽奖 前言 这段代码实现了一个简单的抽奖转盘效果。页面上有一个九宫格布局的抽奖区域,周围八个格子分别放置了不同的奖品名称,中间是一个 “开始抽奖” 的按钮。点击按钮后,抽奖区域的格子会快速滚动,颜色不断变化&#xf…...

Skewer v0.2.2安装与使用-生信工具43

01 Skewer 介绍 Skewer(来自于 SourceForge)实现了一种基于位掩码的 k-差异匹配算法,专门用于接头修剪,特别设计用于处理下一代测序(NGS)双端序列。 fastp安装及使用-fastp v0.23.4(bioinfoma…...

C语言:链表排序与插入的实现

好的!以下是一篇关于这段代码的博客文章: 从零开始:链表排序与插入的实现 在数据结构的学习中,链表是一种非常基础且重要的数据结构。今天,我们将通过一个简单的 C 语言程序,来探讨如何实现一个从小到大排序的链表,并在其中插入一个新的节点。这个过程不仅涉及链表的基…...

【Elasticsearch】doc_values 可以用于查询操作

确实,doc values 可以用于查询操作,尽管它们的主要用途是支持排序、聚合和脚本中的字段访问。在某些情况下,Elasticsearch 也会利用 doc values 来执行特定类型的查询。以下是关于 doc values 在查询操作中的使用及其影响的详细解释&#xff…...

深度学习深度解析:从基础到前沿

引言 深度学习作为人工智能的一个重要分支,通过模拟人脑的神经网络结构来进行数据分析和模式识别。它在图像识别、自然语言处理、语音识别等领域取得了显著成果。本文将深入探讨深度学习的基础知识、主要模型架构以及当前的研究热点和发展趋势。 基础概念与数学原理…...

JVM的GC详解

获取GC日志方式大抵有两种 第一种就是设定JVM参数在程序启动时查看,具体的命令参数为: -XX:PrintGCDetails # 打印GC日志 -XX:PrintGCTimeStamps # 打印每一次触发GC时发生的时间第二种则是在服务器上监控:使用jstat查看,如下所示,命令格式为jstat -gc…...

【开源免费】基于Vue和SpringBoot的校园网上店铺系统(附论文)

本文项目编号 T 187 ,文末自助获取源码 \color{red}{T187,文末自助获取源码} T187,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...

测压表压力表计量表针头针尾检测数据集VOC+YOLO格式4862张4类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):4862 标注数量(xml文件个数):4862 标注数量(txt文件个数):4862 …...

Vue 3 30天精进之旅:Day 12 - 异步操作

在现代前端开发中,异步操作是一个非常常见的需求,例如从后端API获取数据、进行文件上传等任务。Vue 3 结合组合式API和Vuex可以方便地处理这些异步操作。今天我们将重点学习如何在Vue应用中进行异步操作,包括以下几个主题: 异步操…...

【网络】3.HTTP(讲解HTTP协议和写HTTP服务)

目录 1 认识URL1.1 URI的格式 2 HTTP协议2.1 请求报文2.2 响应报文 3 模拟HTTP3.1 Socket.hpp3.2 HttpServer.hpp3.2.1 start()3.2.2 ThreadRun()3.2.3 HandlerHttp() 总结 1 认识URL 什么是URI? URI 是 Uniform Resource Identifier的缩写&…...

[paddle] 矩阵相关的指标

行列式 det 行列式定义参考 d e t ( A ) ∑ i 1 , i 2 , ⋯ , i n ( − 1 ) σ ( i 1 , ⋯ , i n ) a 1 , i 1 a 2 , i 2 , ⋯ , a n , i n det(A) \sum_{i_1,i_2,\cdots,i_n } (-1)^{\sigma(i_1,\cdots,i_n)} a_{1,i_1}a_{2,i_2},\cdots, a_{n,i_n} det(A)i1​,i2​,⋯,in​…...

docker部署SpringBoot项目简单流程

一、docker基础命令理解学习 1、常见命令 docker启动之前要关闭防火墙systemctl stop firewalld # 关闭防火墙systemctl disable firewalld # 禁止开机启动防火墙systemctl start docker # 启动docker服务systemctl stop docker # 停止docker服务systemctl restart docker # …...

Python学习——函数参数详解

Python中的函数参数传递机制允许多种灵活的参数类型,可以根据需求灵活配置参数,这使得函数具有更强大的扩展性和适应性。以下是对各类参数类型的详细说明: 1. 定义函数的不同参数类型 1.1 位置参数 定义方式:def func(a, b2) 特…...

Chromium132 编译指南 - Android 篇(一):编译前准备

1. 引言 欢迎来到《Chromium 132 编译指南 - Android 篇》系列的第一部分。本系列指南将引导您逐步完成在 Android 平台上编译 Chromium 132 版本的全过程。Chromium 作为一款由 Google 主导开发的开源浏览器引擎,为众多现代浏览器提供了核心驱动力。而 Android 作…...

.Net / C# 繁体中文 与 简体中文 互相转换, 支持地方特色词汇

版本号 Nuget 搜索 “OpenCCNET”, 注意别找错, 好多库的名字都差不多 支持 “繁,简” 的互相转换, 支持多个地区常用词汇的转换, 还支持 日文的新旧转换. OpenCC 在 .Net 中的实现 https://github.com/CosineG/OpenCC.NET <PackageReference Include"OpenCCNET"…...

Java泛型深度解析(JDK23)

第一章 泛型革命 1.1 类型安全的进化史 前泛型时代的类型转换隐患 代码的血泪史&#xff08;Java 1.4版示例&#xff09;&#xff1a; List rawList new ArrayList(); rawList.add("Java"); rawList.add(Integer.valueOf(42)); // 编译通过// 灾难在运行时爆发…...

【贪心算法篇】:“贪心”之旅--算法练习题中的智慧与策略(一)

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;贪心算法篇–CSDN博客 文章目录 一.贪心算法1.什么是贪心算法2.贪心算法的特点 二.例题1.柠…...

AJAX XML

AJAX XML 引言 随着互联网技术的不断发展,Web应用对用户交互性和实时性的要求越来越高。AJAX(Asynchronous JavaScript and XML)技术的出现,为Web应用开发提供了强大的支持。AJAX技术允许Web应用在不重新加载整个页面的情况下,与服务器进行异步通信。XML作为数据传输格式…...

踏入编程世界的第一个博客

我&#xff0c;一个双非一本大一新生&#xff0c;普通的不能再普通了&#xff0c;面对宏伟庞大的计算机世界仍显得举手无措&#xff0c;我自以为自身仍有些许骨气&#xff0c;不想普普通通&#xff0c;甚是浑浑噩噩的度过四年大学&#xff0c;经历了高考的打击&#xff0c;双非…...

2025年1月22日(网络编程 udp)

系统信息&#xff1a; ubuntu 16.04LTS Raspberry Pi Zero 2W 系统版本&#xff1a; 2024-10-22-raspios-bullseye-armhf Python 版本&#xff1a;Python 3.9.2 已安装 pip3 支持拍摄 1080p 30 (1092*1080), 720p 60 (1280*720), 60/90 (640*480) 已安装 vim 已安装 git 学习…...

数据结构与算法之栈: LeetCode 641. 设计循环双端队列 (Ts版)

设计循环双端队列 https://leetcode.cn/problems/design-circular-deque/description/ 描述 设计实现双端队列。 实现 MyCircularDeque 类: MyCircularDeque(int k) &#xff1a;构造函数,双端队列最大为 k 。boolean insertFront()&#xff1a;将一个元素添加到双端队列头部…...

从零开始学 HTML:构建网页的基本框架与技巧

系列文章目录 01-从零开始学 HTML&#xff1a;构建网页的基本框架与技巧 文章目录 系列文章目录前言一、HTML 文档的基本框架1.1 <!DOCTYPE html>、<html>、<head>、<body> 标签解析1.1.1 <!DOCTYPE html> 标签1.1.2 <html> 标签1.1.3 &l…...