Redis探索之旅

目录

今日良言:有志者自有千计万计,无志者只感千难万难

一、简介

二、Redis的安装

三、Redis的简单使用

四、Redis相关知识点

1.缓存分类

2.五大基本数据类型使用

3.持久化

4.常见面试题


今日良言:有志者自有千计万计,无志者只感千难万难

一、简介

先来介绍一下什么是缓存

缓存是一个高速数据交换的存储器,使用它可以快速的访问和操作数据。

对于程序来说,如果没有使用缓存,程序的调用流程如下:

但是,随着公司的业务发展,逐步变成了多个程序调用一个数据库的情况了:

当公司业务发展到一定规模之后,最可能出现性能拼劲的地方就是数据库了,为了防止数据库被过渡的浪费,就引入了缓存,避免程序直接访问数据库,,加入缓存后,流程如下:

加入缓存以后,所有的程序不会直接调⽤数据库,而是会先调用缓存,当缓存中有数据时会直接返回,当缓存中没有数据时才去查询数据库,这样就大大的降低了数据库的压力,并加速了程序的响应速度。

 缓存优点:

1. 缓存一般都是使用key-value 查询数据的,因为不像数据库还有查询的条件等因素,所以查询的性能一般会比数据库高。

2. 缓存的数据是存储在内存的,而数据库的数据是存储在磁盘中的,因为内存的操作性能远远大于磁盘,因此缓存的查询效率会高很多;

3.缓存更容易做分布式部署,而数据库很难实现分布式部署,因此缓存的负载和性能更适合平行扩展和增加。

Redis 是常见的分布式缓存。

二、Redis的安装

1. yum 命令安装 redis

 使用以下命令,直接将 redis 安装到 linux 服务器:

yum -y install redis  

 2. 启动 redis

使用以下,以后台运行方式启动 redis

redis-server /etc/redis.conf &

这里的redis.conf 是redis的配置文件,可以在这个配置文件中修改 redis的相关配置

3. 操作redis

使用以下命令启动 redis 客户端:

redis-cli  

如果修改了 redis 的默认端口号6379,启动 redis 客户端使用如下命令:

redis-cli -p xxxx

-p后面是修改后的端口号

4. 设置远程连接

1)将 redis 配置文件下载到本地:redis 配置文件是 linux 下的 /etc/redis.conf

先切到 etc 目录下,然后找redis.conf 文件

 

2)将 redis.conf 配置文件中的 “bind 127.0.0.1” 注释。

打开 redis.conf 文件,然后找到 bind 127.0.0.1 并注释

 3)将 redis.conf 中的“protected-mode yes” 改为“protected-mode no”

4.将修改后的 redis.conf 文件上传到 etc目录下

5.使用 命令 redis-cli shutdown 先关闭服务, 再使用 redis-server /etc/redis.conf 启动 redis 服务

 注:

远程连接后,redis 的默认端口容易被入侵,云服务器也会被入侵,这就导致会有人使用你的服务器攻击别人,如下图:(博主被搞了好久,天天攻击别人)

 所以,为了安全起见,可以修改一下 redis 的端口,还是下载 redis.conf 文件,然后修改里面配置,找到 port,修改默认端口 6379 为别的端口:

修改了端口号以后,需要在云服务器的防火墙那里开放这个端口。 

 然后再新增一个密码:

找到   requirepass foobared  然后注释掉,再新增:

requirepass 你的密码

 然后再重复 上述 4)  5) 步。

此时,使用 redis-cli -p 端口号 打开客户端:

 此时还需要输入密码:

auth 后面跟上刚才新增的密码

出现 OK 后,即可使用本地redis 

 

 可以使用如下软件远程连接 redis:

 

打开后:

 

 然后即可连接成功。

三、Redis的简单使用

四、Redis相关知识点

1.缓存分类

缓存大致可以分类两类:

本地缓存

本地缓存也叫单机缓存,也就是说可以应用在单机环境下的缓存。所谓的单机环境是指,将服务部署到⼀台服务器上,如下图:

