Redis篇-1--入门介绍

news2024/12/23 19:33:56

1、Redis概述

‌Redis(Remote Dictionary Server),全称为远程字典服务。‌是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。

Redis提供了多种数据类型的存储,来适应不同场景下的存储需求。并提供多种语言的API,兼容多种方式的集成。

Redis是一种 NoSQL(not-only sql,泛指非关系型数据库)的数据库,可以用作数据库、缓存、消息中间件、分布式锁等。

2、主要特点

(1)、基于内存

redis是内存数据库,即所有的数据都保存在内存中。所以redis的读写速度相比传统数据库基于磁盘IO的模式来说会快上很多,支持并发 10W QPS(每秒查询量),性能优秀。

(2)、I/O多路复用机制

Redis 是一个高性能的内存数据库,它的核心设计之一就是使用 I/O 多路复用来处理大量的客户端连接。它可以在一个线程中同时处理多个客户端请求,避免了为每个客户端创建独立的线程或进程,从而减少了上下文切换的开销,提高了系统的并发性和性能。
理解:redis是通过一个线程来处理多个客户端的请求(通过 I/O 多路复用实现),意在减少CPU上下文的切换,提升系统的并发性和性能。

重点概念理解下:

1、什么是文件描述符?

文件描述符: 是操作系统为每个打开的文件、套接字、管道等 I/O 资源分配的一个整数标识符。它用于唯一标识进程与某个 I/O 资源之间的连接。
文件描述符是操作系统内核管理 I/O 资源的方式,应用程序通过文件描述符与这些资源进行交互。

简单理解下:
一个进程可以访问多个文件(或其他网络终端或通道连接等)资源,这些访问都需要进程与文件建立连接后才能进行数据传输。操作系统为了能清晰区分这些连接,不导致数据传输错乱,会给每一个的这种连接(进程和文件通信)都添加一个唯一整数标识,就是文件描述符。

如:一个快递站可以给人发快递(快递站如:操作系统),每个人通过快递站给别人寄快递(寄快递如:建立传输连接),快递站需要对这次寄件添加唯一的快递单号(快递单号如:添加文件描述符),这样才能保证寄件的安全对吧。

2、有哪些类型的文件描述符?

(1)、文件:普通文件(如文本文件、图片文件等)。
(2)、套接字:网络连接(如 TCP/UDP 连接)。
(3)、管道:进程间通信的通道。
(4)、设备:如终端、打印机等硬件设备。

(3)、存储方式(key-value)

Redis存储数据都是基于key-value方式,类似于HashMap,其查找和操作的时间复杂度都是O(1)。

(4)、多数据结构支持

Redis提供了丰富的数据类型支持(5+3+1)。这里先介绍下,在后续会有详细示例。
1、String(字符串):最基本的类型,可以存储字符串、整数或浮点数。支持原子的递增和递减操作。
2、List(列表):双端链表,可以从两端插入和删除元素。适用于队列和栈的实现。
3、Set(集合):无序集合,成员是唯一的。支持交集、并集、差集等集合运算。
4、Sorted Set(有序集合):类似于集合,但是每个成员关联一个分数,可以根据分数排序。
5、Hash(哈希表):类似于 Java 中的 HashMap,可以存储字段和值的映射关系。适用于对象的存储。
6、Bitmaps(位图):一种特殊的字符串类型(2进制串),可以用来表示布尔数组,支持高效的位操作。
7、HyperLogLog(基数):用于估算集合中不同元素的数量,具有很高的空间效率。
基数:大规模数据集中的不同元素。(如:1,2,5,2,3的不同元素为1,2,3,5,即基数为4)。
8、Geospatial Indexes(地理空间索引):支持地理坐标点的存储和查询,可以计算两点之间的距离、查找附近的点等。
9、Streams(流):引入于 Redis 5.0,是一种类似消息队列的数据结构,支持消费组和消息回溯等功能。

(5)、支持事务

Redis 提供了简单的事务机制,Redis 事务的本质是一组命令的集合。当执行redis事务时,即一次性按照添加顺序依次执行这些命令,中间不会被打断或者干扰。

Redis 的事务机制并不像关系型数据库中的事务那样提供完整的ACID特性(原子性、一致性、隔离性和持久性),但它确实提供了一种方式来确保一组命令作为一个整体被执行。

(6)、发布/订阅(Pub/Sub)

Redis 发布/订阅(Publish/Subscribe,简称 Pub/Sub)是一种消息传递模式,允许客户端订阅一个或多个通道(channel),并接收其他客户端发布到这些通道的消息。

