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

Redis(理论版)

Redis

1.Redis是什么

Redis其实就是一个数据库,它是一个文档型数据库(非关系型数据库),而mysql是一个关系型数据库。它是一个开源的、基于内存的高性能键值存储数据库,支持多种数据结构,广泛用于缓存、消息队列、应用数据存储等场景,以其快速的读写性能和灵活性而著称。Redis是一个快速的存储工具,可以记住各种信息,像网站的临时数据,让网站运行得更快,也可以帮助应用程序高效地交换消息或保存数据。它在内存中存储数据

2.Redis特性

1.基于内存的存储:Redis的数据存储在内存中,使得数据的读写速度非常快,适合高速缓存和实时应用场景。
2.支持多种数据结构:除了简单的键值对,Redis还支持列表(Lists)、集合(Sets)、有序集合(Sorted Sets)、哈希表(Hashes)、位图(Bitmaps)、超日志(HyperLogLogs)和地理空间(Geospatial)索引半径查询等数据结构。
3.持久化:尽管Redis是基于内存的,但它提供了RDB(快照)和AOF(追加文件)两种方式来持久化数据到磁盘,确保数据安全。
4.事务支持:Redis通过MULTI、EXEC、WATCH等命令支持事务,可以将多个命令作为一个原子操作执行。
5.高可用和分布式支持:通过Redis哨兵(Sentinel)和Redis集群(Cluster)机制,Redis支持高可用部署和数据分片,可以在多个节点间提供数据共享和故障转移。
6.发布/订阅(Pub/Sub):Redis实现了发布/订阅消息分发模型,支持消息的发布者和订阅者之间的消息通信。
7.Lua脚本支持:通过支持Lua脚本,Redis可以执行复杂的事务和数据处理操作,提高了数据操作的灵活性和效率。
8.简单易用:Redis有着简洁的设计和丰富的文档,易于安装和使用,同时社区支持力度大,有大量的客户端库支持不同的编程语言。
9.内存数据过期策略:Redis支持设置键的过期时间,这对于管理缓存数据非常有用,可以自动删除过期的数据项。
10.安全性:提供了访问控制和SSL加密等安全特性,可以保护数据不被未授权访问。

3.Redis为什么快

原因主要有以下几点:
1.纯内存操作:redis将所有数据存储在内存中,这意味着对数据的读写操作直接在内存中进行,而内存的访问速度远远高于磁盘。这种设计使得redis能够以接近硬件极限的速度处理数据读写。
2.单线程模型:redis使用单线程模型来处理客户端的请求。这可能听起来似乎效率不高,但是实际上,这种设计避免了多线程频繁切换和过度竞争所带来的性能开销,redis每个请求的执行时间都很短,因此在单线程下,也能够处理大量的并发请求。
3.I/O多路复用:redis使用了I/O多路复用的技术,可以在单个线程中同时监听多个客户端连接,只有当网络事件发生时候才会进行实际的I/O操作,这样有效地利用了cpu资源,减少了无谓的等待和上下文切换。
4.高效数据结构:redis提供了多种高效的数据结构,如哈希表,有序集合等。这些数据结构都经过了优化,使得redis在处理这些数据结构的操作时非常有效。

