Redis面试题之三十八问

1. Redis用过哪些数据类型

string
list
set
zset 有序
hash

bitmap

2. Redis缓存穿透、缓存雪崩和缓存击穿原因,以及解决方案

缓存穿透:

背景 查询一个缓存和db都不存在的数据

对key的格式进行过滤,如公司名+业务名+数据名
缓存空值

当查询缓存数据为空时,可以先进行上锁,查询db,此时其他线程获取锁失败 待定

布隆过滤器判断key是否存在

缓存雪崩:

背景 大量key同时失效,导致大量请求打到db

缓存击穿:

背景 某个热点key在失效的瞬间大量并发请求穿破缓存打到数据库

设置热点key永不失效
如果查询缓存为空时,加锁 其他线程获取锁失败时进行重试

3. 如何使用Redis来实现分布式锁,redis分布式锁有什么缺陷?

没有释放锁 导致线程池打满 后面会报could not get resource from pool
B的锁被A线程释放掉了,A线程业务执行时间过长导致锁自动过期,执行完成释放锁,B的锁被释放掉了
解决办法是添加独有标识,A的锁只能由A释放
锁过期了,业务还没有执行完 通过redis续期解决,redisson提供了锁续期的实现,看门狗

如何设计高效的分布式锁:

互斥:同一时刻只能有一个线程获得锁
防止阻塞:比如一个线程获取锁之后因为故障程序结束,没有释放锁导致其他线程无法获取锁
性能:对于访问量大的共享资源,减少锁等待的时间,避免大量线程等待,降低锁的颗粒度和范围
可重入性

Redisson很好的实现了这些特性
自动延期:watch dog 单独启动一个后台线程,如果业务没有执行完,自动延长持有锁的时间,不过对性能会有影响,要考虑是否必须要开启看门狗

缺点:在使用哨兵模式的时候,如果在加锁完成之后,同步数据到从节点之前master宕机,slave升级为master,这时另外一个线程也会加锁成功可能会导致脏数据的产生,解决方案是RedLock,大多数节点获取锁成功才是真的成功,同理,大多数节点解锁成功才是真的解锁

4. Redis 持久化机制,有几种方式,优缺点是什么,怎么实现的,RDB和AOF的区别

RDB 定时快照方式 以二进制的方式保存到磁盘中

AOF 基于语句追加的方式 将所有对数据库写入的命令记录到AOF文件

5. Redis集群,高可用,原理

redis哨兵 中介 监控master的健康状态,一旦挂了提升slave为master
redis cluster

6. Redis的数据淘汰策略

lru(最近最少使用)
lfu(最不经常使用)
random(随机)
ttl(即将要过期的数据)

7. 为什么要用redis?为什么要用缓存,在哪些场景使用缓存

热点数据
不经常变的热点数据
缓解数据库压力
提高查询效率

8. redis事务,了解吗,了解Redis事务的CAS操作吗

redis事务,所有命令不管成功失败都会执行
CAS
watch 利用的就是CAS,如果值变了就不会执行,回滚

9. Redis为什么是单线程的,为什么单线程还这么快?

因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。

redis是基于内存的,内存的读写速度非常快;
省去了很多上下文切换线程的时间;
使用多路复用技术,可以处理并发的连接。非阻塞IO 内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间。
不需要各种锁的性能消耗

10. 如何保证缓存与数据库双写时的数据一致性?

读的时候先读缓存,缓存没有读数据库 然后将数据放入缓存
写的时候,先更新数据库再删除缓存

11. redis和memcached有什么区别

redis可以用来做存储(storge), 而memccached是用来做缓存,redis支持持久化
存储类型不同,redis支持五种类型,memcache只支持字符串
Redis可以实现主从复制,实现故障恢复。

12. redis的list结构相关的操作。

llen 获取队列长度
lpop 出队
lpush 入队
lrange 获取指定范围的元素
lrem 删除元素
lset 设置队列里面一个元素的值
ltrim

13 Redis的选举算法和流程是怎样的?

哨兵的三个定时任务:
1、每个哨兵每10秒会向主节点和从节点发送info命令获取最新的拓扑结构图,哨兵配置时只需要配置对主节点的监控即可,通过向主节点发送info,获取从节点的信息,并当有新的从节点加入时可以马上感知
2、每个哨兵节点每隔2秒会向redis数据节点的指定频道上(sentinel:hello)发送该哨兵节点对于主节点的判断以及当前哨兵节点的信息,同时每个哨兵节点也会订阅该频道,来了解其他哨兵节点的信息以及对主节点的判断。

3、每隔1秒每个哨兵会向主节点、从节点、其他哨兵发送ping命令,做心跳检测。

14. Reids的主从复制机制原理。

全量同步
增量同步

15. Redis的线程模型是什么?

IO多路复用

16. redis的集群怎么同步的数据的?

哨兵
主从复制

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

512M

18. Redis中的管道有什么用?

将多个命令发送到服务 器,而不用等待回复
节省网络数据包来回 的时间
连续读 连续写

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

multi
exec
discard

20. 一个Redis实例最多能存放多少的keys?List、Set、Sorted Set他们最多能存放多少元素?

2·5亿 与内存有关

21. Redis—跳跃表,复杂度是多少?

logN

22. 如何选择合适的持久化方式

一般是rdb和aof混合使用

