一文了解Redis

news2025/4/7 9:09:42

一.什么是Redis

与MySQL一样,Redis也是客户端服务器结构的程序,是基于内存的键值对存储系统,属于NoSQL的一种。与很多键值对数据库不同的是,Redis 中的值可以是由 string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、 Bitmaps(位图)、HyperLogLog、GEO(地理信息定位)等多种数据结构和算法组成,因此 Redis可以满⾜很多的应⽤场景。

Redis有很多优势

首先,Redis是基于内存进行存储的,也就是说Redis将数据存储到内存上,然而MySQL是将数据存储到硬盘上,我们知道cpu访问内存的速度比访问硬盘的速度快很多

有人可能会说,Redis是存储在内存中,但是定义变量不也是在内存中存储吗?那为啥还要使用Redis呢?其实Redis主要是在分布式系统中发挥威力,单机程序中使用变量才更方便。因为,我们知道,进程间具有隔离性,进程间的通信需要经过网络,而Redis就是基于网络的,它可以将自己内存中的变量给别的进程甚至别的主机上的进程使用

Redis虽然比MySQL快很多,但是它有一个缺点就是存储空间小。那怎么就能够又大又快呢?那就是Redis与MySQL配合使用,把Redis当作cache缓存,而MySQL还是主要的存储介质,全量数据依然存放在MySQL中,将常被访问到的热点数据存到Redis中,减少访问MySQL的次数。但这也是有代价的,那就是系统的复杂程度大大提高,而且在修改数据时会涉及到Redis与MySQL同步的问题

Redis初心是用作一个消息中间件(消息队列)来实现分布式系统下的生产者消费者模型,但现在很少使用Redis当作消息队列

二.Redis特性

1.In-memory Data Structures

在内存中存储数据。

MySQL是通过表的方式在硬盘中存储,是关系型数据库;而Redis则是通过键值对的方式在内存中存储数据

2.Programmability

Redis的可编程性。

使用Lua和Redis函数来扩展Redis

Redis 提供了一个编程接口,可让我们在服务器本身上执行自定义脚本。在 Redis 7 及更高版本中,可以使用 Redis 函数 来管理和运行脚本。在 Redis 6.2 及更低版本中,可以使用 Lua 脚本和 EVAL 命令 对服务器进行编程。

什么是脚本?Redis 中的可编程性一词意味着能够由服务器执行任意用户定义的逻辑。我们将这样的逻辑片段称为脚本

使用脚本可以减少网络开销。原本5次请求可以放到一次请求中,通过一个脚本同时传输给Redis,这样就可以在一次网络通信中完成5次访问Redis的操作。减少网络开销,提高了整体性能。

3.Extensibility

Redis的可扩展性

可以在Redis原有的功能的基础上再进行扩展。Redis提供了一组API,通过C、C++、Rust这几个语言编写Redis扩展(本质上是一个动态链接库),通过扩展能够让Redis使用更多的数据结构。

4.Persistence

持久化

Redis是将数据存储在内存上,但实际上内存中的数据是容易丢失的,会随着进程退出/系统重启而丢失

因此Redis也会将数据存储在硬盘上作为备份,内存为主硬盘为辅,Redis重启时就会加载硬盘中的数据到内存中

5.Clustering

集群

Redis作为一个分布式系统的中间件,能够支持集群是很关键的。一个Redis能存储的数据是有限的,所以引入多个主机,部署多个Redis节点,每个Redis存储数据的一部分,就可以解决问题

6.High availability

高可用

核心:冗余/备份

Redis自身支持主从结构,也就是主从复制架构。Redis提供了复制功能,实现了多个相同数据的Redis副本,从节点就是主节点的备份。主节点挂了,从节点就能够立马补上

7.快

为什么redis快?

1.数据在内存中存储,就比访问硬盘的数据库快

2.Redis的核心功能斗志较简单的逻辑,仅仅是较简单的操作内存的数据结构

3.网络角度:Redis使用了IO多路复用的方式(使用一个线程管理很多个socket,也就是一个线程中可以执行多个请求,或者说一次请求可以完成之前的多次请求的任务)

