第1章 Redis入门,学会运用五个核心的数据结构
1.1 Redis简介
1.1.1 Redis是什么?
1.1.2 Redis有哪些优势?
1.1.3 Redis可以做什么?
1.2 安装Redis
在Linux环境下安装Redis,参考【尚硅谷】Redis 6 入门到精通 超详细 教程_哔哩哔哩_bilibili
然后按照视频修改redis.conf
,这里不作过多赘述。
- 将原始
redis.conf
拷贝到/root/6379
目录下
cp redis.conf /root/6379
- 修改拷贝好的
redis.conf
- 显示行号
:set nu
# bind 127.0.0.1 -::1
注释掉这行daemonize yes
是不是后台运行模式,改为yes
logfile /root/6379/redis.log
修改日志文件保存路径dir /root/6379
修改持久化文件存放路径requirepass nowcoder123
设置密码
- 启动redis服务端
redis-server /root/6379/redis.conf
- 启动redis客户端
redis-cli -a nowcoder123
1.3 字符串
1.3.1 字符串简介
使用
mset
mget
可以减少网络开销,提升性能。
1.3.2 典型使用场景
1.4 哈希
1.4.1 哈希简介
1.4.2 典型使用场景
1.5 列表
1.5.1 列表简介
1.5.2 典型使用场景
1.6 集合
1.6.1 集合简介
1.6.2 典型使用场景
1.7 有序集合
1.7.1 有序集合简介
1.7.2 典型使用场景
1.8 管理Redis
1.9 Redis客户端
本课程采用Jedis
来学习,具体导包可从Jedis链接。
1.10 Redis使用示例
1.10.1 💖【Jedis连接不上的原因】:防火墙没有关闭
- 查看防火墙状态
systemctl status firewalld
service iptables status
- 暂时关闭防火墙
systemctl stop firewalld
service iptables stop
- 永久关闭防火墙
systemctl disable firewalld
chkconfig iptables off
- 重启防火墙
systemctl enable firewalld
service iptables restart
1.11 Redis通信协议
1.11.1 Redis采用的通信协议
1.11.2 发送命令的数据格式
1.11.3 返回结果的数据格式
第2章 探究对象编码,理解Redis底层的实现机制
2.1 Redis的对象体系
2.1.1 Reids的类型与编码
2.1.2 查看类型与编码
2.1.3 查看Redis的源码
2.2 简单动态字符串
2.2.1 什么是简单动态字符串
2.2.2 为什么不用C原生字符串
2.2.3 Redis3.2之前的实现方案
2.2.4 Redis3.2改进的实现方案
2.3 整数集合
2.3.1 整数集合简介
2.3.2 整数集合的实现
2.3.3 集合的升级与降级
2.4 字典
2.4.1 字典简介
2.4.2 字典实现
2.4.3 哈希算法
2.4.4 REHASH
2.5 链表
2.5.1 链表简介
2.5.2 链表的实现
2.5.3 链表的特点
2.6 压缩列表
2.6.1 压缩列表简介
2.6.2 压缩列表的实现
2.6.3 压缩列表的连锁更新
2.7 快速列表
2.7.1 快速列表简介
2.7.2 快速列表的实现
2.7.3 数据压缩机制
2.8 跳跃表
2.8.1 跳跃表简介
2.8.2 跳跃表的实现
2.8.3 跳跃表小结
2.9 Redis对象的底层实现
2.9.1 Redis对象的源码
2.9.2 对象的类型
2.9.3 对象的编码
2.9.4 类型与编码
2.9.5 对象的访问时间
2.9.6 对象的引用计数
2.10 Redis对象的类型与编码
2.10.1 字符串
2.10.2 哈希
2.10.3 列表
2.10.4 集合
2.10.5 有序集合
为了展示方便,上图在字典和跳跃表中重复展示了各个元素的成员和分值,但在实际中,字典和跳跃表会共享元素的成员和分值,所以并不会造成任何数据重复,也不会因此而浪费任何内存。
为什么有序集合需要同时使用跳跃表和字典来实现?
在理论上,有序集合可以单独使用字典或者跳跃表的其中一种数据结构来实现,但无论单独使用字典还是跳跃表,在性能上对比起同时使用字典和跳跃表都会有所降低。举个例子,如果我们只使用字典来实现有序集合,那么虽然以O(1)
复杂度查找成员的分值这一特性会被保留,但是,因为字典以无序的方式来保存集合元素,所以每次在执行范围型操作————比如ZRANK
、ZRANGE
等命令时,程序都需要对字典保存的所有元素进行排序,完成这种排序需要至少O(NlogN)
时间复杂度,以及额外的O(N)
内存空间(因为需要创建一个数组来保存排序后的元素)。
另一方面,如果我们只使用跳跃表来实现有序集合,那么跳跃表执行范围型操作的所有优点都会被保留,但因为没有字典,所以根据成员查找分值这一操作的复杂度将从O(1)
上升为O(logN)
。因为以上原因,为了让有序集合的查找和范围型操作都尽可能快地执行,Redis选择了同时使用字典和跳跃表两种数据结构来实现有序集合。
2.11 Redis的线程模型
2.11.1 Redis真的是单线程吗
2.11.2 Redis为什么采用单线程
2.11.3 Redis的单线程IO模型
第3章 Redis进阶,学会运用高级数据结构和功能
3.1 BitMap
3.1.1 BitMap简介
3.1.2 BitMap的扩展
3.1.3 BitMap的使用场景
3.2 HyperLogLog
3.2.1 HyperLogLog简介
3.2.2 HyperLogLog的使用场景
3.3 GEO
3.3.1 GEO简介
3.3.2 GEO的使用场景
3.4 发布订阅
3.4.1 发布订阅简介
3.4.2 发布订阅的使用场景
3.5 Stream
3.5.1 Stream之前
3.5.2 Stream简介
3.5.3 Stream特征
3.6 Pipeline流水线
3.6.1 RTT往返时间
3.6.2 Pipeline
3.6.3 Pipeline与批量命令对比
3.7 事务
3.7.1 事务简介
3.7.2 带乐观锁的事务
3.8 Lua脚本
3.8.1 Lua脚本简介
3.8.2 使用Lua脚本
3.8.3 管理Lua脚本
3.9 模块(了解即可,暂不需要学习)
3.9.1 模块简介
3.9.2 使用模块
3.10 慢查询日志
3.10.1 慢查询日志简介
3.10.2 慢查询配置参数
3.10.3 慢查询相关命令
第4章 持久化与复制,保障Redis服务的数据安全
4.1 RDB持久化
4.1.1 RDB简介
4.1.2 SAVE、BGSAVE命令
4.1.3 配置选项
4.1.4 BGSAVE流程
4.1.5 BGSAVE的原理
4.1.6 RDB的优缺点
4.2 RDB的文件结构
4.2.1 RDB的文件结构
4.2.2 载入RDB文件
4.3 AOF持久化
4.3.1 AOF简介
4.3.2 启用AOF
4.3.3 命令写入
4.3.4 文件同步
4.3.5 AOF的缺点
4.4 AOF的重写机制
4.4.1 AOF重写
4.4.2 AOF重写的触发方式
4.4.3 AOF重写的流程
4.4.4 重启加载
4.5 RDB-AOF混合持久化
4.5.1 RDB-AOF混合持久化
4.5.2 RDB-AOF混合文件的载入过程
4.6 Redis持久化方式小结
4.6.1 选择哪种持久化方式?
4.6.2 无持久化
4.6.3 SHUTDOWN与持久化
4.7 Redis持久化性能调优
4.7.1 改善fork操作的耗时
4.7.2 优化子进程的开销
4.7.3 AOF追加阻塞
4.8 复制
4.8.1 复制功能简介
4.8.2 复制功能的拓扑结构
4.8.3 复制功能的相关命令
4.9 复制的原理
4.9.1 复制过程
4.9.2 数据同步
4.9.3 psync命令
4.9.4 全量复制
4.9.5 部分复制
4.9.6 其他
4.10 复制的常见问题
4.10.1 读写分离
4.10.2 主从配置不一致
4.10.3 规避全量复制
第5章 哨兵与集群,构建高可用和高并发的Redis服务
5.1 哨兵
5.1.1 故障转移
5.1.2 主从复制的问题
5.1.3 哨兵
5.1.4 哨兵的拓扑结构
5.1.5 哨兵节点的特征
5.2 哨兵的配置与部署
5.2.1 配置参数
5.2.2 部署技巧
5.3 哨兵的实现原理
5.3.1 三个定时监控任务
5.3.2 主观下线和客观下线
5.3.3 领导者哨兵节点的选举
5.3.4 故障转移
5.4 集群
5.4.1 数据分布理论
5.4.2 Redis数据分区
5.4.3 集群功能的限制
5.5 集群的配置与部署
redis-cli -a nowcoder123 --cluster create 192.168.175.131:9001 192.168.175.131:9002 192.168.175.131:9003 192.168.175.131:9004 192.168.175.131:9005 192.168.175.131:9006 --cluster-replicas 1
5.6 集群的扩容与收缩
5.7 集群中节点的通信
5.7.1 通信过程
5.7.2 Gossip协议
5.7.3 节点选择
5.8 集群的请求路由
5.8.1 请求重定向
5.8.2 Smart客户端
5.8.3 ASK重定向
5.9 集群的故障转移
5.9.1 故障发现
5.9.2 故障恢复