本地缓存的特征是只适用于当前系统。
常见本地缓存有:Spring Cache、MyBatis 的缓存等。

分布式缓存

分布式缓存是指可以应⽤在分布式系统中的缓存。所谓的分布式系统是指将⼀套服务器部署到多台服务器,并且通过负载分发将⽤户的请求按照⼀定的规则分发到不同服务器,如下图:

 常见的分布式缓存有: Redis 和 Memcached。

Redis 和 Memcached 的区别如下:

1. 存储方式不同:memchched 把数据全部存到内存之中,断电后会挂掉,数据不能超过内存大小。redis 有部分存到硬盘中,这样能保持数据的持久性。

2. 数据支持类型: memcached 对数据类型支持相对简单,redis 有复杂的数据类型。

3. 存储值大小不同:redis 最大可以达到 512mb,memcached 只有 1mb。

通常情况下,如果是单机 Spring 项⽬,会直接使⽤ Spring Cache 作为本地缓存,如果是分布式环境⼀般会使⽤ Redis。

2.五大基本数据类型使用

Redis 有五大基本数据类型:

String     字符串类型

Hash      字典类型

List         列表类型

Set         集合类型

ZSet       有序集合类型

其中最常用的是 字符串类型和 字典类型。

String     字符串类型

字符串类型,它是以键值对 key-value 的形式进行存储的,根据 key 值获取 value 值,它的使用相对比较简单,但是实际项目中应用非常广泛。
字符串的使用如下:

 

Hash      字典类型

字典类型又被称为散列表或者是哈希表类型,它是将一个键值 key 和一个特殊的“哈希表”关联起来,这个“哈希表”包含两列数据:字段和值,它就相当于 Java 中的 Map<String,Map<String,String>> 结构,同时,这里的字典类型又很像 Java 中的会话。

字典类型的使用如下:

通常情况下,字典类型会使用数组的方式来存储相关的数据,但发生哈希冲突时才会用链表的结构来存储数据。

List         列表类型

列表类型是一个使用链表结构存储的有序结构,它的元素插入会按照先后顺序存储到链表结构中,因此它的元素操作(插入和删除),时间复杂度为O(1),所以相对而言它的速度还是比较快的,但是它的查询操作的时间复杂度为 O(n),因此查询可能会比较慢。

列表类型的使用如下:

 列表的典型使用场景有两个:

1)消息队列

2)文章列表

Set         集合类型

集合类型 是一个无序并唯一的键值集合。

集合类型的使用如下:

集合类型和列表类型的区别如下:

1)列表可以存储重复元素,集合只能存储非重复元素。

2)列表是按照先后顺序存储元素的,而集合是无序方式存储元素的。

ZSet       有序集合类型

有序集合类型(Sorted Set)相比于集合类型多了一个排序属性 score(分值),对于有序集合 ZSet 来说,每个存储元素相当于有两个值组成的,一个是有序集合的元素值,一个是排序值。有序集合的存储元素值是不能重复的,但分值是可以重复的。

有序集合类型的使用如下:

有序集合的使用场景如下:

1)学生成绩排名。

2)粉丝列表,根据关注的先后时间排序。 

3.持久化

所谓的持久化,就是将数据从内存保存到磁盘的过程,它的目的就是为了防止数据丢失。

redis 的持久化方式有三种:

1)快照方式(RDB,Redis DataBase)

将某一时刻的内存数据,以二进制的方式写入磁盘。

RDB 的优点:

a)RDB 的内容为二进制的数据,占用内存更少,更紧凑,更适合做备份文件。

b)RDB 对容灾恢复非常有用,它是一个紧凑的文件,可以更快的传输到远程服务器进行 Redis 服务恢复。

c)与AOF 的格式相比,RDB 文件可以更快的重启。

RDB 的缺点:

a)因为 RDB 只能保存某个时间间隔的数据,如果中途 Redis 服务被以外终止了,则会丢失一段时间的 Redis 数据。

