Redis面试题

1-10 可能会遇到的面试题
1.什么是 Redis?
答:
redis是一个基于内存的,kv格式的non-sql 高性能数据库, 经常被拿来做缓存中间件,他支持持久化,所以也可以用来做存储。

2.Redis 的数据类型?
答:
最常用的是string, 其他还有hash、set、zset、list等

3.使用 Redis 有哪些好处?

答:
一是他基于内存操作且非阻塞,读写性能高
二是支持持久化,能够较好的容灾,比较安全
三是数据类型丰富

4.Redis 相比 Memcached 有哪些优势?
答:
一是redis支持持久化,支持灾后恢复,而memcached不支持
二是redis的数据类型比memcached丰富

5.Memcached 与 Redis 的区别都有哪些?
答:
memcached是多线程的,可以利用多核能力;redis是单线程的,无法利用多核
memcached不支持持久化,容灾性差;redis支持持久化,可以做到灾后恢复


6.Redis 是单进程单线程的吗?为何它那么快那么高效?
答:
是。 首先,他通过多路复用器处理客户端连接,一个连接处理完也可以继续接受连接,是非阻塞的;其次,他是基于内存操作的;而且单线程没有线程上下文切换成本

7.一个字符串类型的值能存储最大容量是多少?

(上网查的)
答:512M


8.Redis 的持久化机制是什么?各自的优缺点?
答:

redis有两种持久化机制。一个是RDB,一个是AOF;

RDB相当于一个快照,每隔一段时间就会把内存中的数据写到磁盘里。
优点是:备份文件可以非常方便的传输,灾后可以快速恢复
缺点是:发生宕机时可能会丢失最后产生的一些数据

AOF是记录增量日志,每一个写操作就会在日志里边追加一条命令,恢复时会解析这些命令将数据恢复到内存
优点是:发生宕机时基本不会丢数据
缺点是:首先灾后恢复可能比较慢;然后是一般备份文件会比RDB大,但是他在满足一定条件时会对日志压缩

一般对数据安全性要求不是很高,允许丢失少量数据的情况下会考虑使用RDB,否则选择AOF。当然也可以都开启,实现一个冷热备份


9.Redis 常见性能问题和解决方案有哪些?
答:

一次查多个key时因需要多次发送命令接受响应,会比较慢

可以通过mget实现批量查询,也可以使用pipeline

10.Redis 过期键的删除策略?
答:

有主动和被动两种方式

主动就是可以配置每隔一段时间就检查一次key,看有没有过期,如果过期就删除

被动就是,访问一个key时,看他有没有过期,过期了就删除

主动的方式对cpu的占用比较高,因为过一段时间就要检查一遍,好处是过期的key一段时间内一定会被删除,对内存比较友好

被动方式由于不用一直检查,所以对cpu友好,但是可能存在过期的key一直没人访问,导致一直占用内存,对内存不太友好

11.Redis 的回收策略(淘汰策略)?
答:
内存是有限的,当内存使用达到配置的上限后会淘汰一些key,当然也能直接不让写了,直接报错。

淘汰策略有针对所有key的和针对有过期时间的key的,分别都有随机淘汰key, 和淘汰最近最少使用的key的策略,最近最少使用的判断有LRU和LFU两种策略,LRU是按次数看的,LFU是按频率看的

12.为什么Redis 需要把所有数据放到内存中?
答:
因为内存的读写效率高

13.Redis 的同步机制了解么?

为了提高redis的读写能力可能会使用主从结构,主节点负责写,从节点处理读。
从节点需要从主节点同步数据,首次启动时,从节点会直接下载主节点的rdb文件,然后写进内存;
之后每一次写主节点都会将直接同步给从节点,从节点执行指令,完成数据同步。其实redis的同步也有无磁盘的同步方式,也就是直接通过socket同步数据,比较适合磁盘配置较低,但带宽还可以的情况。

14.Pipeline 有什么好处,为什么要用 Pipeline?
答:
能将多次的读写操作放到管道里执行,避免频繁的建立与断开连接,可以提高效率

15.是否使用过 Redis 集群,集群的原理是什么?
答:
自己在本地搭建过。redis集群实际上是几对主备结构,每个主节点都有与之关联的备用节点,主节点中有很多的slot,数据就存放在slot中,当读或写key时,会对key做hash,
然后对总的slot个数取模,看应该从哪个master的哪个slot读,或写。当某对主备中的主挂掉后,备用节点会成为主节点继续提供服务,保证高可用。

