Redis 作为 MySQL 的缓存
1、高性能
2、高并发
数据结构
String | SDS(简单动态字符串) | 缓存对象、常规计数、 |
List | 双向链表或压缩列表 (3.2版之后使用quicklist) | 消息队列 |
Hash | 压缩列表或哈希表 (7.0版之后使用listpack) | 缓存对象、购物车等 |
Set | 哈希表或整数集合 | 聚合计算(并集、交集、差集)场景,比如点赞、共同关注、抽奖活动 |
ZSet | 压缩列表或跳表(7.0版之后使用listpack) | 排序场景,比如排行榜、电话和姓名排序等 |
线程模式
对Redis是单线程的理解 - 知乎 (zhihu.com)
redis单线程模型,本质上指的是服务端的数据处理阶段,【接收客户端请求->解析请求 ->进行数据读写等操作->发送数据给客户端】
redis分客户端和服务端,一次完整的redis请求事件有多个阶段:
1、客户端与服务端建立连接(socked通信方式),可以同时建立多个连接
2、redis读写事件,向服务端发送请求
3、服务端数据处理(接收到请求即开始单线程,返回数据后再开始完成下一个接收到的请求)
4、返回数据
redis很快:
1、基于内存,读写速度很快;
2、基于I/O多路复用;内核一直监听这些 Socket 上的连接请求或数据请求,接收到请求就交给 Redis 线程处理,这就实现了一个 Redis 线程处理多个 IO 流的效果。
3、避免了多线程之间的竞争,省去了多线程切换带来的时间和性能上的开销
数据持久化
AOF日志 | 每执行一条写操作命令,就把该命令以追加的方式写入到一个文件里 | 先执行命令再写入日志; AOF 日志过大,会触发AOF 重写机制, |
RDB快照 | 将某一时刻的内存数据,以二进制的方式写入磁盘; | save 命令:主线程生成 RDB 文件,写入 RDB 文件的时间太长,会阻塞主线程; bgsave 命令:创建一个子进程来生成 RDB 文件,这样可以避免主线程的阻塞;执行快照的时候——写时复制技术 |
混合持久化方式 | AOF 文件的前半部分是 RDB 格式的全量数据,后半部分是 AOF 格式的增量数据。 |
AOF 重写机制:记录当前数据库中的所有键值对——作为新的AOF文件;由后台子进程 bgrewriteaof 来完成的,主进程可以继续处理命令请求,避免阻塞主进程
big key
定义:(大value)key存储的value很大、hash,list,set等存储value值多
问题:reids单线程,大key阻塞进程;执行相关命令耗时、占用cpu;
解决:可删除(非热key);不可删除(拆分、压缩)
对AOF日志的影响:
AOF三种写回磁盘的策略:Always、Everysec、No。(主要是控制 fsync() 函数的调用时机)
Always(同步写回) | 大key:主线程执行,阻塞时间久 |
Everysec(每秒写回) | 异步执行、不影响 |
No(操作系统控制写回) | 永不执行、不影响 |
AOF写入大key,很快触发AOF重写机制;AOF 重写机制和 RDB 快照(bgsave 命令)的过程,都会分别通过 fork() 函数创建一个子进程来处理任务。(1)创建子进程,复制父进程的页表(包含虚拟地址和映射),越多大key,页表越大,可能阻塞进程;(2)发生写时复制(复制物理地址),因为大key占用物理地址大,父进程可能发送阻塞
Redis四种模式
单机模式、
主从模式、
将一台Redis服务器的数据,复制到其他的Redis服务器;
数据的复制是单向的,只能由主节点(master)到从节点(slave);
主从复制:
共有三种模式:全量复制、基于长连接的命令传播、增量复制(和repl_backlog_size 大小有关系)。
replication buffer | repl backlog buffer |
全量复制阶段和增量复制阶段 | 增量复制阶段 |
连接断开,删除缓存,从节点重新连接,重新开始全量复制。 | 环形结构,缓存区满了会覆盖 |
主从数据不一致:
1、因为主从节点间:异步
2、应对:保证主从网络连接良好;开发一个外部程序来监控主从节点间的复制进度 。
哨兵模式、
实现主从节点故障转移:监控、选主、通知
1、主节点故障?
主观下线:多个哨兵判断(哨兵通常以集群形式出现,哨兵节点至少要有 3 个)
客观下线(只适用于主节点):
2、主从切换
选举出了哨兵 leader 后,挑选出一个状态良好、数据完整的从节点,发送 SLAVEOF no one 命令,转换为「主节点」。
可能导致数据丢失的两种情况:
- 异步复制同步丢失;(master宕机时由于部分数据未同步到slave导致的数据丢失)
- 集群产生脑裂
解决:
# 要求至少一个salve,完成数据同步,才认为数据写入成功
min-slaves-to-write 1
# 配置复制和不同延迟不能超过10秒
min-slaves-max-lag 10
集群模式
在多个 Redis 节点之间进行数据共享的设施