Redis数据类型
- 五个基本数据类型: String、Hash、List、Set、SortedSet
- 高级数据类型: HyperLogLog、Geo、Pub/Sub
- Redis Module: BloomFilter,RedisSearch,Redis-ML
Redis怎么做异步队列
- 一般使用list结构作为队列,rpush生产消息,lpop消费消息。当lpop没有消息的时候,要适当sleep一会再重试
- list还有个指令叫blpop,在没有消息的时候,它会阻塞住直到消息到来
用Redis怎么实现一次生产多次消费
可以使用pub/sub主题订阅者模式,可以实现 1:N 的消息队列
pub/sub的缺点
在消费者下线的情况下,消息会丢失
Redis怎么实现延时队列
使用sortedset,拿时间戳作为score,消息内容作为key调用zadd来生产消息,消费者用zrangebyscore指令获取N秒之前的数据轮询进行处理
Redis是怎么实现持久化的
RDB做镜像全量持久化,AOF做增量持久化。因为RDB会耗费较长时间,不够实时,在停机的时候会导致大量丢失数据,所以需要AOF来配合使用。在redis实例重启时,会使用RDB持久化文件重新构建内存,再使用AOF重放近期的操作指令来实现完整恢复重启之前的状态
机器断电关机等,数据是否会丢失
AOF日志的sync属性可以配置同步间隔,如果配置了每条指令都做同步,就不会丢失数据,但是出于性能考虑,这样做不现实,一般都采用定时同步,比如1s一次,这样最多丢失1s的数据
Redis RDB的原理
- redis调用系统函数fork() ,创建一个子进程进行持久化。
- 子进程将数据集写入到一个临时 RDB 文件中(持久化,也就是将内存中的数据写入临时文件)。
- 当子进程完成对临时RDB文件的写入时,redis 用新的临时RDB 文件替换原来的RDB 文件,并删除旧 RDB 文件
- 在执行fork的时候操作系统(类Unix操作系统)会使用写时复制(copy-on-write)策略,即fork函数发生的一刻父子进程共享同一内存数据,当父进程要更改其中某片数据时(如执行一个写命令),操作系统会将该片数据复制一份以保证子进程的数据不受影响,所以新的RDB文件存储的是执行fork那一刻的内存数据
Redis主从同步的原理/过程
配置好slave服务器连接的master后,slave会建立和master的连接,然后发送sync命令。无论是第一次同步建立的连接还是连接断开后的重新连接,master都会启动一个后台进程,将数据库快照保存到文件中.同时master主进程会开始收集新的写命令并缓存起来。当后台进程完成写文件后,master就将快照文件发送给slave,slave将文件保存到磁盘上,然后加载到内存将数据库快照恢复到slave上。slave完成快照文件的恢复后,master就会把缓存的命令都转发给slave,slave更新内存数据库。后续master收到的写命令都会通过开始建立的连接发送给slave。从master到slave的同步数据的命令和从 client到master发送的命令使用相同的协议格式。当master和slave的连接断开时,slave可以自动重新建立连接。如果master同时收到多个slave发来的同步连接命令,只会使用启动一个进程来写数据库镜像,然后发送给所有slave
怎么配置主从同步
在slave的服务器配置文件中(redis.conf)设置
# 指定master的ip和端口
slaveof 127.0.0.1 6379
上述同步机制有缺陷,怎么避免
上面这种配置方法,当master挂掉,也就相当于redis集群挂掉,需要一种机制自动判定master。
Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都没有实现自动进行主备切换,而Redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行自动切换