【Redis】Redis是什么、能干什么、主要功能和工作原理的详细讲解

🚀欢迎来到本文🚀
🍉个人简介:陈童学哦,目前学习C/C++、算法、Python、Java等方向,一个正在慢慢前行的普通人。
🏀系列专栏:陈童学的日记
💡其他专栏:C++STL,感兴趣的小伙伴可以看看。
🎁希望各位→点赞👍 + 收藏⭐️ + 留言📝
⛱️万物从心起,心动则万物动🏄♂️
前言:Redis是一种开源的
内存数据结构存储系统,它支持多种数据结构,如字符串、哈希、列表、集合、有序集合等。它可以用作数据库、缓存和消息中间件,并在性能、可扩展性和灵活性方面表现出色。
Redis的简介
Redis是一个完全开源免费的高性能(NOSQL)的key-value数据库。它遵守BSD协议,使用ANSI C语言编写,并支持网络和持久化。Redis拥有极高的性能,每秒可以进行11万次的读取操作和8.1万次的写入操作。它支持丰富的数据类型,包括String、Hash、List、Set和Ordered Set,并且所有的操作都是原子性的。此外,Redis还提供了多种特性,如发布/订阅、通知、key过期等。Redis采用自己实现的分离器来实现高速的读写操作,效率非常高。Redis是一个简单、高效、分布式、基于内存的缓存工具,通过网络连接提供Key-Value式的缓存服务。
Redis可以通过配置文件设置密码参数,这样客户端连接到Redis服务就需要密码验证,从而提高Redis服务的安全性。
Redis有三个主要特点,使它优越于其他键值数据存储系统:
- 首先,Redis将其数据库完全保存在内存中,
仅使用磁盘进行持久化。这使得Redis具有很高的读写性能。 - 其次,Redis
支持多种数据结构,不仅仅支持简单的key-value类型的数据,还提供了list、set、zset和hash等更复杂的数据结构的存储。 - 最后,Redis
支持数据的备份,可以通过master-slave模式进行数据备份,增加了数据的可靠性和安全性。
Redis还可以用于内存存储和持久化,支持异步将内存中的数据写到硬盘上,同时不影响继续服务取最新N个数据的操作。此外,Redis还可以用于模拟类似于HttpSession这种需要设定过期时间的功能,发布和订阅消息系统,以及定时器和计数器等功能。
Redis的由来

Redis是一个开源的高性能键值对存储系统,它最早由Salvatore Sanfilippo编写并在2009年发布。Redis的名字来源于Remote Dictionary Server(远程字典服务器)的缩写。Redis最初是为了解决Web应用中的高并发读写问题而设计的。它具有以下特点:单线程的模型,支持多种数据结构,以及快速的读写速度。
Redis的单线程模型意味着它在任何给定的时间只处理一条命令,这样可以避免了多线程之间的线程同步和竞争条件问题。但是,Redis通过使用异步I/O和事件驱动模型来提高并发读写的能力,从而实现了高性能的读写操作。
Redis支持多种数据结构,包括字符串、哈希、列表、集合和有序集合等。每种数据结构都有对应的操作命令,可以对数据进行增删改查等操作。Redis的数据结构灵活,可以满足不同场景下的需求。
在Redis中,数据的存储方式会根据数据的特性进行优化。例如,对于少量和小型的数据,Redis使用小而压缩的存储方式来提高存储效率。此外,Redis还通过使用编码属性来设置对象的内部编码,以进一步优化存储和执行效率。
Redis的底层存储结构主要依赖于字典,也称为散列表(hash)。字典是一种键值对的存储结构,用于在内存中快速查找和访问数据。整个Redis数据库就是通过字典来存储数据的,每个键值对都被存储在字典中。因此,在对Redis进行CURD操作时,实际上是对字典中的数据进行操作。
总的来说,Redis是一个高性能的键值对存储系统,它具有单线程的模型、支持多种数据结构和快速的读写速度。Redis最初是为了解决Web应用中的高并发读写问题而设计的。在Redis中,数据的存储方式根据数据的特性进行优化,底层存储结构主要依赖于字典。

