Redis面试整理

1、Redis 核心数据结构都有哪些?
String、List、Set、Hash、Zset
String类型的特点:可以是字符串,整数或者浮点数。
2、Redis值类型中 hash 和 string 区别。
Redis hash 是一个 string 类型的 field 和 value 的 映射表。它的添加、删除操作都是 0(1)(平均操作),hash 特别 适合用于存储对象。
相对于将单个对象存储成String类型,更能减少内存的占有。
3、Redis 持久化是如何工作的?
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写进一个临时文件中,等到持久化过程结束了,再用这个临时文件替换上次持久化好的文件。在这个过程中,只有子进程来负责IO操作,主进程仍然处理客户端的请求,这就确保了极高的性能。
(1).SAVE 直接调用rdbSave,阻塞Redis主进程看,直到保存完成为止.在主进程阻塞期间,服务器不能处理客户端的任何请求.(2).BGSAVE 则fork 出一个子进程,子进程负责调用rdbSave ,并在保存完成之后向主进程发送信号,通知保存已完成.因为rdbSave 在子进程被调用,所以Redis 服务器在BGSAVE 执行期间仍然可以继续处理客户端的请求.
4、Redis 持久化方式Rdb和Aof的优缺点
RDB是一个紧凑压缩的二进制文件,代表Redis在某一个时间点上的数据快照。非常适合用于备份,全量复制等场景。
AOF(append only file)持久化:以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中命令达到恢复数据的目的。AOF的主要作用是解决了数据持久化的实时性。
5、Redis 内存不够时如何处理新的请求?
启动配置文件中的maxmemory-policy默认值是noeviction。删除redis键具有的淘汰规则。
6、Redis 内存淘汰算法 LRU/ LFU
LRU即最近最少使用,是一种缓存置换算法。其原理是维护一个双向链表,key -> node,其中node保存链表前后节点关系及数据data。
LFU是根据key的最近被访问的频率进行淘汰,很少被访问的优先被淘汰,被访问的多的则被留下来。
7、Redis 有序数据结构zset底层
zset底层的存储结构包括ziplist或skiplist,在同时满足以下两个条件的时候使用ziplist,其他时候使用skiplist,两个条件如下:

  • 有序集合保存的元素数量小于128个
  • 有序集合保存的所有元素的长度小于64字节

8、Redis 位图应用场景及实现原理
位图不是一个真实的数据类型,而是定义在字符串类型上的面向位的操作的集合。由于字符串类型是二进制安全的二进制大对象,并且最大长度是 512MB,适合于设置 2^32个不同的位。
位操作分为两组:常量时间单个位的操作,像设置一个位为 1 或者 0,或者获取该位的值。对一组位的操作,例如计算指定范围位的置位数量。
位图的最大优势是有时是一种非常显著的节省空间来存储信息的方式。例如,在一个系统中,不同用户由递增的用户 ID 来表示,可以使用 512MB 的内存来表示 400 万用户的单个位信息(例如他们是否需要接收信件)。

简而言之,位图操作是用来操作比特位的,其优点是节省内存空间。为什么可以节省内存空间呢?假如我们需要存储100万个用户的登录状态,使用位图的话最少只需要100万个比特位(比特位1表示登录,比特位0表示未登录)就可以存储了,而如果以字符串的形式存储,比如说以userId为key,是否登录(字符串“1”表示登录,字符串“0”表示未登录)为value进行存储的话,就需要存储100万个字符串了,相比之下使用位图存储占用的空间要小得多,这就是位图存储的优势。
位图的常用操作如下:

  • setbit
    设置特定key对应的比特位的值。
  • getbit
    获取特定key对应的比特位的值。
  • bitcount
    统计给定key对应的字符串比特位为1的数量。

9、Redis 集群分片原理
Redis 集群是一个网状结构,无中心结构,每个节点都通过 TCP 连接跟其他每个节点连接。
在一个有 N 个节点的集群中,每个节点都有 N-1 个流出的 TCP 连接,和 N-1 个流入的连接。
10、Redis6.0 的多线程
a、主线程负责接收建立连接请求,获取 socket 放入全局等待读处理队列
b、主线程处理完读事件之后,通过 RR(Round Robin) 将这些连接分配给这些 IO 线程
c、主线程阻塞等待 IO 线程读取 socket 完毕
d、主线程通过单线程的方式执行请求命令,请求数据读取并解析完成,但并不执行
e、主线程阻塞等待 IO 线程将数据回写 socket 完毕
f、解除绑定,清空等待队列
11、redis多线程是否安全
Redis的多线程部分只是用来处理网络数据的读写和协议解析,执行命令仍然是单线程顺序执行。所以我们不需要去考虑控制 key、lua、事务,LPUSH/LPOP 等等的并发及线程安全问题。
12、Redis 的缓存穿透/缓存雪崩/缓存重建/ 下次整理

你可能感兴趣的:(bootstrap,java)