0
点赞
收藏
分享

微信扫一扫

Redis的面试题

海滨公园 2022-03-11 阅读 64

1.为什么使用Redis做缓存

redis具有高性能和高并发的特点

redis为什么具有高性能,或者说redis为什么快?

1.首先redis的数据存在内存中,所以比存储磁盘上的数据库快。

2.其次redis本身使用了高效的数据结构

redis内部的基本数据类型有String , List, Set, Hash, Sorted Set

底层的数据结构:

键的数据结构

String-简单动态字符串

值的数据结构

String - 简单动态字符串

List - 双向链表/压缩列表

Set - 整数数组/压缩列表

Hash - 哈希表/压缩列表

SortedSet - 跳表/压缩列表

压缩列表是紧凑的数据结构,占用内存小的同时在数据量不大时访问速度也不慢。

跳表是利用了二分查找的思想,对链表建立了多级索引

键值对的组织结构:

redis维护了两个交替使用的全局hash表,由key指向value的指针。

冲突过多时进行渐进式rehash。

每处理一个请求将该索引位置的所有数据移到新表中。

3.Redis的单线程模式和网络框架

redis采用网络IO多路复用机制,在网络IO操作中能并发的处理大量的请求。

Redis的核心网络模型是单线程的单reactor模型,利用Linux系统提供的epoll/select的IO多路复用技术,在单线程的事件循环中不断处理事件,回写响应数据到客户端。

IO模型是什么?有哪些IO模型?

(152条消息) linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO_xiaohuima_dong的专栏-CSDN博客https://blog.csdn.net/xiaohuima_dong/article/details/45096865?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164629562316781683974719%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164629562316781683974719&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-14-45096865.pc_search_insert_es_download&utm_term=epoll%2Fselect&spm=1018.2226.3001.4187

在linux系统下, 根据IO操作是否被阻塞以及同步异步问题进行分类,可以得到5种IO模型。

1.阻塞I/O模型

2.非阻塞I/O模型

3.I/O复用模型

linux提供了select/poll/epoll 三个系统调用接口,可以将多个fd的集合传入,因此可以同时监控多个socket是否就绪。把多个IO的阻塞复用到一个select之类的阻塞上,从而使得系统在单线程的情况下同时支持处理多个请求。

区别:

select:

(1)数量有限,最多支持1024个fd。

  (2) 只知道有事件,不知道在哪个IO流发生的事件,所以对返回的fd集合进行遍历

poll: 和select类似,但是没有数量的限制,fd列表由一个数组表示

epoll:

epoll_create 创建一个epoll的描述符

epoll_ctl 对监听的事件进行注册。 为fd注册回调函数,当可读可写时,发生中断,内核调用该Socket的callback函数,把该fd加入到就绪的事件链表。

epoll_wait 从内核得到事件的链表。

epoll是触发式的,没有以上的缺点。

4.信号驱动异步I/O模型

5.异步I/O模型

redis的IO多路复用提供了一定程度上的高并发的能力。

还可以通过主从复制实现读写分离提供更高程度的并发能力。

Redis的过期删除

惰性删除:客户端访问某个key的时候,如果过期了则删除

定期删除:定期执行扫描,选择随机20个key,如果过期的比例超过25%则重复操作。

Redis的淘汰策略

noeviction 对可能导致内存增大的返回错误

volatile/allkeys - lru/random

volatile-ttl 选择剩余存活时间最短的

Redis的lru是近似lru。随机采样5个key,淘汰最老的。

Redis的持久化机制

redis的持久化机制主要有RDB快照和AOF(Append-Only-File)日志

AOF日志在写命令执行完后会在磁盘记录。记录日志的频率由appendfsync配置。

Always 每次写后记录到磁盘。

Everysec 写后记录在内存缓冲区,每秒更新到磁盘

No 写后记录在缓冲区,由操作系统决定何时写到磁盘。 

AOF文件过大会进行重写。

RDB快照

记录内存快照到磁盘中。使用CopyOnWrite的方式复制。

可以执行全量快照和增量快照,也可以和全量快照和AOF文件结合使用。

缓存雪崩、缓存穿透、缓存击穿

缓存雪崩:大量数据集中在某一时间失效,大量访问数据库。

(1)给key设置一个失效时间的随机波动值。

(2)多级缓存(本地缓存)

缓存穿透:key对应的数据在数据库中不存在,没有缓存值,在缓存中查询不到会到数据库中查。

(1)boolean过滤器,所有可能存在的数据hash到一个bitmap上,如果不存在会被拦截。

(2)空值也缓存到缓存里

缓存击穿:某个数据失效的一瞬间,大量数据访问数据库

对数据的访问加互斥锁,当一个线程访问该数据时,其他缓存不能访问。

举报

相关推荐

0 条评论