Redis 面试必备 全知识点思维导图

news2025/7/19 21:09:09

脑图下载地址:https://mm.edrawsoft.cn/mobile-share/index.html?uuid=cf5bf135744412-src&share_type=1

在这里插入图片描述

事务

定义

事务是一个单独的隔离操作,事务中的所有操作都将序列化,有顺序的执行,事务执行的过程中不会被其他客服端发来的命令打断

作用

串联多个命令防止其他命令插队

命令

key [key …]
key1 [key2],可以监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
Multi
输入的命令都会进入命令队列,但是不会执行,将等待Exec命令执行,然后依次执行
Exec
执行命令队列
discard
丢弃命令队列

事务的错误处理

组队成功,执行成功,所有的命令都将有序执行
组队成功,选择discard,所有的命令都不会执行
组队中某个命令出错,执行时整个队列的命令都会被取消
组队成功,执行时某个命令出错,除了出错的命令,其他的命令都将执行
Redis事务没有原子性

Redis事务的三大特性

单独的隔离操作
事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
没有隔离级别的概念
队列中的命令没有提交之前都不会实际被执行,因为事务提交前任何指令都不会被实际执行
不保证原子性
事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚

Redis事务与Mysql事务的区别(围绕ACID)

持久化

RDB

核心配置
dbfilename 配置文件名称
save
  • 多少秒内进行了多少次操作
触发RDB
自动触发save
会阻塞主进程,直到完成RDB持久化
手动保存: bgsave
Redis会在后台异步进行快照操作, 快照同时还可以响应客户端请求。
通过lastsave可以获取最后一次执行快照的时间
不会阻塞主进程
执行flushall命令
执行flushall命令,也会产生dump.rdb文件,但里面是空的,没有意义
flushdb命令不会产生dump.rdb文件
正常退出Redis
redis.conf中更多配置
stop-writes-on-bgsave-error
当Redis无法写入磁盘的话,直接关掉Redis的写操作。推荐yes
rdbcompression 压缩文件
如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能。推荐yes.
rdbchecksum 检查完整性
在存储快照后,还可以让redis使用CRC64算法来进行数据校验
持久化流程(内存快照)
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到 一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。 整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能 如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失
Fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等) 数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程
优势
的数据恢复
更适用
节省磁盘空间
恢复速度快
劣势
快照所有的修改

AOF

介绍
的形式记录每一次写操作,只可以追加文件但不能改写文件
默认不开启
appendonly no
AOF和RDB同时开启会优先选择AOF
持久化流程
客户端的请求写命令会被追加到AOF缓冲区
AOF缓冲区根据AOF持久化策略将操作同步到磁盘的AOF文件中
AOF文件超过重写策略或手动重写时,会对AOF文件rewrite重写,压缩AOF文件容量
Redis服务器重启时,会load加载AOF文件中的写操作
同步频率设置
appendfsync always
始终同步,每次Redis的写入都会立刻记入日志;性能较差但数据完整性比较好
appendfsync everysec
每秒同步,先将日志写到AOF文件的内存缓冲区,每隔一秒再把缓冲区的内容写入磁盘,如果宕机,本秒的数据可能丢失
appendfsync no
redis不主动进行同步,把同步时机交给操作系统。
优势
备份机制更稳健,数据不容易丢失
,可以处理错误操作
劣势
占用更多的磁盘空间
速度慢
性能有压力
,造成不能恢复

Redis过期键删除策略

Redis采用的是定期删除和惰性删除两种结合的策略

抽取设置了过期时间的key,检查是否过期,过期删除
每1秒重复10次,随机抽取20个key检查是否过期,如果25%的key过期了,就重复该行为
会漏掉很多的过期键
惰性删除:数据过期时,先不处理,当过期键被访问时,在进行删除
用空间换时间

如果漏掉了很多的过期键,并且没有去检查,也就不会走惰性删除,大量的过期键堆积在内存中,导致Redis内存耗尽,此时就要走内存淘汰机制

主从复制

是什么

主机数据更新后,根据策略,自动将数据同步到master/slave机制.master负责写,slave负责读

能干嘛

读写分离,性能扩展
容灾快速恢复,提高可用性

怎么玩

启动多个redis服务
配置从库
执行 slaveof IP port
查询主从信息
info replication

