Redis 面试题 记录

欢迎各位大佬评论补充!!!

1.什么是Redis?
Redis是一个开源、高性能、基于内存的key-value数据库。
 
2.Redis数据类型?
Redis支持多种数据类型,较为常用的有String、Hash、List、Set、Zset,也还包括了HyperLogLog、Geo等高级类型。甚至还有Redis-Module、BloomFilter、RedisSearch等,这些我没有用过的高级东西。
 
3.Redis的优点?
1)最大的优点就是速度快
2)数据类型丰富
3)支持事务,操作都是原子性的
4)丰富的特性(过期时间、持久化)
 
4.还有其它内存数据库吗?相比之后redis有什么优点?
基于内存的数据库除了redis,还有memcached。但是memcached的值都是简单的字符串,redis支持了更多的数据类型。
同时redis的速度更快,也提供了数据的持久化方案。
使用底层模型不同 它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。 Redis 直接自己构建了 VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
 
5.Redis是单进程单线程的?
Redis并不是单进程单线程的,人们常说的单进程单线程说的仅仅是redis处理的客户端请求的工作是单进程单线程的。
 
6.单线程不会影响效率?为什么要使用单线程?
Redis性能极高,读速度可达11W次/s,写可达8W次/s,所以不存在性能问题。
至于为什么使用单进程,仅仅是因为单进程的性能已经很好了,不需要使用多进程多线程来增加复杂度。
 
7.一个字符串类型的最大容量?
512M
 
8.Redis的数据持久化?
Redis提供了RDB、AOF两种持久化机制,具体实现可以看Redis持久化介绍文档。
 
9.性能优化?
(1)Master 最好不要写内存快照,如果 Master 写内存快照,save 命令调度 rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务
(2)如果数据比较重要,某个 Slave 开启 AOF 备份数据,策略设置为每秒同步一
(3)为了主从复制的速度和连接的稳定性,Master 和 Slave 最好在同一个局域网
(4)尽量避免在压力很大的主库上增加从库
(5)主从复制不要用图状结构,用单向链表结构更为稳定
 
10.redis过期删除策略?
定时删除:在设置键的过期时间的同时,创建一个定时器 timer). 让定时器在键的过期时间来临时,立即执行对键的删除操作。
惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。
定期删除:每隔一段时间程序就对数据库进行一次检查,删除里面的过期键。至于要删除多少过期键,以及要检查多少个数据库,则由算法决定。
 
11.redis淘汰策略?
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据
注意这里的 6 种机制,volatile 和 allkeys 规定了是对已设置过期时间的数据集淘汰数据还是从全部数据集淘汰数据,后面的 lru、ttl 以及 random 是三种不同的淘汰策略,再加上一种 no-enviction 永不回收的策略。
使用策略规则:
(1)如果数据呈现幂律分布,也就是一部分数据访问频率高,一部分数据访问频率低,则使用 allkeys-lru
(2)如果数据呈现平等分布,也就是所有的数据访问频率都相同,则使用allkeys-random
 
12.Redis同步机制?
Redis 可以使用主从同步,从从同步。第一次同步时,主节点做一次 bgsave,并同时将后续修改操作记录到内存 buffer,待完成后将 rdb 文件全量同步到复制节点,复制节点接受完成后将 rdb 镜像加载到内存。加载完成后,再通知主节点将期间修改的操作记录同步到复制节点进行重放就完成了同步过程。
 
13.Pipeline的实现与好处??
Pipeline是将多个IO命令同时处理,减少IO往返的时间。
但是需要注意pipeline执行的命令之间应该没有前后关系,同时pipeline的命令不宜过多,不然会加大客户端的延迟。
 
14.Redis哈希槽?
Redis 集群没有使用一致性 hash,而是引入了哈希槽的概念,Redis 集群有16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽,集群的每个节点负责一部分 hash 槽。
 
15.redis集群会数据丢失吗?
会!!!redis并不能保证数据的强一致性,在特定的条件下可能存在丢失的情况。
 
16.Redis集群最大节点?
理论16384个,推荐不超过1000个。
 
17.10亿key中找math开头的100Wkey?
常用的keys命令可以搜索,但是会造成堵塞。推荐使用scan命令,客户端自行去重。
 
18.大量key同时过期?
 key 过期时间设置的过于集中,到过期的那个时间点,redis 可能会出现短暂的卡顿现象。同时,在业务系统中,也会增加下层数据库的压力。推荐将key的过期时间尽量进行分散些。
 
 
 
 
待补充:
redis集群原理(redis sentinal、redis cluster)
redis集群不可用的原因?
redis实现延时队列
Redis 集群的主从复制模型是怎样的
 
作者:红雨
出处:https://www.cnblogs.com/52why
微信公众号: 红雨python
原文地址:https://www.cnblogs.com/52why/p/14357848.html