实现该模式,主要包含3个部分:
1、发布者(Publisher):发布者可以向指定的通道发送消息。每个消息会被发送给所有订阅了该通道的客户端。
2、订阅者(Subscriber):订阅者可以订阅一个或多个通道,并接收订阅通道的消息。订阅者不会直接与发布者交互,它们只负责监听通道中的消息。
3、通道(Channel):通道是消息传递的媒介。发布者将消息发布到特定的通道,订阅者从这些通道接收消息。通道的名字是一个字符串,可以是任意的标识符。

(7)、持久化

前面也说过redis是基于内存的数据库,基于内存大大优化了性能问题。但也面临着意外的风险,比如突然停电或者意外宕机了,重启电脑后内存中的数据就都不存在了!所以为了数据安全一定要做持久化处理(将数据写入到磁盘中),这样即使宕机后重启也可以通过持久化文件将数据恢复。

Redis 的持久化的两种方式:
RDB(默认):快照形式是直接把内存中的数据保存到 dump.rdb 文件中,定时全量保存,保存的是数据。
AOF:把所有的对 Redis 的服务器进行修改的命令都保存到 appendonly.aof 文件中,定时向文件中追加,保存的是命令。

(8)、主从复制/读写分离

主从复制是 Redis 提供的一种数据冗余机制,允许你创建一个或多个从服务器(Slaves),它们会实时地复制主服务器(Master)的数据。这样可以在主服务器发生故障时提供备份,并且可以分担读取请求的负载,提高系统的整体性能。

读写分离是指将写操作定向到主服务器,而将读操作分散到从服务器上。这有助于减轻主服务器的压力,提升读取性能,因为通常读操作比写操作更频繁。

示例图如下:
在这里插入图片描述
原理:
数据同步原理:当主服务器接收到写操作时,它会将这些更改记录到自己的命令日志中(称为 AOF 或 RDB 文件)。然后,主服务器会将这些更改发送给所有连接的从服务器,从服务器接收并应用这些更改。完成数据同步主要分为两个过程:
(1)、初次同步(全量同步):当一个新的从服务器加入时,它会与主服务器进行全量同步,即从服务器会下载主服务器的一个快照(RDB 文件),并将其加载到内存中。之后,它会继续接收增量更新。
(2)、持续同步(增量同步):在初次同步完成后,从服务器会持续接收来自主服务器的命令,以保持数据的一致性。

配置方式:
在 redis.conf 中设置 slaveof 来指定主服务器的 IP 和端口。

(9)、哨兵机制(Sentinel)

Redis 哨兵机制(Sentinel)是一个监控和故障转移的机制,用于管理 Redis 主从架构中的节点,以提升redis系统整体的可用性,即实现redis高可用性。
它会自动监控主服务器和从服务器的状态,并在主服务器不可用时自动执行故障转移,选择一个健康的从服务器晋升为主服务器。
在这里插入图片描述
工作原理:
(1)、节点监控:Sentinel 持续监控主服务器和从服务器的心跳,以检测它们的健康状态。
(2)、故障通知:当 Sentinel 检测到主服务器不可用时,它会通知其他 Sentinel实例和客户端。
(3)、选举和故障恢复:如果大多数 Sentinel 实例同意主服务器已经失效,它们会投票选出新的主服务器。然后,选中的从服务器会被晋升为主服务器,其余的从服务器会重新配置为新主服务器的从服务器,继续完成工作。
(4)、配置更新:Sentinel 会自动更新客户端的配置信息,使它们能够正确地连接到新的主服务器。

配置方式:
在sentinel.conf文件中定义哨兵实例的配置,包括主服务器的地址、哨兵之间的通信端口等。

(10)、集群(Cluster)

Redis 集群(Cluster)是 Redis 的分布式解决方案,它允许你将数据分布在多个节点上,从而实现水平扩展。集群通过分片(Sharding)技术将键空间划分成多个片段,每个片段由不同的节点负责存储。此外,集群还支持自动故障转移和数据冗余。

工作原理:
(1)、分片:Redis Cluster使用哈希槽(hash slots)来分配键。共有16384个哈希槽,每个键根据其哈希值映射到一个具体的槽,而每个槽可以被分配给任意一个节点。
(2)、故障转移:每个节点都可以有多个从节点,用于提供冗余。如果主节点失败,集群会自动将一个从节点晋升为主节点。
(3)、一致性哈希:客户端在发送请求时,需要计算键对应的哈希槽,然后根据当前的槽-节点映射找到正确的节点。如果槽-节点映射发生变化(例如因为故障转移),客户端需要更新其本地缓存。
(4)、容错能力:即使某些节点失效,只要大多数节点仍然可用,集群就可以继续工作。

配置:
(1)、使用 redis-cli --cluster create 命令来初始化一个新的 Redis Cluster。
(2)、每个节点的 redis.conf 文件中需要启用集群模式(cluster-enabled yes),并配置集群公告 IP 和端口(cluster-announce-ip 和 cluster-announce-port)。

