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 的缓存穿透 / 缓存雪崩 / 缓存重建 / 下次整顿