b)RDB 需要经常 fork() 才能使用子进程将其持久化到磁盘上,如果数据集很大,fork() 可能很耗时,并且,如果数据集很大且 CPU 性能不佳,则会导致 Redis 停止为客户端服务几毫秒甚至一秒钟。

2)文件追加方式(AOF,Append Only File) 

记录所有的操作命令,并以文本的形式追加到文件中。

AOF 的优点:

a)AOF 持久化保存的数据更加完整,AOF 提供了三种保存策略:每次操作保存、每秒钟保存一次、跟随系统的持久化策略保存,其中每秒保存一次,从数据的安全性和性能两方面考略是一个不错的选择,也是 AOF 默认的策略,即使发生了意外情况,最多只会丢失 1 s的数据。

b)AOF 采用的是子命令追加的写入方式,所以不会出现文件损坏的问题,即使由于某些以外原因,导致了最后操作的持久化数据写⼊了⼀半,也可以通过 redis-check-aof 工具轻松的修复。

c)AOF 持久化文件,非常容易理解和解析,它是把所有的 Redis 键值操作命令,以文件的方式存入了磁盘,即使不小心使用 fullshall 命令删除了所有键值信息,只要 AOF 文件,删除最后的 fullshall 命令,重启 Redis 即可恢复之前误删的数据。

AOF 的缺点:

a)对于相同的数据集来说,AOF 文件要大于 RDB 文件。

b)在 Redis 负载比较高的情况下,RDB 比 AOF 性能更好。

c)RDB 使用快照的形式来持久化整个 Redis 数据,而 AOF 只是将每次执行的命令追加到 AOF 文件中,因此,RDB 比 AOF 文件更健壮。

3)混合持久化方式

Redis 4.0 之后新增的方式,混合持久化是结合了 RDB 和 AOF 的优点,在写入的时候,先把当前的数据 以 RBD 的形式写入文件的开头,再将后续的操作命令以 AOF 的形式存入文件,这样既能保证 Redis 重启时的速度,又能降低数据丢失的风险。

混合持久化的优点:

结合了 RDB 和 AOF 的优点,开头为 RDB 的格式,使得 Redis 可以更快的启动,同时结合了 AOF 的优点,降低了大量数据丢失的风险。

混合持久化的缺点:

a)AOF 文件中添加了 RDB 格式的内容,使得 AOF 文件的可读性变得很差。

b)兼容性差,如果开启混合持久化,那么此混合持久化 AOF 文件,就不能用在 Redis 4.0 之前的版本。

4.常见面试题

接下来,介绍一下Redis 的相关面试题:

1)缓存雪崩

缓存雪崩指的是在短时间内,大量缓存同时过期,导致大量的用户请求直接操作数据库,从而对数据库造成了很大的压力,严重情况下可能会导致数据库宕机,这种情况称为缓存雪崩。

缓存雪崩的解决方案:

a)加锁排队

加锁排队可以起到缓冲的作用,方式大量的用户请求同时操作数据库,但它的缺点是增加了系统的响应时间,降低了系统的并发量,牺牲了一部分用户的体验。

b)随机化过期时间

为了避免缓存同时过期,在设置缓存的时候,添加随机过期时间,这样就可以极大的避免大量缓存同时失效。        

c)设置二级缓存

二级缓存指的是:除了 Redis 本身的缓存之外,再设置一层缓存,当 Redis 失效之后,先去查询二级缓存,并非直接查询数据库。

2)缓存穿透

缓存穿透指的是:查询缓存和数据库无结果,由于数据库查询无结果,出于容错考虑,不会将结果保存到缓存中,因此每次请求都会去查询数据,这种情况就叫做缓存穿透。

缓存穿透的解决方案:

缓存空结果

每次将数据库查询的数据都保存到缓存中,为了提高前台用户的使用体验(解决长时间内查询不到任何信息的情况),可以将空结果的缓存时间设置的短一些,例如:3-5分钟。

3)缓存击穿

缓存击穿指的是:某一热点缓存,在某一时刻过期,此时大量用户请求直接操作数据库,会给数据库造成巨大的压力,这种情况就叫做缓存击穿。