其中第三点 I/O多路复用你可能不太理解,让我来详细解释一下其中的一些名词
I/O多路复用技术
想象一下,有一个电话接线员(Redis服务器)需要同时监听多个电话(客户端连接)。不使用I/O多路复用的情况下,接线员需要一个接一个地检查每部电话是否有人打来,这样很低效,因为接线员大部分时间都在检查没有电话来的空闲电话上。
使用I/O多路复用技术后,接线员有了一个高级电话系统,这个系统可以同时监听所有电话,一旦有电话响起(网络事件发生),系统立刻通知接线员哪部电话需要回应。这样,接线员就不需要不断地检查每部电话,而是直接在需要时采取行动。
单线程模型
Redis 使用单线程模型处理命令,就像那位只有一个接线员,但由于I/O多路复用技术的帮助,这位接线员能够非常高效地处理多个电话。当没有电话需要接听(即没有网络I/O事件)时,接线员也不会白白浪费时间去检查每个电话,这大大提高了工作效率。
减少无谓的等待和上下文切换
在没有I/O多路复用技术的系统中,服务器需要不断地检查每个连接,看看有没有数据可以读取或发送,这种检查往往是无谓的,并且在多个任务(或线程)之间频繁切换会造成额外的CPU资源消耗(上下文切换)。
使用了I/O多路复用技术的Redis,只在有数据交互需要处理时才占用CPU去处理这些任务,有效减少了CPU资源的浪费,使得即使是单线程的Redis也能高效地处理大量客户端的请求。
总结,通过使用I/O多路复用技术,Redis能够在单线程中高效地管理多个客户端连接,仅在真正有数据需要处理时才进行操作,从而有效利用CPU资源,提高了性能。
上下文
在计算机科学中,“上下文切换”(Context Switch)是指CPU从执行一个任务(比如一个进程或线程)切换到执行另一个任务的过程。“上下文”(Context)是指某一时刻CPU寄存器和程序计数器的内容,以及任务相关的其他状态信息。这些信息对于CPU来说是执行任务所必需的,因为它们记录了任务执行到哪一点、变量的当前值等关键信息。
当操作系统决定从当前运行的任务切换到另一个任务时,它需要保存当前任务的上下文(即,把当前任务的状态信息保存起来),以便之后可以恢复这个任务,从它离开的地方继续执行。然后,操作系统加载新任务的上下文,CPU开始执行新任务。这个保存当前任务状态和加载新任务状态的过程就是上下文切换。
上下文切换是有成本的,包括:
时间成本:保存和加载上下文需要时间,这个时间内CPU不能执行其他的计算任务。
资源成本:上下文切换可能导致CPU缓存失效(因为不同任务可能使用不同的数据和代码),从而降低CPU缓存的效率。
因此,在多任务环境中,频繁的上下文切换会影响系统的整体性能。Redis使用I/O多路复用和单线程模型的方式,减少了上下文切换的需要,从而有效地利用CPU资源,提高了性能。

4.Redis用途

redis用途多种多样,其中最广泛的用途是如下几种:

  1. 用作数据存储
    解释:Redis可以用作一个NoSQL数据库,存储应用的数据。虽然它是基于内存的,但提供持久化机制(如RDB和AOF),可以将内存数据保存到磁盘,实现数据的持久存储。
    场景:适用于需要快速读写访问的场景,如用户配置信息、用户关系数据等。由于Redis支持丰富的数据结构,如字符串、列表、集合、哈希表等,因此非常灵活,能满足多种类型的数据存储需求。
    优势:高性能读写、支持丰富的数据结构。
  2. 用作缓存存储
    解释:Redis最常见的用途之一是作为缓存系统,存储临时数据,以减轻后端数据库的压力和提高应用的响应速度。
    场景:适用于缓存网页、API响应结果、热点数据等。比如,电商网站中的商品详情页,可以将页面数据缓存到Redis中,用户每次访问时直接从缓存获取,减少数据库查询。
    优势:极高的访问速度、支持数据过期策略,自动删除过期的缓存项。
  3. 用作Session存储
    解释:在Web应用中,Redis可以用来存储用户会话(Session)信息,尤其是在分布式环境下,保持Session的一致性和可用性。
    场景:适用于分布式Web应用,需要共享用户Session信息。由于Web应用可能部署在多个服务器上,使用Redis作为Session存储可以确保不同服务器上的应用能共享用户的登录状态和Session数据。
    优势:快速访问、跨服务器Session共享、支持数据持久化和备份。
  4. 消息队列
    解释:Redis的发布/订阅(Pub/Sub)模式和列表数据结构可以用来实现简单的消息队列功能,支持消息的生产和消费。
    场景:适用于需要异步处理任务、解耦系统组件的场景。比如,一个电子邮件发送系统,用户操作触发邮件发送请求后,系统将请求消息发送到Redis队列,另一个负责发送邮件的后台服务从队列中取出并处理这些请求。
    优势:实现应用组件间的异步通信、减少等待时间、提高系统响应速度和吞吐量。

