作者:fuchen201101 | 来源:互联网 | 2023-08-06 17:07
1.nosql有哪些,各自的优点
- Memcached:多核操作,单实例QPS极高,但只支持key-value结构存储,无法持久化,不能备份,不能同步,仅内存操作。
- MongDb:文档型数据库,存放xml,json。可以同步,持久化。
- redis:
- 支持多种数据结构,如 string(字符串)、 list(双向链表)、dict(hash表)、set(集合)、zset(排序set)、hyperloglog(基数估算)、Pub/Sub、BloomFilter(布隆过滤器)
- 支持AOF,RDB持久化到硬盘
- 支持主从同步
2.redis分布式锁
先拿setnx来争取锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记释放。
如果在setnx之后,expire执行之前程序crash了。set指令有复杂的操作可以同时把setnx、expire合并到一条命令执行。
3.如何查找某固定前缀开头的信息?
keys指令
4.如果redis正在给线上业务提供服务,这个时候keys会出现什么问题?
- redis是单线程的,keys指令会导致现场阻塞一段时间,线上的服务会停顿,直到指令结束。
- 使用scan(增量式迭代)指令,scan指令可以无阻塞提取制定模式的keys列表,有几率存在重复,花费时间比keys长。
5.redis异步队列
- 一般使用list结构作为队列,rpush生产信息,lpop消费信息。lpop没有消息时,适当sleep或者blpop阻塞一会再重试。
- 使用pub/sub主题订阅模式可以实现生产一次消费多次。
6.pub/sub缺点
在消费者下线时会丢失生产数据,可以使用rocketmq
7.redis如何实现延时队列
使用sortedset,拿时间戳作为score,消息内容作为key调用zadd来生产信息,消费者用zrangebyscore指令获取N秒前的数据进行轮询。
8.redis如何持久化?
RDB做镜像全持久化:会比较耗时,在服务器宕机时会丢失大量数据,就比如要保存一整个数据库的文件,它是一个一个的文件,在某一个段的数据上,它是完整的。
AOF做增量持久化:类似于每次的操作日志比如mysql的binlog。
redis本身机制是AOF持久化开启时会首先加载AOF文件;AOF关闭或不存在时才会加载RDB文件,加载完成后启动成功。
9.如果机器突然宕机了会怎么办?
取决于AOF日志的sync属性配置,如果不要求性能,可以每写一条指令就sync一下磁盘,不会丢数据。
如果在高性能下,一般使用定时sync,比如1s1次,最多只会丢失1s的数据。
10.RDB原理是怎么实现的
fork:redis通过创建子进程来进行RDB操作,
cow(copy on write):子进程创建完后,父子进程共享数据段,父进程继续提供读写服务,写脏的页面数据会逐渐和子进程分离开
11.pipeline(管道模式)的好处
pipeline:因为redis是单线程的,请求只能按部就班一次一次来,这个可以提供多次请求无需等待,直接返回
可以将多次io往返时间缩短为一次,前提是pipeline执行的指令之间没有因果相关性。redis-benchmark压测时可以发现影响redis的QPS峰值的重要因素是pipeline批次指令的数目。
12.redis 同步机制
redis可以做主从同步,从从同步。
- 第一次同步时,主节点做一次bgsave,并同时将后续修改操作记录到内存buffer。
- 待完成后将RDB文件全量同步到复制节点中,复制节点接受完RDB文件后将RDB镜像加载到缓存中。
- 复制节点RDB加载完成后再通知主节点将近期修改的操作记录同步到复制节点进行重放。
- 后续的增量数据可以通过AOF日志同步。
13.redis集群高可用怎么保证?集群的原理是什么?
- redis Sentinal:高可用,在master宕机的时候回自动将slave升为master,继续提供服务。若之前的master恢复后不会变成master,而是充当slave。
- redis Cluster:扩展性,在单个redis内存不足时,使用cluster进行分片存储,即redis有16384个卡槽,redis会通过存储的key计算出需要存储在哪个段的槽中。