面试必备(必背)Redis
在近几年的面试过程中,redis变成了一个必考题,不知道是面试官确实对这方面感兴趣还是项目中使用redis越来越多。这里整理了几个常见的问题,redis八股文。
1、简单说一下什么是Redis
关键字:Key-Value类型的内存数据库,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB,支持保存多种数据结构,支持Key-Value设置expire时间释放内存。
Redis的全称是:Remote Dictionary.Server,本质上是一个Key-Value类型的内存数据库,很像Memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。
因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。
Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像 Memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能。
比方说用他的List来做FIFO双向链表,实现一个轻量级的高性 能消息队列服务,用他的Set可以做高性能的tag系统等等。
另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一 个功能加强版的Memcached来用。 Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
2、Redis基本数据类型与常用指令
关键词:String、List、Set、Zset、Hash
String
redis 的 string 可以包含任何数据。如数字,字符串,jpg图片或者序列化的对象。
List链表(Redis用双端链表实现List)。
使用List结构,我们可以轻松地实现最新消息排队功能(比如新浪微博的TimeLine)。List的另一个应用就是消息队列,可以利用List的 PUSH 操作,将任务存放在List中,然后工作线程再用 POP 操作将任务取出进行执行。
Set 无序集合。
集合成员是唯一的,这就意味着集合中不能出现重复的数据。Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
Zset
Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。
hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。
3、Redis持久化机制
关键词:
RDB,即 Redis DataBase:把 Redis 服务器中内存的数据保存到一个 dump 文件中,数据的集合 AOF,即 Append-only file:把所有对 Redis 服务器进行修改的命令保存到一个 aof 文件中,命令的集合
RDB,即 Redis 的内存快照,它是在某一个时间点将 Redis 的内存数据全量写入一个临时文件,当写入完成后,用该临时文件替换上一次持久化生成的文件,这样就完成了一次持久化过程。
触发过程
RDB 持久化触发分为手动和自动两种方式。
手动方式有两种:save 命令和 bgsave 命令。
自动触发方式save m n该方式在 redis.conf 中进行了说明,m 表示"间隔时间",n 表示 "变更次数",只有同时符合这两个条件才会
触发,否则"变更次数"会被继续累加到下一个"间隔时间"上。同时,该方式也不会阻塞。这个可以认为是 bgsave 的自动触发过程。
4、Redis对于过期键的删除策略
关键字:定时删除、惰性删除、定期删除
定时删除:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作;
惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过
期,那就返回该键;
定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。至于删除多少过期键,以及要检查多少个数据库,则
由算法决定。
5、Redis有哪几种数据淘汰策略
关键字:6种 1默认、2allkeys、3volatile
默认
-
noenviction:Redis 的默认策略,不回收数据,当达到最大内存时,新增数据返回 error
allkeys 是从全部数据集淘汰数据
-
allkeys-lru:从数据集(server.db[i].dict)中,使用LRU算法 淘汰最近最少使用的数据
-
allkeys-random:从数据集(server.db[i].dict)中,随机淘汰数据
volatile 是对已设置过期时间的数据集淘汰数据:
-
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中,使用LRU算法 淘汰最近最少使用的数据
-
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中,越早过期的越优先被淘汰
-
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中,随机淘汰数据
6、你是怎么理解Redis事务的
关键词:开启事务multi、命令入列、执行事务exec/放弃事务discard
事务指的是提供一种将多个命令打包,一次性按顺序地执行的机制,并且保证服务器只有在执行完事务中的所有命令后,才会继续处理此客户端的其他命令。事务也是其他关系型数据库 所必备的基础功能。
开启事务,multi 命令用于开启事务,multi 命令可以让客户端从非事务模式状态,变为事务模式状态,不支持嵌套使用。
命令入列,客户端进入事务状态之后,执行的所有常规 Redis 操作命令(非触发事务执行或放弃和导致入列异常的命令)会依次入列,命令入列成功后会返回 QUEUED。
执行事务的命令是 exec,放弃事务的命令是 discard。
不支持事务回滚
7、简单说明 Redis 分布式锁
关键词:单线程、重复值不可插入并返回false
使用Redis分布式锁的原理:首先,redis是单线程的,这是前提条件。redis中有值超时的设置以及重复值不可插入并返回false功能
能保证在一个进程执行了一个访问公共资源的方法时,往redis中设置了一个标识(加锁)等另一个进程同样操作这个方法时,再去
加锁,就发现已经有了,就等待,并不停的尝试加锁。
8、单线程的redis对应多核CPU怎样提升效率
关键字:多个redis
同一个服务器部署多个Redis的实例
9、Redis常见性能问题和解决方案
关键字: 持久化、同一个局域网内、单向链表结构
(1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件
(2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次
(3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内
(4) 尽量避免在压力很大的主库上增加从库
(5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3…这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。
10、Redis如何做内存优化
关键字:散列表