Redis 面试必备 全知识点思维导图
脑图下载地址: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
依赖: <artifactId>jedis</artifactId>
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对象
@Autowiredprivate 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以上的哨兵标记主库为主观下线,主库才会被标记为客观下线,哨兵才会去选举新的主库 能减少误判
#