(11)、Lua脚本

Redis 支持使用 Lua 脚本来执行复杂的操作,这为 Redis 提供了更强的灵活性和性能优化能力。通过 Lua 脚本,你可以在服务器端执行一系列命令,而不需要多次往返客户端与服务器之间,从而减少了网络延迟并提高了效率。此外,Lua 脚本是原子性的,这意味着在脚本执行期间,其他客户端的请求不会被处理,确保了数据的一致性。

(12)、丰富的客户端库

Redis 拥有几乎所有编程语言的客户端库,方便开发者集成到各种应用中。

3、单线程模型

Redis 采用单线程模型来处理客户端请求,这意味着在任意时刻只有一个命令被执行。这种设计简化了 Redis 的实现,并确保了高并发环境下的数据一致性。尽管 Redis 是单线程的,但它通过高效的内存管理和网络 I/O 操作,仍然能够处理非常高的吞吐量。
在这里插入图片描述
上图即为redis的请求处理流程。可以看到redis接收到用户的请求后,全部推送到一个队列里,然后交给文件事件分派器,而它是单线程的工作方式,所以说 Redis 是单线程的。

4、默认配置

(1)、默认的数据库:redis总共有16个数据库,不指定的话默认连接第0个数据库。每个数据库的数据不共享。

(2)、key和value的限制:
Redis 对键(key)和值(value)的大小以及使用个数有一定的限制,这些限制旨在确保 Redis 的性能和稳定性。
长度限制:
redis的key和value的最大长度上限都是512M。当key大于10k时,称得上是大key。通常建议将键的长度保持在合理的范围内(例如 64 字节以内),以确保高效的内存使用和快速的查找。
数量限制:
Redis 没有明确的键数量限制,理论上可以存储 2^64 - 1 个键(即 18,446,744,073,709,551,615 个键)。然而,实际的键数量取决于你的硬件资源(如内存、CPU 等)和 Redis 的配置。

1byte(字节)= 8bit(位),1k = 1024byte,1M = 1024k,1G = 1024M,bit = 字节,一个汉字占2个bit,一个英文(不区分大小写)占1bit,中文标点占3个bit,英文占1个bit。

学海无涯苦作舟!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2257788.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

游戏引擎学习第35天

开场介绍 今天的任务是继续改进一个虚拟的瓦片地图系统,使其适合处理更大的世界。我们希望这个系统能管理大范围的游戏世界,其中包含按需存储的小区域。昨天,我们介绍了“内存区域”的概念,用于管理持久性存储。我们计划今天继续…

Apache Echarts和POI

目录 Apache ECharts 介绍 入门 绘制一个简单的图表 Apache POI 介绍 通过POI创建Excel文件并且写入文件内容 通过POI读取Excel文件中的内容 导出Excel表格 Apache ECharts 介绍 Apache ECharts 是一款基于 Javascript 的数据可视化图表库,提供直观&#xf…

怎么配置点击deploy就能把jar包直接打到nexus私库上,以及怎么配置从私库下载jar包

一.怎么配置点击deploy就能把jar包直接打到nexus私库上 方式一:在pom文件配置私库地址 1.第一步,在pom文件配置仓库地址,用于 deploy 上传 releases 对应正式版的仓库 snapshots 对应快照版的仓库 如果你打的jar包是以 -SNAPSHOT 结尾的, 那么就会…

基于最新的Apache StreamPark搭建指南

一、StreamPark 的介绍 官方文档:Apache StreamPark (incubating) | Apache StreamPark (incubating) 中文文档:Apache StreamPark (incubating) | Apache StreamPark (incubating)Github地址:https://github.com/apache/incubator-streampark Apache StreamPark™ 是一个…

数字IC后端实现常见的physical only cell都有哪些?如何添加这些cell?

数字IC后端实现阶段常见功能cell有哪些?比如AND,AOI,NAND等。 physical cell有哪些?都是干什么用的? 数字后端零基础入门系列 | Innovus零基础LAB学习Day9 (1) well tap cells:防止…

Promise详解-1:初识Promise

最近在回顾ES6的知识,想整理下跟Promise相关的内容。我准备整一个Promise解读的系列,看看能深入到什么程度吧。由浅入深,先认识下Promise。 痛苦的回忆:回调地狱 假如现在让你维护一个“古老”的项目,缺少脚手架的加…

【css】基础(一)

本专栏内容为:前端专栏 记录学习前端,分为若干个子专栏,html js css vue等 💓博主csdn个人主页:小小unicorn ⏩专栏分类:css专栏 🚚代码仓库:小小unicorn的代码仓库🚚 &a…

