前言:我坚信,机会永远属于有准备的人,我们与其羡慕他人的成功,不如从此刻起,积累足够多的知识和面试经验,为将来进入更好的公司做好充分的准备!
想让面试官在短短的几十分钟内认可你的能力?想在最短的时间内收获 PHP 技术栈最核心的知识点?想要更全面更深入的了解 PHP 技术?这篇文章给你想要的所有答案。
Redis现在已经成为了PHP面试必不可少的一部分,那么,你在面试过程中是否被redis的问题卡住了呢?通过这边文章,或许在未来的面试中,你会更加胸有成竹。
1.简单那说一下redis?有什么特点?
Redis是一个基于内存的高性能key-value数据库。Redis本身是纯内存操作,所以它的性能是非常出色的,已知的是它每秒可以处理超10万次的读写操作。当然,redis的特点不仅仅是性能高,它还有一个最大的特点是可以存储多种数据结构。他的单个value最大可存储限制是1GB。而memcached只能保存1MB的数据。
2.Redis支持的数据类型?
字符串String, 链表list, 哈希表hash, 集合set, 有序集合sorted set
3.Redis与memcached相比有哪些优势?
Redis支持的数据类型更加丰富
Redis的速度远远高于memcached
redis可以持久化其数据
同样是存储字符串,redis可存储1GB,而memcached只能存储1MB
4.Redis的数据类型你是用过哪些?什么情景下使用的?
string:最常用的一个类型,做缓存时经常用到
List:做高并发系统的时候用到的。将list作为队列使用,可以有效的解决高并发问题。
Hash:用的相对较少。存储一个用户信息对象数据,其中包括用户 ID、用户姓名、年龄和生日,通过用户 ID 我们希望获取该用户的姓名或者年龄或者生日
Set:当你需要存储一个列表数据,又不希望出现重复数据时,set 是一个很好的选择,并且 set 提供了判断某个成员是否在一个 set 集合内的重要接口,这个也是 list 所不能提供的
Sorted set:主要是做排行榜的时候用到的
5.说几个在list中经常使用的命令
Lpush,rpush,lpop,rpop,lrange等等
6.Redis的持久化机制?有什么优缺点?
Redis提供两种持久化机制RDB与AOF。
RDB持久化方式:是指用数据集快照的方式半持久化模式。记录 redis 数据库的所有键值对,在某个时间点将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复。
AOF:是指所有的命令行记录以 redis 命令请求协议的格式完全持久化存储。保存为 aof 文件。
7.Redis过期键的删除策略?
定时删除:在设置键的过期时间的同时,创建一个定时器 (timer). 让定时器在键的过期时间来临时立即执行对键的删除操作
惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。
定期删除:每隔一段时间程序就对数据库进行一次检查,删除里面的过期键。至于要删除多少过期键,以及要检查多少个数据库,则由算法决定。
8.redis的回收策略(淘汰机制)?
volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集中任意选择数据淘汰
allkeys-lru:从数据集中挑选最近最少使用的数据淘汰
allkeys-random:从数据集中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据
9.有没有使用过redis集群?集群的原理是什么?
Redis Sentinal 着眼于高可用,在 master 宕机时会自动将 slave 提升为master,继续提供服务
Redis Cluster 着眼于扩展性,在单个 redis 内存不足时,使用 Cluster 进行分片存储
10.Redis集群方案在什么情况下会导致整个集群不可用?
有 A,B,C 三个节点的集群,在没有复制模型的情况下,如果节点 B 失败了,那么整个集群就会以为缺少 5501-11000 这个范围的槽而不可用
11.知道redis哈希槽嘛?
Redis 集群没有使用一致性 hash,而是引入了哈希槽的概念,Redis 集群有16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽,集群的每个节点负责一部分 hash 槽
12.Redis 集群的主从复制模型是怎样的?
为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有 N-1 个复制品。Redis集群之间使用异步复制。
13.MySQL里面有200W条数据,redis只能存20W的数据。怎么保证redis里面存的数据是最新数据?
Redis本身的数据淘汰策略。可参考第8点作答。
14.使用过redis分布式锁嘛?
先拿 setnx 来争抢锁,抢到之后,再用 expire 给锁加一个过期时间防止锁忘记了释放。
15.Redis的list能不能生产一次,消费多次呢?
可以。使用pub/sub主体订阅模式,可以实现1:N的消息队列。
16.假设现在某商城有一次秒杀活动,活动中有10部最新的苹果手机,本次活动最少有1W人参与,要求每人限购一台,请你设计一个秒杀系统。
秒杀系统需要从多个方面来设计。前端,后台,数据库,甚至是服务器。这里说一下数据库方面。使用redis的list作为队列。声明一个库存队列用来存放10部苹果手机,声明一个用户队列存放已经抢购到手机的用户。用户请求接口的时候,首先判断用户是否已经在用户队列中?如果在的话,直接返回。不在的话,判断库存队列中的库存总量是否大于0,大于0的话,将库存队列pop一个,然后将用户push到用户队列中去。当然,这里说的只是一个大概的思路,具体的问题肯定是要分析更多的情况的。
17.现有一个项目需要展示用户的排名情况,说一下你的大概设计思路。
使用redis的有序集合实现。按照具体的需求设置对应的scope。zadd 命令向集合中添加数据,而 zrevrange 命令按照scope来获取前 N 名的用户,zrank 获取用户排名。