Redis主要特性和功能
Redis能够做很多事情,它提供了多种语言的API,并且支持网络访问。Redis具有以下几个主要的特性和功能:
-
1.内存存储:Redis主要将数据存储在内存中,因此具有非常高的读写性能。它适用于对响应速度要求较高的应用场景,比如缓存系统。
-
2.持久化:Redis支持将数据持久化到硬盘上,以防止数据丢失。它提供了两种持久化方式:RDB(Redis Database)和AOF(Append Only File)。RDB是将数据定期保存到磁盘文件中,而AOF则是将每个写操作追加到文件的末尾。
-
3.发布订阅系统:Redis提供了发布订阅(Pub/Sub)机制,可以用于实现消息队列、实时聊天等功能。通过订阅感兴趣的频道,客户端可以接收到相应的消息。
-
4.地图信息分析:Redis提供了地理位置相关的数据结构和命令,可以用于存储和查询地理位置信息。这使得它在地图信息分析方面具有很大的优势。
-
5.计时器和计数器:Redis提供了丰富的命令,可以用于实现计时器和计数器功能,比如记录用户的浏览量、点赞次数等。
-
6.分布式锁:Redis的setnx命令可以用于实现分布式锁。在分布式应用中,为了保证同一时刻只有一个线程执行关键代码,可以使用Redis的分布式锁功能来实现。
-
7.实时数据分析:由于Redis具有高性能和低延迟的特点,适合用于实时数据分析。可以将实时产生的数据存储在Redis中,并通过Redis提供的相关命令进行实时的数据查询和统计分析。
总之,Redis是一个功能强大且灵活的数据库,可以根据不同的需求来使用,它可以用于内存存储、持久化、发布订阅系统、地图信息分析以及计时器和计数器等多种应用场景。简直强的鸭皮呀兄弟们!
Redis的工作原理
Redis的工作原理是基于内存的、单线程的、非阻塞IO的键值存储系统。以下是关于Redis的工作原理:
-
内存存储:Redis完全基于内存进行数据存储,这使得它具有高速读写的特性。大部分请求都是在内存中进行操作,因此速度非常快。数据存储在内存中,类似于HashMap,使得数据的查找和操作时间复杂度为O(1)。
-
单线程:Redis采用单线程的方式来处理请求,避免了多线程导致的上下文切换和竞争条件。它不需要考虑各种锁的问题,也不会因为加锁释放锁操作而产生性能消耗。单线程的架构可以有效地提高Redis的性能。
-
非阻塞IO:Redis使用多路复用IO模型来处理IO操作,实现了非阻塞IO。它通过监听多个socket,一次性接受多个客户端请求,并将请求放入队列中。当完整的命令到达服务端后,再去处理请求,不需要等待客户端的传输。这种方式可以提高Redis的并发处理能力。
-
Lua脚本执行:Redis还支持在Lua脚本中执行Redis命令。通过redis.call(command, key [param1,param2…])的方式,可以在Lua脚本中调用Redis命令进行操作。这使得用户可以灵活地执行复杂的逻辑和操作。
Redis通过将数据存储在内存中,采用单线程和非阻塞IO的方式,实现了高性能的键值存储。它的工作原理简单而高效,适用于各种场景下的数据存储和缓存需求。

怎么样,在了解Redis后是不是觉得这个东西很强呀?但是也好像合情合理哈,毕竟任何一门被企业主流使用的技术都是实用性比较强且受大众程序员喜爱的(毕竟能更好的摸鱼😏)