缓存击穿的解决方案:

a)加锁排队

和解决缓存雪崩的加锁排队的方法类似,都是在查询数据库的时候加锁排队,避免大量用户同时请求数据库,以此来减少数据库的压力。

b)设置永不过期

对于热点缓存,可以设置永不过期,这样就能包含保证数据的稳定性。但是需要注意,每次数据库的数据更改以后,需要更新热点缓存的数据,不然就会造成查询结果的误差。

4)缓存预热

缓存预热并不是一种问题,而是使用缓存时的一个优化方案,它可以提高前台用户的使用体验。

缓存预热指的是:在系统启动的时候,先把查询结果预存到缓存中,以便用户后面查询时可以直接从缓存中读取,节约用户的等待时间。

缓存预热的实现思路有三种:

a)把需要缓存的方法写到系统初始化方法中,这样系统在启动的时候就会自动的加载数据并缓存数据。

b)把需要缓存的方法挂载到某个页面或者后端接口上,手动触发缓存预热。

c)设置定时任务,定时自动进行缓存预热。

补充:

最后介绍一下 Redis 集群

随着业务的不断发展,单机 Redis 的性能已经不能满足需求了,此时需要将单机 Redis 扩展为多机服务,Redis 多机服务 主要包含以下3个内容:

1)Redis 主从同步

2)Redis 哨兵模式

3)Redis 集群服务(Redis 3.0新增功能)

 1)主从同步

主从同步(主从复制)是 Redis 高可用服务的基石,也是多机运行中最基础的一个。把主要存储数据的节点叫做主节点(master),把其它通过复制主节点数据的副本节点叫做从节点(从节点),如下图:

在Redis 中一个主节点可以拥有多个从节点,一个从节点也可以是其它服务器的主节点,如下图:

 

主从同步优点:

a)性能方面

有了主从同步之后,可以把查询任务分配给从服务器,用主服务器来执行写操作,这样极大的提高了程序运行的效率,把所有压力分摊给各个服务器。

b)高可用

当有了主从同步之后,当主服务器节点发生宕机之后,可以迅速的把从节点提升为主节点,为 Redis 服务器的宕机恢复节省了宝贵时间。

c)防止数据丢失

当主服务器的磁盘坏掉之后,其他从服务器还保留着相关的数据,不至于数据全部丢失。

主从同步的缺点:

当主节点崩溃之后,需要人工干预才能恢复 Redis 的正常使用。

 

2)Redis 哨兵模式

当主从服务器发生宕机的节点比较多的情况下,如果需要人工恢复,这样的难度和花费时间是很大的,因此,需要一个自动的工具——Redis Sentinel(哨兵模式)来把手动的过程变成自动的,让 Redis 拥有自动容灾恢复的能力。

使用哨兵模式可以用来监控主从服务器节点,并在主从服务器出现问题的时候,自动容灾恢复。

哨兵模式如下图:

 

3)Redis 集群服务(Redis 3.0新增功能)

Redis 集群(Redis Cluder)是 Redis 多机运行最完美的解决方案,它是 Redis 3.0之后推出的服务,它的出现可以让我们完全抛弃主从同步和哨兵模式来实现 Redis 多机运行。

Redis 集群 是无代理模式去中心化的运行模式,客户端发送的绝大多数命令会直接交给相关节点执行,这样大部分请求命令无需转发或者仅转发一次的情况下就能完成请求和响应,所以集群单个节点的性能与单机  Redis 服务器的性能是非常接近的,因此在理论情况下,当水平扩展一倍的主节点就相当于请求处理的性能也提高了一倍,所以 Redis 集群的性能是非常高的。

Redis 集群如下图:

Redis 集群可以有无数个主从节点,而 Redis 的主从同步只能有一个主节点,因此,Redis 集群拥有更强大的平行扩展能力,也就是说,当 Redis 集群拥有两个主节点时,从理论上来说,Redis 的性能比单机服务来说性能提高了 2 倍。


以上就是 Redis 的相关内容。      

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

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