4.线程角度:Redis使用单线程模型,减少了不必要的线程之间的竞争开销。

为什么Redis不适用多线程呢?多线程不是可以提高效率吗?这就要挖掘本质了,多线程能够提效的前提就是这是一个CPU密集型任务,使用多个线程可以充分利用多核cpu资源。但Redis的核心任务主要是操作内存数据结构,不会吃很多cpu,所以此时使用多线程就起不到作用。

5.Redis使用C语言开发,更贴近操作系统,所以快。(这一条待定,毕竟MySQL也是C语言开发的)

三.Redis使用场景

1.Real-time data store

将Redis当作实时存储的数据库。

大多数情况下,考虑到数据存储,优先考虑“大”,但仍有些场景需要考虑快

例如:搜索引擎的广告搜索(商业搜索),对性能要求就非常高,需要在很短的时间内将与用户输入关键字相关的广告找到并显示到网页上。这种情况下就不适合使用MySQL这样的数据库存储广告到硬盘中,而是要存储到内存中从而提高访问速度,用到的就是类似于Redis这样的内存数据库来完成,当然,使用这样的内存数据库存储大量的数据,需要不少的硬件资源。

2.caching

使用数据库存储数据,虽然存的多,但是非常慢。

然而数据的访问一般都遵循二八原则:20%的数据可以满足80%的访问。

所以可以将MySQL中的热点数据拎出来,存到Redis中,此时Redis只存部分数据,而MySQL依然存储全量数据。访问时,先从Redis中查找,实在找不到再去MySQL中找,减少了访问mysql的次数,从而提高性能。这就相当于将Redis作为cache缓存。

3.session storage

session storage 会话存储。在之前,session都是存储在应用服务器上

如上,第一次请求,请求发送到了A,产生了一个会话,第二次请求,可能发到了B,就又得重新登陆。这如何解决?

方法一:让负载均衡器把同一个用户的请求始终达到同一个机器上,这需要使用userid之类的方式来配合

方法二:把会话拎出来放到同一台机器上(就比如Redis),每个应用服务器都从Redis上读取会话。(好处:即使应用程序重启了,会话也不会丢失)

4.streaming&messaging

Redis可作为消息队列(服务器)

基于此,可实现一个网络版本的生产者消费者模型(以前写的都是单机的生产者消费者模型)。在分布式系统中,服务器与服务器之间,优势也需要使用到生产者消费者模型(优势:解耦合。削峰填谷)

Redis不可以做什么?Redis不可以大规模存储数据

四.Redis本质

与MySQL相同,Redis也是客户端服务器结构的程序。

Redis服务器是Redis的本体。

Redis客户端有很多种形态

1.自带了命令行客户端 redis-cli,在Linux上直接输入redis-cli就可以启动Redis客户端;或者输入redis-cli -h (ip地址) -p (端口号),从而指定ip和端口号,例如 redis-cli -h 127.0.0.1 -p 6379

2.图形化界面的客户端:如桌面程序,web程序(网页),图形化程序依赖windows系统,而未来实际工作中,用来办公的windows系统连接到服务器可能会有诸多限制,你的图形化界面客户端能否连接到你们服务器里面的redis,是个未知数

3.基于redis的api自行开发的客户端(是工作中的主要形态),类似于MySQL的C语言api和JDBC编程

五.Ubuntu安装redis

在linux上安装程序,必须在root用户下

1.su  切换到root用户

2.apt search redis   使用apt命令搜索Redis相关软件包

3.apt install redis 安装redis

4.netstat -anp | grep redis 查看redis所使用的端口号

由图可知,它默认使用6379这个端口号

但上面使用的是127.0.0.1这个ip,需要修改

5.修改redis配置项

redis相关配置都在redis配置文件redis.conf中,它放在/etc/redis这个目录下,如下通过vim编辑器,将下面三个地方进行修改:

首先,在vim编辑器中按/键进入搜索模式,搜索关键字bind,将后面的127.0.0.1改成0.0.0.0,表示任何ip都可以访问我的redis服务器

其次,找到protected-mode 改为no,以便于可以跨主机访问

6.修改完成后,重启redis服务器

没有提示说明重启成功,如果担心未重启,可以通过service redis-server status来查看redis服务器的运行状态

