本文面试题绝对真实(初级)

什么是redis

C语言编写的高性能非关系型的键值对数据库

redis为什么那么快

1、基于内存,操作内存速度是非常快的
2、采用单线程,避免的频繁的上下文切换(6.0后好像支持多线程)
3、数据结构简单
4、使用多路I/O复用模型,非阻塞IO

redis的使用场景

1、热点数据的缓存
2、分布式锁
3、计数器

redis怎么实现分布锁

redis实现分布式锁主要利用redis的setnx命令

如果你这个线程死掉了,你怎么释放这个锁

设置个过期时间,即使线程死掉了,过期时间一到,会自动释放锁

如果锁的时间到期了,现在我正在处理数据怎么办,怎不能直接释放锁吧

给锁续期,当加锁成功之后,同时开启守护线程,默认有效期是30秒,每隔10秒就会给锁续期到30秒,只要持有锁的客户端没有宕机,就能保证锁一直存在,直到业务代码处理完由客户端自己解锁,如果宕机了就在有效期失效之后自动解锁。

redis预加载

所谓的缓存预热就是将一些可能会经常使用的数据,在系统启动的时候就预先设置到缓存中,这样可以避免在使用的时候去先去数据库查询

还有一种方式就是添加一个缓存刷新页,这样可以通过人工干预的方式将一些可能为热点key添加到缓存中

缓存雪崩

缓存雪崩:大量的数据在同一时间段失效,请求都落到了数据库上

1、设置原有的过期时间上增加随机过期时间,防止同时失效
2、加锁排队

那你要设置在多少时间之内呢

看具体的业务需求

缓存穿透

缓存和数据库都查询不到数据,请求都落到了数据库上
1、数据库查询不到返回null设置到缓存中 , 设置个较短的过期时间(如60s)
2、提供一个能迅速判断请求是否有效的拦截机制,比如,利用布隆过滤器,内部维护一系列合法有效的key,迅速判断出,请求所携带的Key是否合法有效。如果不合法,则直接返回
3、利用互斥锁,缓存失效的时候,先去获得锁,得到锁了,再去请求数据库。没得到锁,则休眠一段时间重试

你设置了一个null,那么第10秒我对数据库进行插入操作,后面有大量请求需要这个数据,而不是一直返回null,无法处理,这种情况怎么办

获取到缓存中的数据去判断一下,如果为null我们就去数据库中查,数据库中查到了就更新到缓存中

用户量太大了,把redis撑爆了怎么办

1、紧急临时扩容,可以扩,但是不能一直扩,比较困难
2、内存淘汰策略

redis主从复制、哨兵监控

主从复制:
1.从节点启动向主节点发送sync请求,主节点进行bgsave对缓存中的数据进行快照,期间写入命令都记录到日志

2.主节点发送快照到从节点,继续缓存期间的写命令

3.从节点收到主节点的快照就会加载到自己的内存

4.主节点将缓存期间的命令同步给从节点,从节点收到命令开始执行,这样主从数据就一样了

哨兵监控
哨兵模式是主从的级版,主从出现了故障,不会自动恢复,需要人为干预

主负责什么,从负责什么

主负责写,从负责读

redis的持久化

RDB:
RDB其实就是把数据以快照的形式保存在磁盘上
AOF:
将命令存储起来

你们项目用的什么持久化方式,为什么

RDB
1、RDB文件紧凑,全量备份,非常适合用于进行备份和灾难恢复
2、生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO操作。
3、RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。

你们redis部署了多少台服务器

6台,三主三从

redis现在一台主的服务器怎么切换主的服务器

主从模式那就手动切换:redis-cli -h -p slaveof no one

哨兵模式那就通过哨兵选举

redis挂了怎么办

主节点挂了:
哨兵监控下的集群,主节点挂了自动切换主节点
集群全挂了:
公司有钱的话就整一套灾备