5.Redis的限制

  1. 大容量数据存储
    限制:Redis是基于内存的存储系统,虽然它提供了持久化选项,但如果你需要存储大量的数据(比如TB级别),Redis可能会变得成本高昂,因为内存的成本远高于硬盘。
  2. 复杂查询和分析
    限制:Redis支持的查询相对简单,主要是基于键的访问。它不支持像SQL数据库那样的复杂查询、连接操作或数据分析功能。
  3. 事务处理
    限制:虽然Redis支持基本的事务功能(通过MULTI/EXEC命令),但它的事务能力远不如关系数据库。Redis的事务没有回滚机制,一旦执行EXEC命令,就会尝试执行所有命令,即使某些命令失败了。
  4. 关系数据模型
    限制:Redis是一个键值存储,它不是为存储和查询关系数据设计的。如果你的应用需要复杂的数据关系模型,传统的关系数据库可能是更好的选择。
  5. 完整的文本搜索
    限制:虽然Redis可以用作存储文本数据,但它本身不提供全面的文本搜索功能,如全文检索、支持复杂查询的索引等。专门的搜索引擎(如Elasticsearch)在这方面功能更加强大。
  6. 数据安全和隐私
    限制:Redis提供了基本的安全特性,如密码保护和SSL加密通信。然而,对于需要高级安全特性(如细粒度的访问控制、数据加密存储等)的场景,Redis可能需要与其他安全解决方案配合使用。
  7. 读写密集型应用
    限制:虽然Redis在处理读操作时表现出色,但在写密集型应用场景中,持续的高写入负载可能会对性能产生影响,特别是当数据持久化和同步到磁盘时。

相关文章:

Redis(理论版)

Redis 1.Redis是什么 Redis其实就是一个数据库,它是一个文档型数据库(非关系型数据库),而mysql是一个关系型数据库。它是一个开源的、基于内存的高性能键值存储数据库,支持多种数据结构,广泛用于缓存、消息队列、应用…...

【NR 定位】3GPP NR Positioning 5G定位标准解读(四)