active running说明正常运行

7.redis-cli  使用redis自带的客户端来连接服务器

8.如何退出redis:ctrl+d,相当于输入EOF

9./var/lib/redis是redis的工作目录  /var/log/redis是redis的日志目录,redis-server.log就是redis的日志

10.service redis-server stop 停止redis服务

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

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

相关文章

Debain12 离线安装docker

官网教程&#xff1a;https://docs.docker.com/engine/install/debian/ 步骤 1. 解压 docker-deb.7z 安装包并上传Linux &#xff08;资源在PC端文章顶部&#xff09; 2. 安装 .deb 包 sudo dpkg -i ./containerd.io_<version>_<arch>.deb \./docker-ce_<vers…

AI机器人公众号小程序h5源码开源交付支持二开黑色风格版本

AI机器人系统对接OPENAI&#xff1a;开启智能新纪元 更新全新UI、新增全家桶模块、新增热榜板块、支持语音朗读、支持快速回答、支持AI绘图、支持文字一键生成图、支持导出pdf、支持导出word、支持导出文字、支持快速响应、支持中英翻译、支持markdown &#x1f680;一、引言…

[SWPUCTF 2022 新生赛]ez_1zpop(php反序列化之pop链构造)

[SWPUCTF 2022 新生赛]ez_ez_unserialize <?php class X {public $x __FILE__;function __construct($x){$this->x $x; }function __wakeup(){if ($this->x ! __FILE__) {$this->x __FILE__; }}function __destruct(){highlight_file($this->x);//flag is…

1秒揭秘:APP对接广告联盟,收益翻倍!

在当前数字时代&#xff0c;移动应用&#xff08;APP&#xff09;成为连接用户与服务的重要桥梁。 许多开发者通过开发APP并接入广告联盟&#xff0c;成功实现了收益的快速增长。 然而&#xff0c;对于初学者而言&#xff0c;从零开始开发一款能够有效对接广告联盟的APP&…

怎么学习汇川Codesys PLC教程?

前言 各位好&#xff0c;我在B站和抖音上都有发布视频的&#xff0c;搜索我的名称“阿凡工控分享”即可。在CSDN上发表文章也是想把我的一点见解和经验分享出来&#xff0c;进一步的方便大家进行学习。 我是正文 本文主要也是为了方便大家学习汇川的Codesys PLC而制作的&…

【前端项目笔记】1 登录与登出功能实现

项目笔记 ☆☆代表面试常见题 前后端分离&#xff1a;后端负责写接口&#xff0c;前端负责调接口。 登录/退出功能 登录业务流程 登录页面&#xff1a;用户名密码 调用后台接口进行验证 通过验证&#xff0c;根据后台响应状态跳到项目主页 登录业务相关技术点&#xff1…

5.6 探讨软件系统的三高设计和容错机制设计

一、引言 1. 软件系统的重要性 软件系统的三高性能设计和容错性设计是非常重要的&#xff0c;因为它们直接影响着系统的可用性、可靠性和效率。以下是它们的重要性&#xff1a; 1. 高性能设计&#xff1a;高性能设计意味着系统能够在高负载和大并发情况下仍能保持良好的响应…

【YOLOv8改进[CONV]】使用MSBlock二次创新C2f模块实现轻量化 + 含全部代码和详细修改方式 + 手撕结构图 + 轻量化 + 涨点

本文将使用MSBlock二次创新C2f模块实现轻量化,助力YOLOv8目标检测效果的实践,文中含全部代码、详细修改方式以及手撕结构图。助您轻松理解改进的方法,实现有效涨点。 改进前和改进后的参数对比: 目录 一 MSBlock 二 使用MSBlock二次创新C2f模块实现轻量化 1 整体修改 …

为什么高考志愿只选计算机专业?

刚刚高考结束&#xff0c;不知道各位学弟学妹考的怎么样啊&#xff1f; 高考毕竟是对十二年寒窗苦读的评判&#xff0c;也是很多人改变命运的机会。很多同学每天等待出分的过程很煎熬&#xff0c;既吃不好也玩不好&#xff08;os&#xff1a;这种同学还挺多的&#xff09;。 但…

万字长文讲解Linux内存管理:伙伴系统

1. buddy system简介&#xff1a; 伙伴系统是内核中用来管理物理内存的一种算法&#xff0c;我们知道内存中有一些是被内核代码占用&#xff0c;还有一些是被特殊用途所保留&#xff0c;那么剩余的空闲内存都会交给内核内存管理系统来进行统一管理和分配。 内核中会把内存按照…

php redis分布式锁

一&#xff0c;概念 在PHP中实现分布式锁通常可以使用数据库、缓存系统&#xff08;如Redis&#xff09;或者其他中央存储系统来保证在分布式系统中的数据一致性与同步。秒杀下单、抢红包等等业务场景&#xff0c;都需要用到分布式锁。 常规方案大概有七中 方案一&#xff1a;…

uniapp小程序计算地图计算距离

我们拿到自身和目标距离经纬度 调用此方法即可计算出自身与目标的距离 最后我所展示的页面如下 具体效果可能会有点偏差 要求严格的可以在精细的计算一下

2024版CorelDRAW中文破解授权码激活码!立即下载CorelDRAW中文版终身永久破解下载攻略

在设计领域&#xff0c;CorelDRAW一直以其强大的图形编辑和矢量绘图功能而受到专业用户的青睐。随着CorelDRAW 2024的发布&#xff0c;设计师们迎来了更加丰富的工具和更新的功能&#xff0c;使得创意实现更为轻松和精准。对于追求成本效益的用户而言&#xff0c;CorelDRAW 202…

港口企业需要什么样的替代FTP软件进行传输?

随着港口货物吞吐量的显著增长&#xff0c;信息交换的需求也随之大幅增加&#xff0c;这对港口的物流处理能力构成了挑战&#xff0c;同时也对数据传输的效率提出了更高的标准。历史上&#xff0c;FTP因其用户友好性&#xff0c;在众多港口企业中承担着关键的文件传输任务。但是…

LeetCode 算法: 旋转图像c++

原题链接&#x1f517;&#xff1a; 旋转图像 难度&#xff1a;中等⭐️⭐️ 题目 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图…

Kali之metasploit学习

目标&#xff1a;尝试使用metasploit制作一个windows 后门&#xff08;exe文件&#xff09; 一&#xff1a;使用metasploit生成一个exe安装包。 二、将对应的可执行文件放入到目标机 python3 -m http.server 端口号&#xff1a; 模块化启动一个端口。 windows 证书管理工具&…

Codeforces Global Round 26 D. “a“ String Problem 【Z函数】

D. “a” String Problem 题意 给定一个字符串 s s s&#xff0c;要求把 s s s 拆分成若干段&#xff0c;满足以下要求&#xff1a; 拆分出来的每一个子段&#xff0c;要么是子串 t t t&#xff0c;要么是字符 a a a子串 t t t 至少出现一次 t ≠ " a " t \ne…

机器学习分类及算法

1. 深度学习 1.1学习算法 1.2基本术语和概念 1.3机器学习分类常用算法 1.3.1线性回归 1.3.2逻辑回归 1.3.3决策树 1.3.4朴素贝叶斯 1.3.5支持向量机SVM 1.3.6K-最近临邻KNN 还有K-均值&#xff08;k-means&#xff09;、随机森林、降维、人工神经网络等 1.4超参数和验证集 1.4.…

【必会面试题】Java异常类型

目录 在Java中&#xff0c;异常和错误都继承自java.lang.Throwable类&#xff0c;这是Java异常处理机制的基础类。Throwable类有两个主要的子类&#xff1a;Exception&#xff08;异常&#xff09;和Error&#xff08;错误&#xff09;。 Error&#xff08;错误&#xff09;: …

MySQL之高级特性(三)

高级特性 分布式(XA)事务 存储引擎的事务特性能够保证在存储引擎级别实现ACID,而分布式事务则让存储引擎级别的ACID可以扩展到数据库层面&#xff0c;甚至可以扩展到多个数据库之间——这需要通过两阶段提交实现。MySQL5.0和更新版本的数据库已经开始支持XA事务了。XA事务中需…