相关文章

正运动亮相2023半导体设备材料与核心部件展示会,助力半导体产业高速高精应用

■展会名称&#xff1a; 第11届&#xff08;2023&#xff09;半导体设备材料与核心部件展示会 ■展会日期 2023年8月9日-11日 ■展馆地点 无锡太湖国际博览中心A6馆 ■展位号 A6-A361 正运动技术&#xff0c;作为国内领先的运动控制企业&#xff0c;将于2023年8月9日参加…

Visual Studio 2022安装教程(英文版)

文章目录 1.下载安装 1.下载 官网地址&#xff1a;https://visualstudio.microsoft.com/zh-hans/vs/ 选择第一个社区版本&#xff1a;Community 2022 安装 1.将下载好的文件保存到桌面&#xff0c;双击点开 2.等待visual studio installer配置好 3.点击安装后会来到配件选…

搭建本地开发服务器

搭建本地开发服务器 :::warning 注意 在上一个案例的基础上添加本地开发服务器&#xff0c;请保留上个案例的代码。如需要请查看 Webpack 使用。 ::: 搭建本地开发服务器这一个环节是非常有必要的&#xff0c;我们不可能每次修改源代码就重新打包一次。这样的操作是不是太繁琐…

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑 现在想对一个接口做性能测试&#xff0c;需要测试它多个线程并发下的调用 1.新建测试计划和线程组 略 2.新建http接口 一个完整的http接口包含请求头和请求&#xff0c;这里就需要两个组件&#xff1a;HTTP request、HT…

【iOS】RunLoop

前言-什么是RunLoop&#xff1f; 什么是RunLoop? 跑圈&#xff1f;字面上理解确实是这样的。 Apple官方文档这样解释RunLoop RunLoop是与线程息息相关的基本结构的一部分。RunLoop是一个调度任务和处理任务的事件循环。RunLoop的目的是为了在有工作的时候让线程忙起来&#…

ChatGPT实战:创业咨询,少走弯路,少踩坑

用九死一生形容创业再适合不过&#xff0c;不过一旦成功回报也很诱人&#xff0c;这也是为什么那么多人下场创业。纸上得来终觉浅&#xff0c;绝知此事要躬行&#xff0c;创过业的人都知道其中的心酸&#xff0c;而他们也建议你去创业&#xff0c;因为那真不是一般人能干的事。…

力扣17(电话号码中的字符组合)

题目表述 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例1 输入&#xff1a;digits "23" 输出&#xff1…

SpringBoot集成百度人脸识别实现登陆注册功能Demo(二)

前言 上一篇SpringBoot集成百度人脸demo中我使用的是调用本机摄像头完成人脸注册&#xff0c;本次demo根据业务需求的不同我采用文件上传的方式实现人脸注册。 效果演示 首页 注册 后端响应数据&#xff1a; 登录 后端响应数据&#xff1a; 项目结构 后端代码实现 1、Bai…

数据结构和算法——散列函数的构造方法(直接定址法、除留余数法、数字分析法、折叠法、平方取中法、ASCII码加和法、前三字符移位法)

目录 数字关键词的散列函数构造 直接定址法 除留余数法 数字分析法 折叠法 平方取中法 字符关键词的散列函数构造 ASCII码加和法 前三字符移位法 移位法 数字关键词的散列函数构造 一个“好”的散列函数一般应考虑下列两个因素&#xff1a; 计算简单&#xff0c;以…

QT生成可执行文件的步骤

QT生成可执行文件的步骤 第一步&#xff1a;debug为release&#xff0c;然后进行编译 第二步&#xff1a;添加QT生成必要的库 首先&#xff0c;建立一个新的文件夹&#xff0c;然后将Release中的可执行文件拷贝到新的文件夹中 然后&#xff0c;在新建文件夹中生成必要的库 …

Nginx(1)

