一、Redis是什么?

Redsi是一种高性能的key-value NOSQL数据库,内置多种数据结构,支持市面多种主流语言,使用起来简单便捷。

二、为什么使用Redis ?

因为传统的关系型数据库如Mysql不能适用于高访问流量场景,很容易把数据库打崩,所以引入了缓存中间件,目前市面上比较常用的缓存中间件有Redis和Memcached,redis支持多种数据结构,是单线程,完全基于内存,原子性操作,没有加锁释放锁的性能消耗,支持RDB镜像持久化和AOF增量持久化,支持分布式存储,在综合考虑了他们的优缺点后,最后选择了redis。

三、Redis有哪些数据结构?应用场景是什么?

字符串String、列表List、集合Set、字典Hash、有序集合Sorted Set。

String一般用来存储简单的健值类型,如用户信息、登录信息,还有一种是数值自增、自减操作,如库存扣减。

List一般用来存储列表信息,或作为轻量级的队列,rpush生产消息,lpop消费消息,当lpop没有消息,要适当sleep一会再试,或者blopop,会阻塞直到消息到来。需要注意的是作为队列,没有重试机制,消费完消息,消息在Redis就没有了。

Set作为无序不能重复的集合,一般用来存储无序不能重复的内容,如学生姓名。

Sorted Set作为有序不能重复的集合,一般用来做排行榜,或用来做延时队列,时间戳作为score,消息内容作为key,调用zadd生产消息,zrangebyscore获取N秒之前的数据进行轮询。

四、Redis是如何持久化的?

RDB做镜像持久化,AOF增量持久化,因为RDB耗时,不够实时,在停机时丢失大量数据,所以需要AOF配合,在redis实例重启时,会使用RDB持久化文件重新构建内存,再使用AOF重放操作恢复重启前的状态。AOF增量持久化可以设置持久化的频次,如1S执行1次,这样假如停机,只会丢失这1S的数据。

RDB原理:fork和copy on write。fork是指redis通过创建子进程来进行RDB操作,cow指的是copy on write,子进程创建后,父子进程共享数据段,父进程继续提供读写服务,新写的数据对持久化不会造成影响,持久化过程中报错或者耗时太久,对当前对外提供的服务也不会产生影响持久化完成新的rdb文件覆盖之前的。

五、Redis同步机制是什么?

可以使用主从同步、从从同步。第一次同步时,主节点做一次bgsave,并同时将后续修改操作记录到内存buffer,待完成后,将RDB文件全量同步到复制节点,复制节点接收完成后,将RDB镜像加载到内存。加载完成后,再通知主节点将期间修改的操作记录同步到复制节点,就完成了同步过程。后续增量数据通过AOF日志同步即可。

六、如果Redis主节点宕机,redis写服务不能使用,这时候Redis如何主备切换?

Redis使用了哨兵机制来解决这个问题。Redis Sentinel是一个分布式架构,其中包含了若干个数据节点和Sentinel节点,每个Sentinel节点都会对其他Sentinel节点和数据节点进行监控,当它发现节点不可达时,会做下线标识,如果不可达的节点是主节点,它会和其他Sentinel节点协商,当大多数Sentinel节点认为主节点下线时,Sentinel集群会选出一个Sentinel节点,来完成自动故障转移的工作,整个过程是自动的,不需要人工干预。

如图所示:

关于Redis的一些总结

基本的故障转移过程:

1)主节点出现故障,此时两个从节点与

 关于Redis的一些总结关于Redis的一些总结

2)每个Sentinel节点通过定期监控发现主节点出了故障

关于Redis的一些总结

3)多个Sentinel节点对主节点的故障达成一致,并选取出其中一个节点作为领导者,进行故障转移

关于Redis的一些总结

4)Sentinel领导者节点进行了故障转移,整个过程自动完成

关于Redis的一些总结

5)故障转移后,整个Redis Sentinel集群,重新选取了新的主节点

关于Redis的一些总结

七、Redis和Memcached区别?

数据类型:redis支持多种数据结构,memcached仅支持字符串
数据持久化:redis支持RDB镜像持久化,AOF增量持久化(定时同步,如1s/1次),RDB耗时,在停机时丢失大量数据,需要AOF配合,在redis实例重启时,使用RDB持久化文件重新构建内存,再使用AOF重放操作恢复重启前的状态,memcached无持久化 
线程模型:redis是单线程,完全基于内存,代码更清晰,逻辑简单,没有加锁、释放锁的性能消耗,不存在多进程、线程切换消耗CPU,memcached是多线程。
分布式:memcached不支持分布式,只能通过在客户端使用一致性哈希算法,实现分布式存储,这种方式在存储和查询时,都需要在客户端计算一次数据所在的节点。redis cluster实现了分布式的存储
内存管理机制:redis 并非所有数据都在内存中,可将没用数据交换到磁盘,而membcached数据一直在内存中,membcached将内存分割成特定长度块来存储数据,以完全解决内存碎片问题,但是这种内存利用率不高。
 

参考链接:

Redis哨兵机制

相关文章: