redis基础知识回顾

1 redis的基本数据结构

  字符串key-value最简单的类型String、链表有序列表List、哈希类似于map的一种结构Hash、集合无序集合Set、带权值的无序集合ZSet,即每一个ZSet还有另一个数字表示权值,集合通过权值进行排序。

redis的单线程原理

  具体说明的是redis中只有网络模块使用了单线程,其他模块还是使用了多线程处理,其特性是是用来epoll的多路复用,所以可以采用单线程完成网络请求。

2 redis的备份策略

  RDB和AOF

  RDB即将当前数据生成快照并存在硬盘中,可以自动触发,也可以手动设置。save命令是通过手动使用,使用的话需要阻塞服务器,直到RDB过程完毕,所占内存比较多。bgsave命令不阻塞主线程,该命令fork一个子线程,步骤如下:1、查看有没有一个子线程用于RDB,有的话直接返回;2、没有的话fork一个子线程,此时父线程阻塞;3、子线程完成后返回一个RDB文件给父线程。

  RDB自动触发的机制:1、通过配置文件,过一段时间后,自动执行RDB;2、如果采用主从复制过程,会自动执行RDB;3、如果redis在执行shutdown时,没有设置AOF会自动执行RDB。

  AOF通过日志,记录数据的写入或者修改操作,这种方式的实时性更好,通过配置文件打开AOF。

  AOF的持久化策略:1、always,每当执行一次命令将操作写到磁盘的日志文件上;2、everysec,每秒将命令写到磁盘日志文件上;3、no,不主动设置,由操作系统来决定什么时候写入到磁盘文件上。

  AOF重写机制:随着时间的推移和客户端的不断操作,AOF文件会变得越来越大,redis此时使用bgrewriteaof函数,在不读取原有AOF文件的基础上,会重新创建一个AOF日志文件,减少文件大小。

  RDB和AOF之间优缺点:1、AOF所所占的文件大小比RDB大;2、如果系统发生错误,AOF丢失的数据只有一部分,而RDB丢失所有数据;3、一般来说AOF的所需要的系统资源比RDB要小;4、RDB的恢复速度比AOF慢。

3 redis的过期策略

  定期删除:redis默认是每过100ms,就随机抽取一些设置过期时间的key,如果时间过期了,就会删除,但是不会说在同一时间内删除所有的过期的key。

  懒惰删除:若客户端获取某一个key的时候,redis会先进行检查,若该key设置了过期时间,并且已经过期了就会删除。

4 redis缓存穿透

  主要是请求所查询的数据,缓存和数据库中都没有,攻击者发送大量的这种查询,导致数据库的压力很大。

  解决方法:第一种,访问前进行校验。通过过滤器过滤掉那些不合法的查询请求,布隆过滤器。第二种就是将数据库中没有的键,缓存中将键=null

5 redis缓存击穿

  主要是缓存中某一热点数据过期,缓存中没有数据,但是数据库有数据,此时发生了大量的并发请求,导致数据库的服务器压力过大。

  解决方法:热点数据永不过期,对大量的并发读请求设置并发锁,降低并发性。

6 redis缓存雪崩 

  主要是缓存中大量的数据同时过期,缓存中没有数据,但数据库中有数据。但是这批数据的查询量非常大,导致数据库压力很大。

  解决方法:将热点数据永不过期,设置随机的过期时间,防止同一时间 大量数据过期。对于集群部署的情况,将热点数据均匀分布在不同的服务器。

7 布隆过滤器

  本质上是一个二进制向量,只能存放0和1,对一个数据进行多个hash函数,将每一个函数所得出的下标的二进制向量置为1,等待下次查询的时候,将数据再次hash函数化,然后通过二进制向量中是否为1,来判断是该数据是否存在。但是有可能会发生冲突,这样不能确定数据一定存在,但是能够确定数据一定不存在。

  优点:查询和插入数据的速度很快,由于是二进制,所占内存也比较少

  缺点:不能确定数据一定存在,但是能够确定数据一定不存在。不能删除数据,因为删除数据会造成误判,导致其他的数据会被误删除。

8 三种模式

  主从复制、哨兵模式、cluster模式

9 zset中底层数据结构是什么?为什么使用跳表,而不是使用b+树?为什么跳表这么快?

  跳表,时间复杂度为logN。redis数据库是基于内存的,而b+树是基于磁盘IO的,b+树每个节点的数量都是mysql分区页的大小。所以redis使用的跳表。跳表本质上是对链表做索引,一般有logN层的索引,每做一层索引,链表的长度减少为原先的1 / 2。链表加上多级索引的结构就是跳表。空间复杂度为N,由等比数列求和可以得出n- 2 ,类比为n

 

posted @ 2022-03-17 08:49  牵魂  阅读(29)  评论(0)    收藏  举报