23. 我们知道通过expire来设置key 的过期时间,那么对过期的数据怎么处理呢?

定期删除 每隔100ms 随机删除已过期的key
惰性删除 查询key发现已过期将其删除

24. Redis的内存用完了会发生什么?

执行淘汰策略

25. Redis如何做内存优化?

缩减键值对象:满足业务要求下 key 越短越好;value 值进行适当压缩
共享对象池:即 Redis 内部维护[0-9999]的整数对象池,开发中在满足需求的前提下,尽量使用整数对象以节省内存
尽可能使用散列表(hashes)
编码优化,控制编码类型
控制 key 的数量

26. Redis事务的三个阶段

开始事务
命令入队
执行事务

27. Redis事务保证原子性吗,支持回滚吗?

不保证原子性
不支持回滚

28. Redis事务支持隔离性吗?

支持

29. Redis集群的主从复制模型是怎样的?

为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型, 每个节点都会有N-1个复制品.

30. 生产环境中的 redis 是怎么部署的?

redis哨兵 三个节点
主从复制
一主一从

31 说说Redis哈希槽的概念

Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。

Redis 集群没有使用一致性hash, 而是引入了哈希槽的概念。

Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽。这种结构很容易添加或者删除节点,并且无论是添加删除或者修改某一个节点,都不会造成集群不可用的状态。

使用哈希槽的好处就在于可以方便的添加或移除节点。

当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了;当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了;在这一点上,我们以后新增或移除节点的时候不用先停掉所有的 redis 服务。

“用了哈希槽的概念,而没有用一致性哈希算法,不都是哈希么?这样做的原因是为什么呢?”

Redis Cluster是自己做的crc16的简单hash算法,没有用一致性hash。Redis的作者认为它的crc16(key) mod 16384的效果已经不错了,虽然没有一致性hash灵活,但实现很简单,节点增删时处理起来也很方便。

“为了动态增删节点的时候,不至于丢失数据么?”

节点增删时不丢失数据和hash算法没什么关系,不丢失数据要求的是一份数据有多个副本。

“还有集群总共有2的14次方,16384个哈希槽,那么每一个哈希槽中存的key 和 value是什么?”

当你往Redis Cluster中加入一个Key时,会根据crc16(key) mod 16384计算这个key应该分布到哪个hash slot中,一个hash slot中会有很多key和value。你可以理解成表的分区,使用单节点时的redis时只有一个表,所有的key都放在这个表里;改用Redis Cluster以后会自动为你生成16384个分区表,你插入数据时会根据上面的简单算法来决定你的key应该存在哪个分区,每个分区里有很多keyRedis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。

Redis 集群没有使用一致性hash, 而是引入了哈希槽的概念。

Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽。这种结构很容易添加或者删除节点,并且无论是添加删除或者修改某一个节点,都不会造成集群不可用的状态。

使用哈希槽的好处就在于可以方便的添加或移除节点。

当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了;当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了;在这一点上,我们以后新增或移除节点的时候不用先停掉所有的 redis 服务。

“用了哈希槽的概念,而没有用一致性哈希算法,不都是哈希么?这样做的原因是为什么呢?”

Redis Cluster是自己做的crc16的简单hash算法,没有用一致性hash。Redis的作者认为它的crc16(key) mod 16384的效果已经不错了,虽然没有一致性hash灵活,但实现很简单,节点增删时处理起来也很方便。

“为了动态增删节点的时候,不至于丢失数据么?”

节点增删时不丢失数据和hash算法没什么关系,不丢失数据要求的是一份数据有多个副本。

“还有集群总共有2的14次方,16384个哈希槽,那么每一个哈希槽中存的key 和 value是什么?”

当你往Redis Cluster中加入一个Key时,会根据crc16(key) mod 16384计算这个key应该分布到哪个hash slot中,一个hash slot中会有很多key和value。你可以理解成表的分区,使用单节点时的redis时只有一个表,所有的key都放在这个表里;改用Redis Cluster以后会自动为你生成16384个分区表,你插入数据时会根据上面的简单算法来决定你的key应该存在哪个分区,每个分区里有很多key

32. 什么是 RedLock?

分布式安全特性:互斥访问,即永远只有一个 client 能拿到锁
避免死锁:最终 client 都可能拿到锁,不会出现死锁的情况,即使原本锁住某资源的 client crash 了或者出现了网络分区
容错性:只要大部分 Redis 节点存活就可以正常提供服务

33. Redis常见性能问题和解决方案?

(1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件;(Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照;AOF文件过大会影响Master重启的恢复速度)
(2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次
(3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内
(4) 尽量避免在压力很大的主库上增加从库
(5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3…;这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。

34. Redis如何做大量数据插入?

管道

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

scan

36. 使用Redis做过异步队列吗,是如何实现的?

lpush rlpop 阻塞pop

37. Redis如何实现延时队列?

zset实现 value为消息 score为过期时间戳 轮训取出到期的任务进行执行

取任务和移除任务可以设置为原子性的 用lua实现

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

  1. 一个客户端运行了新的命令,添加了新的数据。
  2. Redis 检查内存使用情况,如果大于 maxmemory 的限制,则根据设定好的策略进行回收。
  3. 一个新的命令被执行,等等。
  4. 我们不断地穿越内存限制的边界,通过不断达到边界然后不断地回收回到边界以下。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值