1. Redis数据结构
1. 常用数据结构
字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。
2. 高级数据结构
- HyperLogLog、Geo、Pub/Sub。
- Redis Module,像BloomFilter,RedisSearch,Redis-ML
2. Redis分布式锁
1. Redis分布式锁原理
先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放。
2. 如果在setnx之后执行expire之前进程意外crash或者要重启维护,如何处理?
仅当keyName不存在(NX选项)且过期时间为5秒(ex选项)时,该命令才会设置该值
SET keyName true NX EX 5
3. 假如Redis存储有1亿个key,其中10w个key是以某个固定的已知的前缀开头的,如何将它们全部找出来?
使用keys指令可以扫出指定模式的key列表。
4. 如果Redis正在给线上的业务提供服务,那使用keys指令会有什么问题?
- Redis是单线程的。keys指令会导致线程阻塞一段时间,线上服务会停顿,直到指令执行完毕,服务才能恢复。
- 使用scan指令,scan指令可以无阻塞的提取出指定模式的key列表,但是会有一定的重复概率,在客户端去重即可,但是整体所花费的时间会比直接用keys指令长。
3. Redis实现异步队列
1. Redis如何实现队列
一般使用list结构作为队列,rpush生产消息,lpop消费消息。当lpop没有消息的时候,要适当sleep一会再重试。
2. 不用sleep,如何处理没有消息的情况?
可以使用list数据结构的blpop指令,在没有消息的时候,它会阻塞住直到消息到来。
3. Redis队列如何实现生产一次消费多次?
使用pub/sub主题订阅者模式,可以实现1:N的消息队列。
4. pub/sub有什么缺点?
在消费者下线的情况下,生产的消息会丢失,这种情况下可以使用专业的消息队列如rabbitmq等。
5. redis如何实现延时队列?
使用sortedset,拿时间戳作为score,消息内容作为key调用zadd来生产消息,消费者用zrangebyscore指令获取N秒之前的数据轮询进行处理。
6. 如果有大量的key需要设置同一时间过期,一般需要注意什么?
如果大量的key过期时间设置的过于集中,到过期的那个时间点,redis可能会出现短暂的卡顿现象。一般需要在时间上加一个随机值,使得过期时间分散一些。
4. Redis持久化
1. Redis持久化如何实现?
- bgsave做镜像全量持久化,aof做增量持久化。因为bgsave会耗费较长时间,不够实时,在停机的时候会导致大量数据丢失,所以需要aof来配合使用。
- 在redis实例重启时,会使用bgsave持久化文件重新构建内存,再使用aof重放近期的操作指令来实现完整恢复重启之前的状态。
2. 如果突然机器掉电会怎样?
- 取决于aof日志sync属性的配置
- 如果不要求性能,在每条写指令时都sync一下磁盘,就不会丢失数据。
- 在高性能的要求下每次都sync是不现实的,一般都使用定时sync,比如1s1次,这个时候最多就会丢失1s的数据。
3. bgsave的原理是什么?
- fork和cow。
- fork指redis通过创建子进程来进行bgsave操作
- cow指的是copy on write,子进程创建后,父子进程共享数据段,父进程继续提供读写服务,写脏的页面数据会逐渐和子进程分离开来。
5. Redis管道
1. Pipeline优点
可以将多次IO往返的时间缩减为一次,前提是pipeline执行的指令之间没有因果相关性。
2. 为什么要用Pipeline
使用redis-benchmark进行压测的时候可以发现影响redis的QPS峰值的一个重要因素是Pipeline批次指令的数目。
6. Redis的同步机制
1. Redis 支持哪些同步机制?
Redis可以使用主从同步,从从同步。
2. Redis主从同步实现
- 第一次同步时,主节点做一次bgsave,并同时将后续修改操作记录到内存buffer,待完成后将rdb文件全量同步到复制节点
- 复制节点接收完成后将rdb镜像加载到内存
- 加载完成后,再通知主节点将期间修改的操作记录同步到复制节点进行重放
7. Redis集群
- Redis Sentinal着眼于高可用,在master宕机时会自动将slave提升为master,继续提供服务。
- Redis Cluster着眼于扩展性,在单个redis内存不足时,使用Cluster进行分片存储。
8. 参考
https://baijiahao.baidu.com/s?id=1594341157941741587&wfr=spider&for=pc