目录 1.Nginx概述2.Nginx的特点3.Nginx主要功能1.反向代理2.负载均衡 1.Nginx概述 Nginx (engine x) 是一个自由的、开源的、高性能的HTTP服务器和反向代理服务器&#xff0c;也是一个IMAP、POP3、SMTP代理服务器。 Nginx是一个强大的web服务器软件&#xff0c;用于处理高并发…

别再被问倒了!Mysql索引竟然在这些情况下失灵?

嗨&#xff0c;亲爱的读者们&#xff01;小米又来啦~ 今天我们要聊一个在数据库面试中常常被问到的热门话题&#xff1a;Mysql索引失效。想要在面试中脱颖而出&#xff0c;掌握这个知识点可是必不可少哦&#xff01;废话不多说&#xff0c;咱们现在就深入剖析一下&#xff0c;看…

C#,数值计算——基于模拟退火的极小化问题单纯形(下山)算法的计算方法与C#源程序

1 模拟退火 模拟退火算法其实是一个类似于仿生学的算法&#xff0c;模仿的就是物理退火的过程。 我们炼钢的时候&#xff0c;如果我们急速冷凝&#xff0c;这时候的状态是不稳定的&#xff0c;原子间杂乱无章的排序&#xff0c;能量很高。而如果我们让钢水慢慢冷凝&#xff0c…

小研究 - 微服务系统服务依赖发现技术综述(一)

微服务架构得到了广泛的部署与应用, 提升了软件系统开发的效率, 降低了系统更新与维护的成本, 提高了系统的可扩展性. 但微服务变更频繁、异构融合等特点使得微服务故障频发、其故障传播快且影响大, 同时微服务间复杂的调用依赖关系或逻辑依赖关系又使得其故障难以被及时、准确…

pycharm中opencv库导入 cv2. 无函数提示跳出解决方法

pycharm中opencv库导入 cv2. 无函数提示跳出解决方法 1、找到当前解释器安装目录 例如&#xff1a; 2、进入D:\Python37\Lib\site-packages\cv2文件&#xff0c;进入cv2文件夹&#xff1a; 找到cv2.pyd, 把cv2.pyd复制一份&#xff0c;放到上层文件夹下&#xff0c;即site-p…

数据结构 | 二叉树的应用

目录 一、解析树 二、树的遍历 一、解析树 我们可以用解析树来表示现实世界中像句子或数学表达式这样的构造。 我们可以将((73)*(5-2))这样的数学表达式表示成解析树。这是完全括号表达式&#xff0c;乘法的优先级高于加法和减法&#xff0c;但因为有括号&#xff0c;所以在…

ffmpeg下载安装教程

ffmpeg官网下载地址https://ffmpeg.org/download.html 这里以windows为例,鼠标悬浮到windows图标上,再点击 Windows builds from gyan.dev 或者直接打开 https://www.gyan.dev/ffmpeg/builds/ 下载根据个人需要下载对应版本 解压下载的文件,并复制bin所在目录 新打开一个命令…

基于YOLOv7开发构建MSTAR雷达影像目标检测系统

MSTAR&#xff08;Moving and Stationary Target Acquisition and Recognition&#xff09;数据集是一个基于合成孔径雷达&#xff08;Synthetic Aperture Radar&#xff0c;SAR&#xff09;图像的目标检测和识别数据集。它是针对目标检测、机器学习和模式识别算法的研究和评估…

手把手写深度学习(20):搭建LLM大语言模型的敏感词过滤系统

前言:随着Llama 2、通义千问7B等越来越多的大语言模型开源,开发者们可以基于这些开源的模型搭建自己的对话系统、Agent等。但是因为我们的国情,需要开发者对这些模型进行一些特殊的“安全性”考虑,保证与用户的交互不会出现“有害信息”。这篇博客手把手教大家搭建一个大语…

【Vue3】动态组件

动态组件的基本使用 动态组件&#xff08;Dynamic Components&#xff09;是一种在 Vue 中根据条件或用户输入来动态渲染不同组件的技术。 在 Vue 中使用动态组件&#xff0c;可以使用 元素&#xff0c;并通过 is 特性绑定一个组件的名称或组件对象。通过在父组件中改变 is 特…