常见情况

一主二仆
从机是否可以写?set可否?
不可以写,set也不行
主机shutdown后情况如何?从机是上位还是原地待命?
从机原地待命
主机又回来了后,主机新增记录,从机还能否顺利复制?
可以
其中一台从机down后情况如何?依照原有它能跟上大部队吗?
可以
薪火相传
master和slave双重身份的机器是否可以写数据呢??
不可以,只要有从机的身份,就不能写数据
反客为主
主机宕机了,可以手动使从机变为主机

复制原理

slave启动成功连接到master后会发送一个sync命令
Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令, 在后台进程执行完毕之后,master将传送整个RDB数据文件到slave,以完成一次完全同步
:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
:Master继续将新的所有收集到的修改命令依次传给slave,完成同步
但是只要是重新连接master,一次完全同步(全量复制)将被自动执行

哨兵模式

哨兵就是一个运行在特性模式下的Redi进程,主要有三个任务

监控
给所有的主从库发送PING命令,检查是否存活,没有在规定的时间内响应判定为下线
主观下线
  • 为“主观下线
客观下线
  • 如果 N/2+1 的哨兵都将该主库标记为主观下线,那么该主库就会被标记为 “客观下线”
只有主库被标记为客观下线,哨兵才会去选举新的主库
选主
主库挂了将在从机中选出新的主库
选举新的主库过程
  • 筛选

    • 从库的当前在线状态,还要判断它之前的网络连接状态
  • 打分

    • 从库优先级

    • 从库复制进度

    • 从库ID号

通知
将新的主库信息发送给其他的从库,让其他的从库和新的主库建立连接,进行数据复制

是什么

反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库

怎么玩

新建sentinel.conf文件,名字绝不能错
配置哨兵,填写内容
sentinel monitor mymaster 127.0.0.1 6379 1
其中mymaster为监控对象起的服务器名称, 1 为至少有多少个哨兵同意迁移的数量。
启动哨兵
/usr/local/bin
执行redis-sentinel /myredis/sentinel.conf
当主机挂掉,将在从机中选新的主机
选举规则
优先级
  • 在redis.conf中默认:replica-priority 100,值越小优先级越高
偏移量
  • 偏移量是指获得原主机数据最全的
runid
  • 每个redis实例启动后都会随机生成一个40位的runid(通过info server获取查看)

集群

什么是集群

对Redis的水平扩容
集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。
主机宕机,从机自动提升为Master

配置

redis cluster配置修改
cluster-enabled yes 打开集群模式
cluster-config-file nodes-6379.conf 设定节点配置文件名
cluster-node-timeout 15000 设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换。

启动

redis-cli --cluster create --cluster-replicas 1 192.168.11.101:6379 192.168.11.101:6380 192.168.11.101:6381 192.168.11.101:6389 192.168.11.101:6390 192.168.11.101:6391
不要用127.0.0.1, 请用真实IP地址

什么是slots

一个 Redis 集群包含 16384 个插槽(hash slot), 数据库中的每个键都属于这 16384 个插槽的其中一个
不在一个slot下的键值,是不能使用mget,mset等多键操作。

集群的不足

多键操作是不被支持的
多键的Redis事务是不被支持的。lua脚本不被支持
复杂度较大

为什么集群需要至少三个节点

一个节点挂了,有一半以上的节点通过ping-pong方式的投票机制认为它挂了,那么这个集群就挂了.如果只有两个节点,一个节点挂了,另外一个节点投票.只有50%,不过半数,这个集群就不会挂,所以至少需要三个节点

为什么集群至少需要六台服务器

因为一个集群至少需要三个节点,而每一个节点需要一个备份机,所以一个集群需要至少六台服务器

JAVA连接开发 Jedis

依赖: jedis

JedisPool 连接池

<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="100"/>
<property name="maxIdle" value="100"/>
<property name="testOnBorrow" value="true"/>
<property name="testOnReturn" value="true"/>
</bean>

<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg name="poolConfig" ref="jedisPoolConfig" />
<constructor-arg name="host" value="192.168.11.222" />
<constructor-arg name="port" value="6379" type="int" />
<constructor-arg name="timeout" value="30000" type="int" />
</bean>

setBlockWhenExhausted
/连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true
setTestOnBorrow
从连接池中取连接的时候检查是否失活