如果本文对大家有所帮助的话,还望各位能给我点赞、收藏并评论一下,感谢各位💕!!! 另如果大家有什么疑问或者建议的话,欢迎评论区留言。
相关文章:
【Redis】Redis是什么、能干什么、主要功能和工作原理的详细讲解
🚀欢迎来到本文🚀 🍉个人简介:陈童学哦,目前学习C/C、算法、Python、Java等方向,一个正在慢慢前行的普通人。 🏀系列专栏:陈童学的日记 💡其他专栏:CSTL&…...
8月26日,每日信息差
1、上海发布两项支持高级别自动驾驶的5G网络标准,在上海市通管局的指导下,由上海移动和中国信息通信研究院牵头组织二十余家标准起草单位共同参与编写的《支持高级别自动驾驶的5G网络规划建设和验收要求》和《支持高级别自动驾驶的5G网络性能要求》等两项…...
云和恩墨面试(部分)
一面 软件架构设计方案应该包含哪些内容,哪些维度 二面 架构师如何保证软件产品质量线程屏障(或者说线程栅栏)是什么,为什么要使用线程屏障事务传播⾏为为NESTED时,当内部事务发生异常时,外部事务会回滚吗?newBing:…...
volatile 关键字详解
目录 volatile volatile 关键用在什么场景下: volatile 关键字防止编译器优化: volatile 是一个在许多编程语言中(包括C和C)用作关键字的标识符。它用于告诉编译器不要对带有该关键字修饰的变量进行优化,以确保变量在…...
Ceph入门到精通-大流量10GB/s LVS+OSPF 高性能架构
LVS 和 LVSkeepalived 这两种架构在平时听得多了,最近才接触到另外一个架构LVSOSPF。这个架构实际上是LVSKeepalived 的升级版本,我们所知道LVSKeepalived 架构是这样子的: 随着业务的扩展,我们可以对web服务器做水平扩展…...
Unity光照相关
1. 光源类型 Unity支持多种类型的光源,包括: 1. 点光源(Point Light):从一个点向四周发射光线,适用于需要突出物体的光源。 2. 平行光(Directional Light):从无限远处…...
Qt基本类型
QT基本数据类型定义在#include <QtGlobal> 中,QT基本数据类型有: 类型名称注释备注qint8signed char有符号8位数据qint16signed short16位数据类型qint32signed short32位有符号数据类型qint64long long int 或(__int64)64位有符号数据类型&#x…...
前端基础(Element、vxe-table组件库的使用)
前言:在前端项目中,实际上,会用到组件库里的很多组件,本博客主要介绍Element、vxe-table这两个组件如何使用。 目录 Element 引入element 使用组件的步骤 使用对话框的示例代码 效果展示 vxe-table 引入vxe-table 成果展…...
C++学习记录——이십팔 C++11(4)
文章目录 包装器1、functional2、绑定 这一篇比较简短,只是因为后要写异常和智能指针,所以就把它单独放在了一篇博客,后面新开几篇博客来写异常和智能指针 包装器 1、functional 包装器是一个类模板,对可调用对象类型进行再封装…...
UE学习记录03----UE5.2 使用拖拽生成模型
0.创建蓝图控件,自己想要展示的样子 1.侦测鼠标拖动 2.创建拖动操作 3.拖动结束时生成模型 3.1创建actor , 创建变量EntityMesh设为可编辑 生成Actor,创建变量EntityMesh设为可编辑 屏幕鼠标位置转化为3D场景位置 4.将texture设置为变量并设为可编辑&am…...
Spring Cache框架(缓存)
1、介绍: Spring Cache 是一个框架,实现了基于注解的缓存功能,只需要简单加个注解,就能实现缓存功能。它提供了一层抽象,底层可以切换不同的cache实现。具体就是通过CacheManager 接口来实现不同的缓存技术。 针对不同…...
Linux学习之Ubuntu 20使用systemd管理OpenResty服务
sudo cat /etc/issue可以看到操作系统的版本是Ubuntu 20.04.4 LTS,sudo lsb_release -r可以看到版本是20.04,sudo uname -r可以看到内核版本是5.5.19,sudo make -v可以看到版本是GNU Make 4.2.1。 需要先参考我的博客《Linux学习之Ubuntu 2…...
[数据集][目标检测]疲劳驾驶数据集VOC格式4类别-4362张
数据集格式:Pascal VOC格式(不包含分割的txt文件,仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数):4362 标注数量(xml文件个数):4362 标注类别数:4 标注类别名称:["closed_eye","closed_mouth"…...
matlab使用教程(25)—常微分方程(ODE)选项
1.ODE 选项摘要 解算 ODE 经常要求微调参数、调整误差容限或向求解器传递附加信息。本主题说明如何指定选项以及每个选项与哪些微分方程求解器兼容。 1.1 选项语法 使用 odeset 函数创建 options 结构体,然后将其作为第四个输入参数传递给求解器。例如࿰…...
MybatisPlus简单到入门
一、MybatisPlus简介 1、入门案例(重点): 1.SpringBoot整合MP1).创建新模块选择,Spring项初始化。2).选择当前模块使用的技术,只保留MySQL Driver就行,不要选择mybatis避免与后面导入mybatisPlus的依赖发…...
9. 优化器
9.1 优化器 ① 损失函数调用backward方法,就可以调用损失函数的反向传播方法,就可以求出我们需要调节的梯度,我们就可以利用我们的优化器就可以根据梯度对参数进行调整,达到整体误差降低的目的。 ② 梯度要清零,如果梯…...
go学习之流程控制语句
文章目录 流程控制语句1.顺序控制2.分支控制2.1单分支2.2双分支单分支和双分支的四个题目switch分支结构 3.循环控制for循环控制while 和do...while的实现 4.跳转控制语句breakcontinuegotoreturngotoreturn 流程控制语句 介绍:在程序中,程序运行的流程…...
docker基于已有容器和通过Dockerfile进行制作镜像配置介绍
目录 一.制作镜像的两种方式 1.在已有容器中更新并提交这个镜像 2.使用Dockerfile来制作 二.基于容器制作镜像 1.格式 (1)主要格式 (2)可选参数 2.案例 基于容器创建镜像设置标签并进行验证是否可用 (1&…...
2022年09月 C/C++(四级)真题解析#中国电子学会#全国青少年软件编程等级考试
第1题:最长上升子序列 一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序列(ai1, ai2, …, aiK),这里1 < i1 < i2 &…...
二级MySQL(九)——表格数据处理练习
在Mysql中,可以用INSERT或【REPLACE】语句,向数据库中已一个已有的表中插入一行或多行记录。 在Mysql中,可以用【DELETE】或【TRUNCATE】语句删除表中的所有记录。 在Mysql中,可以用【UPDATE】语句来修改数据表中的记录。 为了完…...
OpenClaw极简部署:Qwen3-VL:30B镜像+飞书5分钟接入
OpenClaw极简部署:Qwen3-VL:30B镜像飞书5分钟接入 1. 为什么选择这个组合? 上周我在测试各种开源模型与自动化工具的搭配方案时,发现了一个效率极高的组合:星图平台的Qwen3-VL:30B镜像OpenClaw框架。这个方案最吸引我的地方在于…...
告别重复造轮子,用快马ai一键生成tomcat高效开发工具集与配置模板
今天想和大家分享一个提升Tomcat开发效率的小技巧。作为一个经常和Tomcat打交道的开发者,我发现每次新建项目都要重复写一些基础工具类,特别浪费时间。最近在InsCode(快马)平台上尝试用AI生成了一套可复用的工具集,效果很不错。 数据库连接池…...
GBase 8a云数仓存算分离,“柔性搭建数仓”
传统分析型MPP数据库的搭建,就像装修一套毛坯房,从规划格局到水电改造,从墙面处理到家具进场,每一步都离不开专业师傅,稍有不慎就得返工重来。南大通用(gbase database)GBase 8a云数仓(GCDW&…...
咱就说中小厂房、仓库的火灾报警系统,用S7-200 PLC加组态王真的是性价比天花板——够稳定、好上手,成本还低,完全满足日常需求
基于S7-200 PLC和组态王火灾报警控制系统 我们主要的后发送的产品有,带解释的梯形图接线图原理图图纸,io分配,组态画面咱先从最基础的IO分配说起,直接给大家上我常用的分配表(都是经过3个项目验证的,靠谱…...
将嵌套循环中的Java对象数组转换为HashMap以优化性能
本文旨在指导开发人员如何通过将嵌套循环转换为Hashmap来优化Java代码的性能,特别是当涉及到对象属性的相等性检查时。通过使用Hashmap的快速搜索特性,可以显著降低时间复杂性,提高代码执行效率。本文将提供详细的步骤和示例代码,…...
VirtualBox虚拟机磁盘空间分配技巧:如何用动态分配40G空间玩转Debian 12
VirtualBox磁盘空间动态分配实战:以Debian 12为例的40GB高效配置指南 在虚拟化技术日益普及的今天,VirtualBox作为一款开源免费的虚拟化工具,凭借其跨平台特性和易用性,成为众多开发者和技术爱好者的首选。然而,许多用…...
别再手动折腾了!用Docker一键部署Oracle 11g开发环境(附阿里云镜像地址)
告别繁琐配置:Docker容器化Oracle 11g开发环境实战指南 每当新项目需要搭建Oracle开发环境时,开发者们总会面临相同的困境——数小时的安装配置、复杂的系统依赖、难以复现的环境问题。传统安装方式不仅消耗宝贵时间,更可能因系统差异导致团…...
3D打印桥接工具:从设计到输出的全流程优化
3D打印桥接工具:从设计到输出的全流程优化 【免费下载链接】sketchup-stl A SketchUp Ruby Extension that adds STL (STereoLithography) file format import and export. 项目地址: https://gitcode.com/gh_mirrors/sk/sketchup-stl SketchUp STL插件是连接…...
计算机毕设 java 基于 Android 的医疗预约系统的设计与实现 SpringBoot 安卓智能医疗预约挂号平台 JavaAndroid 医患预约诊疗管理系统
计算机毕设 java 基于 Android 的医疗预约系统的设计与实现 53m069,末尾的数字和英文也要加上 (配套有源码 程序 mysql 数据库 论文)本套源码可以先看具体功能演示视频领取,文末有联 xi 可分享随着信息技术的飞速发展和医疗需求的…...
SELF-REFINE in Action: Enhancing LLM Outputs Through Iterative Self-Feedback
1. 什么是SELF-REFINE?为什么LLM需要自我迭代? 想象一下你正在写一封重要邮件。第一稿可能直接了当但缺乏礼貌,经过几次修改后,措辞变得更加得体。这就是人类通过自我反馈不断完善的过程。现在,大型语言模型࿰…...