共享GitLab中CICD自动生成的软件包

0 Preface/Foreword 1 分享软件包地址 为了方便给接收对象方便下载固件,在下载固件时候,而无需打开网页,直接输入地址,弹出的对话框是将固件另存为。 或者进入CICD页面,找到job,在Download的标签上单击右键…

【云贝教育Linux技术文章】CentOS停止维护后如何获取redhat 8.0 yum源?详细操作指南!

本文为云贝教育 刘老师 原创,请尊重知识产权,转发请注明出处,不接受任何抄袭、演绎和未经注明出处的转载。 众所周知,centos 7 在2024年6月30日,生命周期结束,官方不再进行支持维护,而很多环境一…

泷羽sec学习打卡-brupsuite5

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都 与本人无关,切莫逾越法律红线,否则后果自负 关于brupsuite的那些事儿-web抓包和app抓包 常见的抓包工具有哪些?web抓包app抓包Android抓…

Nanolog起步笔记-9-log解压过程(3)寻找meta续

Nanolog起步笔记-9-log解压过程-3-寻找meta续 当前的目标新的改变decompressNextLogStatementmetadata查看业务面的log语句注释掉 runBenchmark();改过之后,2条记录之后,这里就直接返回了 小结 当前的目标 没有办法,还要继续。 当前的目标&a…

Flask使用长连接(Connection会失效)、http的keep-alive、webSocket。---GPU的CUDA会内存不足报错

Flask Curl命令返回状态Connection: close转keep-alive的方法 使用waitress-serve启动 waitress-serve --listen0.0.0.0:6002 manage:app 使用Gunicorn命令启动 gunicorn -t 1000 -w 2 -b 0.0.0.0:6002 --worker-class gevent --limit-request-line 8190 manage:appFlask使用f…

用友U8+ API接口使用教程

前言 U8和其他的公开的开放API接口有一些差异,他是需要先对接的到代理服务器,通过代理服务器进行对接,所以只要保证U8能上网就能对接,和畅捷通T的模式有点类似 流程: 注册成为开发者(用于创建用友U8 API应…

xtu oj 1618 素数个数

文章目录 前言代码思路 前言 有点儿难&#xff0c;至少对我来说。去年考试我没写出来。 代码 #include<stdio.h> #include<stdbool.h> #include<stdlib.h>//加 math 那个头文件好像要加这个头文件&#xff0c;我之前编译错误过&#xff0c;血泪教训 #incl…

DAY3 构造函数

构造函数使用代码&#xff1a; #include <iostream> using namespace std; class Rec {const int length;int width; public:Rec():length(10){cout << "Rec无参构造函数" << endl;};Rec(int a,int b):length(a),width(b){cout << "Re…

分布式搜索引擎之elasticsearch基本使用2

分布式搜索引擎之elasticsearch基本使用2 在分布式搜索引擎之elasticsearch基本使用1中&#xff0c;我们已经导入了大量数据到elasticsearch中&#xff0c;实现了elasticsearch的数据存储功能。但elasticsearch最擅长的还是搜索和数据分析。 所以j接下来&#xff0c;我们研究下…

javaScript交互补充

1、元素的三大系列 1.1、offset系列 1.1.1、offset初相识 使用offset系列相关属性可以动态的得到该元素的位置&#xff08;偏移&#xff09;、大小等 ●获得元素距离带有定位祖先元素的位置 ●获得元素自身的大小&#xff08;宽度高度&#xff09; ●注意&#xff1a;返回的…

【49】AndroidStudio构建其他人开发的Android项目

(1)做Android软件开发&#xff0c;通常会看一些其他人开发的项目源码&#xff0c;当将这些项目的源码通过git clone到本地之后&#xff0c;用AndroidStudio进行打开时&#xff0c;通常会遇到一些环境配置的问题。本文即用来记录在构建他人开发项目源代码这一过程中遇到的一些常…

LLama系列模型简要概述

LLama-1&#xff08;7B, 13B, 33B, 65B参数量&#xff1b;1.4T tokens训练数据量&#xff09; 要做真正Open的AI Efficient&#xff1a;同等预算下&#xff0c;增大训练数据&#xff0c;比增大模型参数量&#xff0c;效果要更好 训练数据&#xff1a; 书、Wiki这种量少、质量高…

22. Three.js案例-创建旋转的圆环面

22. Three.js案例-创建旋转的圆环面 实现效果 知识点 WebGLRenderer (WebGL渲染器) THREE.WebGLRenderer 是Three.js中最常用的渲染器&#xff0c;用于将场景渲染到WebGL画布上。 构造器 new THREE.WebGLRenderer(parameters) 参数类型描述parametersObject可选参数对象&…