自动装配JedisPool对象

@Autowired
private JedisPool jedisPool;

五大数据类型

五大数据类型

应用

基本使用

安装目录

redis-benchmark:性能测试工具,可以在自己本子运行,看看自己本子性能如何
redis-check-aof:修复有问题的AOF文件,rdb和aof后面讲
redis-check-dump:修复有问题的dump.rdb文件
redis-sentinel:Redis集群使用
redis-server:Redis服务器启动命令
redis-cli:客户端,操作入口

配置文件 redis.conf

后台启动
daemonize no 改成 yes
启动服务器 redis-server /myredis/redis.conf
用客户端访问 redis-cli
-p 指定端口
-c 集群方式
网络相关配置
bind
不写即无限制接受所有的IP地址的访问
protected-mode保护模式
默认开启 即使接受所有IP地址的访问,也不能访问成功
Port 端口号
6379
tcp-backlog 连接队列
timeout 超时时间
一个空闲的客户端多久会关闭 0关闭该功能 即永远不断开连接
tcp-keepalive 对客户端的心跳检测
设置为0即不会进行keepalive检测
通用配置
daemonize 守护线程
默认 no 设置为yes是守护进程,可以后台启动
pidfile 存放pid文件的位置
loglevel 日记的级别
debug:会打印生成大量信息,适用于开发/测试阶段
verbose:包含很多不太有用的信息,但是不像debug级别那么混乱
notice:适度冗长,适用于生产环境
warning:仅记录非常重要、关键的警告消息
logfile 日志文件名称
默认是 logfile stdout
databases 设置数据库的数量
默认数据库数量是16 默认选择数据库是0
限制
maxclients 最大服务器连接数
默认1W个连接,达到上限将拒绝连接
maxmemory
建议必须设置,否则,将内存占满,造成服务器宕机
maxmemory-policy 内存淘汰策略
volatile-lru:使用LRU算法移除key,只对设置过期时间的键;(最近最少使用)
volatile-ttl:移除那些TTL值最小的key,即那些最近要过期的key
volatile-random:在过期集合中移除随机的key,只对设置了过期时间的键
allkeys-lru:在所有集合key中,使用LRU算法移除key
allkeys-random:在所有集合key中,移除随机的key
noeviction:不进行移除。针对写操作,只是返回错误信息
IO限制
io-threads-do-reads 是否开启IO多线程
默认no,如果开启,修改为yes
io-threads IO线程数量
4核的机器建议设置为 2 或 3 个线程,8 核的建议设置为 6 个线程,线程数一定要小于机器核数,尽量不超过8个

Redis关闭

单实例关闭
redis-cli shutdown
多实例关闭
redis-cli -p 6379 shutdown

单线程+多路IO复用

Redis6.0引入了多线程

NoSQL数据库

什么是NoSQL数据库

不遵循SQL标准
不支持ACID
原子性
一致性
隔离性
持久性
远超SQL的性能

适用场景

的读写
数据的读写
性的

不使用场景

支持
关系,需要即席查询
:用户根据自己的需求,灵活的选择查询条件,系统根据用户的选择生成相应的统计报表

如果只有一个哨兵,当因为网络原因或者主库压力过大,主库没有及时响应哨兵,被哨兵标记为主观下线,而此时又只有一个哨兵,将直接选举新的主库 而如果有哨兵集群,必须要N/2+1以上的哨兵标记主库为主观下线,主库才会被标记为客观下线,哨兵才会去选举新的主库 能减少误判

Redis五大数据类型

String类型

添加键值对
设置 key 的值
同时设置一个或多个 key-value对

get 查询对应键值
长度
mget 同时获取一个或多个 value
获得值的范围,类似java中的substring,前包,后包

数字值增1
空,新增值为1
减1
空,新增值为-1
数字值增减。自定义步长。

key

特殊

追加到原值的末尾
同时获得旧值

List类型

一个或多个值。

获得元素(从左到右)
获得元素(从左到右)
列表长度

成value

(从左到右)

特殊

。值在键在,值光键亡。
插入值

Hash类型

给集合中的 键赋值
hash的值

从集合取出 value
hash的值
field-value的数量
给定域 field 是否存在

field 的值加上增量 (为负既是减去)
设置为 value ,当且仅当域 field 不存在

