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)——直接选择排序
目录 直接选择排序 基本思想 整体思路(升序) 单趟 多趟 代码实现 特性总结 直接选择排序 基本思想 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...

力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...