16.Redis 集群方案什么情况下会导致整个集群不可用?

答:应该是所有节点挂掉后,因为只要有一个节点可用,就有一部分读写是可用的

17.Redis 支持的 Java 客户端都有哪些?官方推荐用哪个?
答:Redisson、Jedis、lettuce等等,官方推荐使用Redisson。
(查的)
18.Jedis 与 Redisson 对比有什么优缺点?

答:
Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持;
Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比,功能较为简单,不支持字符串操作, 不支持排序、事务、管道、分区等Redis特性。
Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。
(查的)

19.Redis 如何设置密码及验证密码?
答:
redis.conf配置文件中有个auth配置

auth 密码 这个命令

20.说说 Redis 哈希槽的概念?
答:
redis集群架构模式下,每个master都会有很多槽,他们用于存数据,当读或写key时,会先对key做hash,然后对总的槽节点的个数求模,得到在哪个槽,然后去对应的槽读或者写

21.Redis 集群的主从复制模型是怎样的?
和13差不多

22.Redis 集群会有写操作丢失吗?为什么?
答:会,主从同步异常时发生

23.Redis 集群之间是如何复制的?
答:(查的)
2.8 版以前,Redis 通过同步(sync)和指令传播(command propagate)两个操作完成同步

同步(sync):将从节点的数据库状态更新至与主节点的数据库状态一致
指令传播(command propagate):主节点数据被修改,会主动向从节点发送执行的写指令,从节点执行之后,两个节点数据状态又保持一致
 

2.8 版开始新增 PSYNC 指令,PSYNC 具有两种模式:

完整重同步(full resynchronization),与 SYNC 过程基本一致
部分重同步(partial resynchronization),借助复制偏移量、复制积压缓冲区、服务器运行 ID ,完成主从节点断开连接后,从节点重连主节点后,
条件允许,主节点将连接断开期间执行的写指令发送给从节点,从节点接收并执行写指令,将数据库更新至主节点当前状态

24.Redis 集群最大节点个数是多少?

答: 近似无限个,主节点至多有16384个,因为只有16384个槽,每个槽占用一个master的化,master至多16384个,但是一个master下可以有多个slave节点

25.Redis 集群如何选择数据库?

redis集群中没有数据库的概念,他是基于slot存数据的

26.怎么测试 Redis 的连通性?
答:
发送ping命令,如果返回pong,表示是联通的
27.怎么理解 Redis 事务?

答:(查的)

Redis事务的特性:

事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
没有隔离级别,事务提交前结果不可见,事务提交执行后可见
不保证原子性,Redis 同一个事务中有命令执行失败,其后的命令仍然会被执行,不会回滚
 

事务三阶段:

开启:MULTI 指令开启一个事务
入队:将多个命令入队到事务中,这些命令不会立即执行,而是放到等待执行的事务队列
执行:由 EXEC 指令触发事务执行


28.Redis 事务相关的命令有哪几个?

答: (查的)

multi,标记一个事务块的开始,返回 ok
exec,执行所有事务块内,事务块内所有命令执行的先后顺序的返回值,操作被,返回空值 nil
discard,取消事务,放弃执行事务块内的所有命令,返回 ok
watch,监视 key 在事务执行之前是否被其他指令改动,若已修改则事务内的指令取消执行,返回 ok
unwatch,取消 watch 命令对 key 的监视,返回 ok


29.Redis key 的过期时间和永久有效分别怎么设置?
答:
可以使用expire 也可以在set的时候指定, 永久有效就是不设置过期时间就可以

30.Redis 如何做内存优化?

答:(查的)

1、缩减键值对象
  缩减键(key)和值(value)的长度,
key长度:如在设计键时,在完整描述业务情况下,键值越短越好。
value长度:值对象缩减比较复杂,常见需求是把业务对象序列化成二进制数组放入Redis。首先应该在业务上精简业务对象,去掉不必要的属性避免存储无效数据。
其次在序列化工具选择上,应该选择更高效的序列化工具来降低字节数组大小。以JAVA为例,内置的序列化方式无论从速度还是压缩比都不尽如人意,这时可以选择更高效的序列化工具,如: protostuff,kryo等,
下图是JAVA常见序列化工具空间压缩对比。
2、共享对象池
  对象共享池指Redis内部维护[0-9999]的整数对象池。创建大量的整数类型redisObject存在内存开销,每个redisObject内部结构至少占16字节,甚至超过了整数自身空间消耗。