删除集合中指定

特殊

所有的field和value
hkeys 列出该hash集合的所有field
hvals 列出该hash集合的所有value

ZSet类型

<member 1><member 2>…
集 key 当中

元素个数
区间内的元素个数
排序
的元素
一起和值返回到结果集
排序
offset count]
)次序排列。
)
排列。
)排列的排名。

元素的score加上增量

指定值的元素

特殊

Set类型

的 member 元素将被忽略

所有值
元素个数
是否已经存在

集合中的某个元素

特殊

一个值
到另一个集合
元素。
元素。
元素(key1中的,不包含key2中的)

商品编号、订单号采用string的递增数字特性生成。

rpush方法就相当于将消息放入到队列中,lpop/rpop就相当于从队列中拿去消息进行消费

共同好友、共同兴趣、分类标签

排行榜:例如视频网站需要对用户上传的视频做排行榜.

用一个对象来存储用户信息,商品信息,订单信息等等

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

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

相关文章

【兔子王赠书第2期】《案例学Python(基础篇)》

文章目录 前言推荐图书本书特色本书目录本书样章本书读者对象粉丝福利丨评论免费赠书尾声 前言 随着人工智能和大数据的蓬勃发展&#xff0c;Python将会得到越来越多开发者的喜爱和应用。身边有很多朋友都开始使用Python语言进行开发。正是因为Python是一门如此受欢迎的编程语…

下载Jakarta

百度找到Jakarta的官网 https://jakarta.ee/zh/ 打开后在右上角有这两个按钮 其中starter按钮是 提供helloworld的&#xff0c;也就是【初体验】&#xff0c;可以根据版本号&#xff0c;jdk版本定制hello world&#xff1b; 另一个Download是下载【兼容产品】&#xff0c;点进…

Python合并多个相交矩形框

Python合并多个相交矩形框 前言前提条件相关介绍实验环境Python合并多个相交矩形框代码实现 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xff0c;可点击进入Python日常小操作专栏、YOLO系列专栏、自然语言处理专栏或我的个人主页…

小程序设计基本微信小程序的旅游社系统

项目介绍 现今市面上有关于旅游信息管理的微信小程序还是比较少的&#xff0c;所以本课题想对如今这么多的旅游景区做一个收集和分类。这样可以给身边喜欢旅游的朋友更好地推荐分享适合去旅行的地方。 前端采用HTML架构&#xff0c;遵循HTMLss JavaScript的开发方式&#xff0…

自动化测试框架指南

目录 定义测试自动化 不同类型的框架 以工具为中心的框架 面向项目的框架 关键字驱动的框架 完美测试自动化框架的主要组件 测试库 单元测试 集成和端到端测试 行为驱动开发 测试数据管理 mock&#xff0c;Stubs和虚拟化 实施模式的通用机制 测试结果报告 CI平台…

SpringBoot+自定义注解+AOP高级玩法打造通用开关

1.项目结构 2.引入依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot<…

英特尔 SGX 技术概述

目录 介绍概述指示结构Memory安全区页面缓存Enclave Page Cache &#xff08;EPC&#xff09;安全区页面缓存映射Enclave Page Cache Map (EPCM) Memory ManagementStructures页面信息Page Information (PAGEINFO)安全信息Security Information (SECINFO)分页加密元数据Paging …

ardupilot开发 --- 起飞前后 篇

起飞前检查 电机响应是否正确&#xff08;转向&#xff09;姿态响应是否正常&#xff08;roll pitch yaw&#xff09;GPS数据是否正常&#xff08;星数&#xff0c;RTK信号&#xff09;电源电压安全开关安全检测&#xff08;armed pre check&#xff09; 起飞前的必调参数 机…

SpringCloud 完整版--(Spring Cloud Netflix 体系)

目录 SpringCloudSpring Cloud Netflix 体系分布式概念&#xff1a;分析图单体应用分布式架构集群微服务分布式微服务集群 服务注册与发现Eureka作用&#xff1a;为什么使用Eureka&#xff1f;解答&#xff1a;分析图 搭建&#xff1a;1、注册中心Eureka-server搭建创建项目配置…

springboot苍穹外卖实战:三、新增员工(JWT令牌校验失败+用户名重复+ThreadLocal获取用户id解决方案)

