本书涵盖Redis数据类型的使用场景、各种类型的API的使用和底层数据结构源码解析、在DevOps环境中使用Redis的综合实践、Redis主从架构、RedisSentinel Redis、Redis集群环境搭建及其实现的高可用与高可扩原理等内容,提供深入浅出的实战案例,旨在帮助读者深入了解Redis数据结构领域和日常运维Redis所碰到的常见问题解决方案,。
本书适合Redis新手、所有对Redis感兴趣的开发与运维人员阅读和参考,同时还可作为高等院校相关专业的参考教程。
目录
- 前言
- 第1章 大数据高并发离不开Redis1
- 1.1 NoSQL发展历程1
- 1.2 初识Redis3
- 1.3 Redis的魅力3
- 1.4 喜欢Redis的理由4
- 1.5 学习Redis的第一步6
- 1.5.1 在Windows环境下安装Redis6
- 1.5.2 在Linux环境下安装Redis11
- 1.5.3 在Docker环境下安装Redis13
- 1.5.4 Redis界面化管理工具17
- 1.6 redis.conf文件的详细说明18
- 1.7 Redis基本操作21
- 1.7.1 启动Redis服务器21
- 1.7.2 远程登录21
- 1.7.3 切换数据库21
- 1.7.4 删除键22
- 1.7.5 删除当前数据库的所有键22
- 第2章 Redis多种数据类型使用场景23
- 2.1 String数据类型的API和使用场景23
- 2.1.1 String数据类型的常规操作23
- 2.1.2 结合应用场景演练24
- 2.2 String也能做,为什么还要用Hash30
- 2.2.1 Hash数据类型的常规操作31
- 2.2.2 结合应用场景演练31
- 2.3 一种类型多种用法,原来List还可以这样做34
- 2.3.1 List模拟数据结构35
- 2.3.2 List常规操作38
- 2.3.3 利用列表迅速提升网站首页的并发量38
- 2.4 开启Set数据类型的正确操作姿势39
- 2.4.1 明星绯闻和微博瘫痪的那些事39
- 2.4.2 抽奖逻辑39
- 2.4.3 文章点赞或者投票40
- 2.4.4 共同好友统计41
- 2.5 微服务的限流操作和Zset的那些瓜葛42
- 2.5.1 利用Zset实现限流43
- 2.5.2 新闻排行榜场景实战47
- 2.5.3 直播打赏排名场景实战48
- 第3章 数据结构底层50
- 3.1 String数据结构底层解析51
- 3.1.1 String的三种编码51
- 3.1.2 SDS和内存重新分配54
- 3.1.3 embstr编码的内容追加56
- 3.1.4 内存空间释放57
- 3.1.5 SDS特征58
- 3.2 Hash数据结构底层解析58
- 3.2.1 ZipList数据结构58
- 3.2.2 HashTable数据结构66
- 3.2.3 ZipList和HashTable的抉择81
- 3.3 List数据结构底层解析83
- 3.3.1 单向链表83
- 3.3.2 双向链表84
- 3.3.3 Redis链表84
- 3.3.4 快速列表86
- 3.4 Set数据结构底层解析91
- 3.4.1 整数集合91
- 3.4.2 intset和HashTable的抉择94
- 3.5 Zset数据结构底层解析95
- 3.5.1 跳跃表数据结构解析95
- 3.5.2 ZipList和跳跃表的抉择99
- 第4章 数据持久化101
- 4.1 RDB方式持久化102
- 4.1.1 save触发方式103
- 4.1.2 bgsave触发方式103
- 4.1.3 后台触发105
- 4.1.4 RDB备份的应用场景107
- 4.2 AOF方式持久化107
- 4.2.1 AOF持久化流程108
- 4.2.2 相关参数配置113
- 4.2.3 重写操作113
- 4.3 AOF和RDB的数据恢复顺序115
- 4.4 RDB和AOF持久化的优缺点116
- 4.4.1 RDB持久化的优缺点116
- 4.4.2 AOF持久化的优缺点116
- 4.5 AOF+RDB混合模式配置117
- 第5章 Redis的事务和Lua脚本操作119
- 5.1 事务概述119
- 5.2 事务使用120
- 5.2.1 事务的三个阶段120
- 5.2.2 事务范例120
- 5.3 事务性质123
- 5.3.1 原子性123
- 5.3.2 一致性124
- 5.3.3 隔离性124
- 5.3.4 持久性124
- 5.3.5 安全性125
- 5.4 Lua脚本126
- 5.4.1 eval126
- 5.4.2 Lua和Redis数据类型的转换128
- 5.4.3 脚本的原子性130
- 5.4.4 错误处理130
- 5.4.5 带宽和evalsha131
- 5.4.6 脚本缓存131
- 5.4.7 script命令和纯函数脚本132
- 5.4.8 全局变量保护133
- 5.4.9 内部脚本133
- 5.4.10 沙箱和最大执行时间135
- 5.4.11 Redis脚本命令136
- 5.4.12 Lua脚本的好处138
- 5.5 Lua实战138
- 第6章 pub/sub和Stream142
- 6.1 频道的订阅与消息发送142
- 6.2 发布与订阅的使用143
- 6.3 发布与订阅的原理145
- 6.4 订阅模式146
- 6.5 pub和sub使用范例147
- 6.6 与其他发布和订阅比较148
- 6.7 Stream概述148
- 6.8 Stream实例154
- 6.8.1 同组消费模式154
- 6.8.2 不同组消费模式155
- 6.8.3 消息确认157
- 第7章 主从复制158
- 7.1 主从复制概述159
- 7.2 主从复制工作原理159
- 7.2.1 连接建立阶段160
- 7.2.2 数据同步阶段164
- 7.2.3 命令传播阶段181
- 7.2.4 身份验证183
- 7.2.5 延迟与不一致184
- 7.3 Redis复制的注意事项185
- 7.3.1 复制的注意事项185
- 7.3.2 复制的安全性185
- 7.3.3 无须磁盘参与的复制186
- 7.3.4 只读性质的从节点186
- 7.3.5 主从多种模式下的问题187
- 7.4 搭建主从节点的实例189
- 7.4.1 以命令行方式搭建主从节点189
- 7.4.2 以配置文件方式搭建主从节点192
- 7.4.3 以身份验证模式搭建主从架构195
- 7.5 主从架构的“坑”和优化技巧197
- 7.5.1 复制超时问题197
- 7.5.2 主从架构数据应用问题198
- 7.5.3 主从复制中断问题199
- 7.5.4 主从复制应用中的优化技巧199
- 7.5.5 主从架构重要配置总结200
- 7.6 主从架构的作用202
- 第8章 哨兵模式203
- 8.1 哨兵架构概述203
- 8.2 哨兵架构的搭建204
- 8.2.1 运行Sentinel205
- 8.2.2 Sentinel配置205
- 8.2.3 Windows 10搭建Redis 5版本哨兵架构211
- 8.2.4 Linux系统哨兵架构的搭建和验证215
- 8.3 Sentinel API217
- 8.3.1 Sentinel命令217
- 8.3.2 其他相关配置和说明218
- 8.4 哨兵细节原理分析221
- 8.4.1 sdown与odown221
- 8.4.2 哨兵集群的自动发现机制221
- 8.4.3 故障转移的重新配置222
- 8.4.4 从节点选举和优先级222
- 8.4.5 算法和内部结构223
- 8.4.6 配置epoch223
- 8.4.7 配置传播224
- 8.4.8 网络分区下的一致性224
- 8.5 客户端访问哨兵架构的系统226
- 8.5.1 C#连接Redis哨兵架构的系统226
- 8.5.2 Java连接Redis哨兵架构的系统227
- 8.5.3 客户端原理227
- 第9章 Redis集群228
- 9.1 集群概述228
- 9.2 集群作用228
- 9.3 集群设计注意事项229
- 9.4 Redis集群的搭建229
- 9.4.1 在Windows 10下搭建Redis 5集群230
- 9.4.2 在Linux下搭建Redis 6集群233
- 9.5 数据分区策略234
- 9.6 Redis一致性保证235
- 9.7 节点通信机制236
- 9.7.1 通信端口236
- 9.7.2 Gossip协议237
- 9.8 集群的其他细节239
- 9.8.1 Redis集群中的主从复制239
- 9.8.2 Redis集群客户端和服务器端的协议239
- 9.8.3 故障检测241
- 9.9 从节点的选举和提升242
- 9.9.1 主节点回复从节点的投票请求244
- 9.9.2 从节点选举的竞争情况245
- 9.9.3 update消息245
- 9.9.4 备份迁移245
- 9.9.5 备份迁移算法246
- 9.9.6 安全写入247
- 9.9.7 键分布模型247
- 9.9.8 键哈希标签249
- 9.9.9 集群节点信息和源码249
- 9.9.10 集群相关命令251
- 9.10 集群重新分片251
- 9.11 扩容和缩容253
- 9.11.1 扩容253
- 9.11.2 缩容258
- 9.12 故障转移和高可用260
- 9.13 集群使用时的注意事项262
- 第10章 Redis 6新特征264
- 10.1 为什么Redis 6是多线程266
- 10.2 开启多线程267
- 10.3 Redis服务基准测试268
- 10.4 ACL安全策略269
- 10.4.1 ACL规则269
- 10.4.2 使用外部ACL文件271
- 10.4.3 使用ACL命令配置ACL271
- 10.4.4 ACL实例271
- 第11章 布隆过滤器275
- 11.1 布隆过滤器概述275
- 11.2 环境安装275
- 11.2.1 模块化安装275
- 11.2.2 Docker安装276
- 11.3 布隆过滤器的原理277
- 11.4 应用场景278
- 第12章 Redis内存相关策略和内存碎片279
- 12.1 maxmemory配置279
- 12.2 数据淘汰策略280
- 12.3 LRU算法280
- 12.4 LFU算法280
- 12.5 数据过期删除策略281
- 12.6 主从架构和数据持久化对数据的过期处理281
- 12.7 内存碎片282
- 12.7.1 Redis内存碎片的形成282
- 12.7.2 内存使用情况282
- 12.7.3 清理内存碎片283
- 第13章 分布式锁285
- 13.1 为什么需要分布式锁285
- 13.2 非阻塞锁的实现和原理288
- 13.3 阻塞锁的实现和原理290
- 13.4 Redlock原理294
- 13.4.1 什么是Redlock294
- 13.4.2 单节点上实现Redlock295
- 13.4.3 Redlock算法295
- 第14章 高频面试题301
- 14.1 缓存穿透301
- 14.2 缓存击穿304
- 14.3 缓存雪崩305
- 附录 Redis API详情306