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用途多种多样,其中最广泛的用途是如下几种:
- 用作数据存储
解释:Redis可以用作一个NoSQL数据库,存储应用的数据。虽然它是基于内存的,但提供持久化机制(如RDB和AOF),可以将内存数据保存到磁盘,实现数据的持久存储。
场景:适用于需要快速读写访问的场景,如用户配置信息、用户关系数据等。由于Redis支持丰富的数据结构,如字符串、列表、集合、哈希表等,因此非常灵活,能满足多种类型的数据存储需求。
优势:高性能读写、支持丰富的数据结构。 - 用作缓存存储
解释:Redis最常见的用途之一是作为缓存系统,存储临时数据,以减轻后端数据库的压力和提高应用的响应速度。
场景:适用于缓存网页、API响应结果、热点数据等。比如,电商网站中的商品详情页,可以将页面数据缓存到Redis中,用户每次访问时直接从缓存获取,减少数据库查询。
优势:极高的访问速度、支持数据过期策略,自动删除过期的缓存项。 - 用作Session存储
解释:在Web应用中,Redis可以用来存储用户会话(Session)信息,尤其是在分布式环境下,保持Session的一致性和可用性。
场景:适用于分布式Web应用,需要共享用户Session信息。由于Web应用可能部署在多个服务器上,使用Redis作为Session存储可以确保不同服务器上的应用能共享用户的登录状态和Session数据。
优势:快速访问、跨服务器Session共享、支持数据持久化和备份。 - 消息队列
解释:Redis的发布/订阅(Pub/Sub)模式和列表数据结构可以用来实现简单的消息队列功能,支持消息的生产和消费。
场景:适用于需要异步处理任务、解耦系统组件的场景。比如,一个电子邮件发送系统,用户操作触发邮件发送请求后,系统将请求消息发送到Redis队列,另一个负责发送邮件的后台服务从队列中取出并处理这些请求。
优势:实现应用组件间的异步通信、减少等待时间、提高系统响应速度和吞吐量。
5.Redis的限制
- 大容量数据存储
限制:Redis是基于内存的存储系统,虽然它提供了持久化选项,但如果你需要存储大量的数据(比如TB级别),Redis可能会变得成本高昂,因为内存的成本远高于硬盘。 - 复杂查询和分析
限制:Redis支持的查询相对简单,主要是基于键的访问。它不支持像SQL数据库那样的复杂查询、连接操作或数据分析功能。 - 事务处理
限制:虽然Redis支持基本的事务功能(通过MULTI/EXEC命令),但它的事务能力远不如关系数据库。Redis的事务没有回滚机制,一旦执行EXEC命令,就会尝试执行所有命令,即使某些命令失败了。 - 关系数据模型
限制:Redis是一个键值存储,它不是为存储和查询关系数据设计的。如果你的应用需要复杂的数据关系模型,传统的关系数据库可能是更好的选择。 - 完整的文本搜索
限制:虽然Redis可以用作存储文本数据,但它本身不提供全面的文本搜索功能,如全文检索、支持复杂查询的索引等。专门的搜索引擎(如Elasticsearch)在这方面功能更加强大。 - 数据安全和隐私
限制:Redis提供了基本的安全特性,如密码保护和SSL加密通信。然而,对于需要高级安全特性(如细粒度的访问控制、数据加密存储等)的场景,Redis可能需要与其他安全解决方案配合使用。 - 读写密集型应用
限制:虽然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)——直接选择排序
目录 直接选择排序 基本思想 整体思路(升序) 单趟 多趟 代码实现 特性总结 直接选择排序 基本思想 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...

以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...

Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...
前端高频面试题2:浏览器/计算机网络
本专栏相关链接 前端高频面试题1:HTML/CSS 前端高频面试题2:浏览器/计算机网络 前端高频面试题3:JavaScript 1.什么是强缓存、协商缓存? 强缓存: 当浏览器请求资源时,首先检查本地缓存是否命中。如果命…...
React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构
React 实战项目:微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇!在前 29 篇文章中,我们从 React 的基础概念逐步深入到高级技巧,涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...