Redis系列——基础

183 阅读4分钟

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的原理

  1. redis调用系统函数fork() ,创建一个子进程进行持久化。
  2. 子进程将数据集写入到一个临时 RDB 文件中(持久化,也就是将内存中的数据写入临时文件)。
  3. 当子进程完成对临时RDB文件的写入时,redis 用新的临时RDB 文件替换原来的RDB 文件,并删除旧 RDB 文件
  4. 在执行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宕机后能进行自动切换

Redis Sentinel机制与用法

使用redis做分布式锁

分布式锁