所以Redis内存维护一个[0-9999]的整数对象池,用于节约内存。 除了整数值对象,其他类型如list,hash,set,zset内部元素也可以使用整数对象池。因此开发中在满足需求的前提下,尽量使用整数对象以节省内存。
3、字符串优化
4、编码优化
5、控制key的数量


31.Redis 回收进程如何工作的?

答:(查的)

一个客户端运行了新的命令,添加了新的数据。
redis检查内存使用情况,如果大于maxmemory的限制,则根据设定好的策略进行回收。
一个新的命令被执行等等,所以我们不断地穿越内存限制的边界,通过不断达到边界然后不断回收回到边界以下。
如果一个命令的结果导致大量内存被使用(例如很大的集合的交集保存到一个新的键),不用多久内存限制就会被这个内存使用量超越。


32.都有哪些办法可以降低 Redis 的内存使用情况呢?

见30

33.Redis 的内存用完了会发生什么?
答:

需要看配置的策略,可能是直接报错,可能从所有key随机删除,可能从带有过期时间的key中随机删除,可能删除所有key中最近访问最少的,可能删除带过期时间key中最近访问最少的,可能删除最近要过期的

34.一个 Redis 实例最多能存放多少的 keys?List、Set、Sorted Set他们最多能存放多少元素?
答:(查的)

理论上Redis可以处理多达232次方的keys,并且在实际中进行了测试,每个实例至少存放了2亿5千万的keys。我们正在测试一些较大的值。
任何list、set、和sorted set都可以放232次方个元素。
换句话说,Redis的存储极限是系统中的可用内存值。


35.MySQL 里有 2000w 数据,Redis 中只存 20w 的数据,如何保证Redis 中的数据都是热点数据?

答:

内存淘汰策略使用 allkeys_lru  或者 allkeys_lfu  或 volatile_keys_lru 或者 lfu

36.Redis 最适合的场景是什么?

答:
缓存被大量访问且变化不太频繁,数据体积小的数据,通过缓存 他们降低服务器压力



37.假如 Redis 里面有 1 亿个 key,其中有 10w 个 key 是以某个固定的已知的前缀开头的,如果将它们全部找出来?

答:

keys xxx*

38.如果有大量的 key 需要设置同一时间过期,一般需要注意什么?

注意预防缓存雪崩问题,应该间隔分批设置他们的过期时间,或者尽量比卖你设置同一过期时间,防止他们同时过期,所有访问都直接打到数据库上

39.使用过 Redis 做异步队列么,你是怎么用的?

答:(查的)

Redis设计用来做缓存的,但是由于它自身的某种特性使得它可以用来做消息队列。
它有几个阻塞式的API可以使用,正是这些阻塞式的API让其有能力做消息队列;
另外,做消息队列的其他特性例如FIFO(先入先出)也很容易实现,只需要一个list对象从头取数据,从尾部塞数据即可;
Redis能做消息队列还得益于其list对象blpop brpop接口以及Pub/Sub(发布/订阅)的某些接口,它们都是阻塞版的,所以可以用来做消息队列。(List : lpush / rpop)
方式一:生产者消费者模式
使用list结构作为队列,rpush生产消息,lpop消费消息,当lpop没有消息的时候,要适当sleep一会再重试。
或者,不用sleep,直接用blpop指令,在没有消息的时候,它会阻塞住直到消息到来。
方式二:发布订阅者模式
使用pub/sub主题订阅者模式,可以实现1:N的消息队列。
缺点:在消费者下线的情况下,生产的消息会丢失。此场景,建议用MQ。

40.使用过 Redis 分布式锁么,它是什么回事?

获取锁的时候,通过setnx命名set一个key,如果成功则获取锁成功,否则获取失败,需要自旋set,直到成功(阻塞)或者直接返回失败

释放锁的时候就是delete key

41.如何预防缓存穿透与雪崩?

缓存穿透是因为频繁发访问不存在的key,而redis中没有存这个key,导致每次访问都会查数据库,对数据库产生压力。
可以使用:
1. 对于查不出来的数据也在redis set 这个key, value为特殊的空值
2. 可以在接口入口处校验参数,过滤掉非法值
3. 可以使用布隆过滤器

缓存雪崩是由于同一时间大量key同时过期,此时恰好有大量访问,每个访问都会打到数据库,对数据库产生压力。

可以:
1. 避免同时设置相同的过期时间
2. 尝试使用多级缓存
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值