新增员工 根据前端传递参数列表设计DTO 当前端提交的数据和实体类中对应的属性差别比较大时&#xff0c;建议使用DTO来封装数据。进入sky-pojo模块&#xff0c;在com.sky.dto包下&#xff0c;已定义EmployeeDTO。 EmployeeController /*** 新增员工* param employeeDTO* ret…

检测密码安全强度 和 凯撒加密

检测密码安全强度 按照含有数字,小写字母,大写字母,指定标点符号的种类,把安全强度分为强密码,中高,中低,弱密码. 编写程序,输入一个字符串,输出该字符串作为密码时的安全强度 from string import digits, ascii_lowercase, ascii_uppercasedef check(pwd):# 密码必须至少包含…

【前端学习】—使用多种方式实现数组去重(六)

【前端学习】—使用多种方式实现数组去重(六) 一、数组常用的几个方法 //[1,2,3,4,2,1]//[{name:"caicai",age:"10"},{name:"zhangsan",age:"20"}]const array=[

jmeter监听每秒点击数(Hits per Second)

jmeter监听每秒点击数&#xff08;Hits per Second&#xff09; 下载插件添加监听器执行压测&#xff0c;监听结果 下载插件 点击选项&#xff0c;点击Plugins Manager (has upgrades)&#xff0c;点击Available Plugins&#xff0c;搜索5 Additional Graphs安装。 添加监听…

C++新经典 | C++ 查漏补缺(内存)

目录 一、new和delete 1.new类对象时&#xff0c;括号问题 2.new做了什么事 3.delete做了什么事 4.new与malloc的区别 5.delete与free的区别 二、分配及释放内存 三、重载operator new和operator delete操作符 1.重载类中的operator new和operator delete操作符 &…

通信系统中ZF,ML,MRC以及MMSE四种信号检测算法误码率matlab对比仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、ZF&#xff08;零迫&#xff09;算法 4.2、ML&#xff08;最大似然&#xff09;算法 4.3、MRC&#xff08;最大比合并&#xff09;算法 4.4、MMSE&#xff08;最小均方误差&#xff…

2024杭州人工智能展会(世亚智博会)一场人工智能领域的视觉盛宴

2024年&#xff0c;一场规模空前的人工智能盛会将在杭州国际博览中心盛大开幕。这场名为“2024杭州国际人工智能展览会&#xff08;简称&#xff1a;世亚智博会&#xff09;”的展会活动&#xff0c;将于4月份在杭州国际博览中心隆重举行&#xff0c;届时将迎来一场人工智能领域…

网络安全必备常识:Web应用防火墙是什么?

如今&#xff0c;很多企业都将应用架设在Web平台上&#xff0c;为用户提供更为方便、快捷的服务支持&#xff0c;例如网上银行、网上购物等。与此同时&#xff0c;应用程序组合变得前所未有的复杂和多样化&#xff0c;这为攻击者发动攻击开辟了大量媒介&#xff0c;Web应用防火…

【C++ 学习 ㉘】- 详解 C++11 的列表初始化

目录 一、C11 简介 二、列表初始化 2.1 - 统一初始化 2.2 - 列表初始化的使用细节 2.2.1 - 聚合类型的定义 2.2.2 - 注意事项 2.3 - initializer_list 2.3.1 - 基本使用 2.3.2 - 源码剖析 一、C11 简介 1998 年&#xff0c;C 标准委员会发布了第一版 C 标准&#xff0…

使用new创建动态结构

在运行时创建数组优于在编译时创建数组&#xff0c;对于结构&#xff08;同一个结构可以存储多种类型的数据。&#xff09;也是如此。需要在程序运行时为结构分配所需的空间&#xff0c;这也可以使用new运算符来完成。通过使用new&#xff0c;可以创建动态结构。同样&#xff0…

【广州华锐互动】利用AR进行野外地质调查学习,培养学生实践能力

在科技发展的驱动下&#xff0c;AR&#xff08;增强现实&#xff09;技术已经在许多领域中找到了应用&#xff0c;包括医疗、教育、建筑和娱乐等。然而&#xff0c;有一个领域尚未充分利用AR技术的潜力&#xff0c;那就是野外地质调查。通过将AR技术引入到这个传统上需要大量人…