目录 前言 6 Signalling protocols and interfaces 6.1 支持定位操作的网络接口 6.1.1 通用LCS控制平面架构 6.1.2 NR-Uu接口 6.1.3 LTE-Uu接口 6.1.4 NG-C接口 6.1.5 NL1接口 6.1.6 F1接口 6.1.7 NR PC5接口 6.2 终端协议 6.2.1 LTE定位协议(LPP&#x…...

Docker容器化解决方案

什么是Docker? Docker是一个构建在LXC之上,基于进程容器的轻量级VM解决方案,实现了一种应用程序级别的资源隔离及配额。Docker起源于PaaS提供商dotCloud 基于go语言开发,遵从Apache2.0开源协议。 Docker 自开源后受到广泛的关注和…...

Docker安装+基础命令

一、检测、配置安装环境 (1)查看linux版本,是否符合>centos 7 (2)查看网络是否通畅 (3)安装gcc,gcc-c编译器 (4)安装device-mapper-persistent-data和lvm2…...

构建高性能Linux Virtual Server(LVS)集群

目录 引言 一、集群的基本理论 (一)什么是集群 (二)集群的分类 (三)LB Cluster 负载均衡集群 1.按实现方式划分 2.按协议层划分 (四)HA 高可用集群实现 二、LVS简介 &…...

Linux:线程的概念

个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C》《Linux》 文章目录 前言一、线程的概念线程代码的简单示例 总结 前言 本文是对于线程概念的知识总结 一、线程的概念 在课本上,线程是比进程更轻量级的一种指向流 或 线程是在…...

如何在jupyter notebook 中下载第三方库

在anconda 中找到: Anaconda Prompt 进入页面后的样式: 在黑色框中输入: 下载第三方库的命令 第三方库: 三种输入方式 标准保证正确 pip instsall 包名 -i 镜像源地址 pip install pip 是 Python 包管理工具,…...

Linux下du命令和df命令的使用

du命令作用是估计文件系统的磁盘已使用量,常用于查看文件或目录所占磁盘容量。df命令是统计磁盘使用情况,可以用来查看磁盘已被使用多少空间和还剩余多少空间。du命令语法du [选项] [文件或目录名称]参数:-a:--all, 列…...

AIGC笔记--条件自回归Transformer的搭建

1--概述 1. 自回归 TransFormer 规定Token只能看到自身及前面的Token,因此需生成一个符合规定的Attention Mask;(代码提供了两种方式自回归Attention Mask的定义方式); 2. 使用Cross Attention实现条件模态和输入模态之…...

数据结构->链表分类与oj(题),带你提升代码好感

✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:橘橙黄又青-CSDN博客 1.🍎链表的分类 前面我们学过顺序表,顺序表问题: …...

unity-unity2d基础操作笔记(三)0.5.000

目标是:牢记以下137条操作,越级上升到中级阶段 unity-unity2d基础操作笔记(三) 一百零一、如何操作一个游戏物体由多个部分组成的动画一百零二、如何使用rigidbody 2d进行物体移动一百零三、获取游戏物体身上的组件方法一百零四、代码控制物体朝向一百零五、不使用插件,纯…...

【精华】AIGC启元2024

文章目录 AIGC 前沿(1) Gemini 1.5 Pro(2) Sora(3) EMO(4) Playground v2.5(5) VSP-LLM(6) Ideogram.ai(7) LTX studio AIGC 前沿 (1) Gemini 1.5 Pro 2024.02.16 谷歌新一代多模态大模型Gemini 1.5 Pro,在性能上超越OpenAI的GPT-4 Turbo,堪称业界最强…...

js对象解构语法

对象解构语法是一种 JavaScript 的语法特性,用于从对象中提取属性,并将这些属性值赋值给变量。 基本语法 const { property1, property2 } object;object 是要解构的对象。property1 和 property2 是对象中的属性名,用花括号 {} 包裹起来表…...

flowable使用taskService.addComment新增评论需要full_msg字段进行读取

背景 在构建创业项目JeecgFlow过程中,在调用taskService.addComment接口出现了异常。就是数据存储的Message信息出现了截取,也就是存储不完整。 效果如下. flowable版本6.7.2 问题排查 接口详解及问题代码 //新增评论的接口说明 Comment addComment(…...

java常用技术栈,java面试带答案

前言 我们从一个问题引入今天的主题。 在日常业务开发中,我们可能经常听到 DBA 对我们说“不要”(注意:不是禁止)使用 join,那么为什么 DBA 对 join 这么抵触呢?是 join 本身有问题,还是我们使…...

刷题第11天

代码随想录刷题第11天 | 二叉树前中后序遍历 前序遍历 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x…...

QML中动态增加表格数据

1.QML中的表格实现 import QtQuick 2.15 import QtQuick.Window 2.15import QtQuick.Controls 2.0 import Qt.labs.qmlmodels 1.0 import QtQuick.Layouts 1.15Window {width: 640height: 480visible: truetitle: qsTr("Hello World")TableModel{id:table_modelTabl…...

OBS插件开发(二)推流实时曲线

不发视频了,截个图算了,嫌麻烦 1,自定义QWidget图表绘制 ,动态更新 2,OBS直播帧率,码率监控 3,主要用于前端推流状况可视化,异常报警,及时性,无人值守直播...

Linux编程3.3 进程-进程的终止

1、正常终止 从main函数返回调用exit(标准C库函数)调用_exti或_Exit(系统调用)最后一个线程从其启动例程返回最后一个线程调用 pthread exit 2、异常终止 调用abort接受到一个信号并终止最后一个线程对取消请求做处理响应 3、进程返回 通常程序运行…...

排序(3)——直接选择排序

目录 直接选择排序 基本思想 整体思路(升序) 单趟 多趟 代码实现 特性总结 直接选择排序 基本思想 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

MMaDA: Multimodal Large Diffusion Language Models

CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

docker 部署发现spring.profiles.active 问题

报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]

报错信息:libc.so.6: cannot open shared object file: No such file or directory: #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...

comfyui 工作流中 图生视频 如何增加视频的长度到5秒

comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...