| 作者 |
| 尼恩陈雷 内封:陈雷 方波 黄桃 李乐 施洪宝 熊浩含 闫昌 张仕华 周生政 |
| 丛书名 |
| 出版社 |
| 机械工业出版社 |
| ISBN |
| 9782002072116 |
| 简要 |
| 简介 |
| 内容简介书籍计算机书籍 ---------------------------Netty、Redis、ZooKeeper高并发实战--------------------------- 本书为了让读者扎稳高性能基础,浅显易懂地剖析高并发IO的底层原理,细致细腻地解析Reactor高性能模式,图文并茂地介绍Java异步回调模式。掌握这些基础原理,能够帮助读者解决Java后台开发的一些实际问题。 本书共12章,主要介绍高性能通信框架Netty,并详尽介绍Netty的EventLoop、Handler、Pipeline、ByteBuf、Decoder、Encoder等重要组件,然后介绍单体IM的实战设计和模块实现。本书对ZooKeeper、 Curator API、Redis、Jedis API的使用也进行详尽的介绍,让读者具备高并发、可扩展系统的设计和开发能力。 ---------------------------Redis 5设计与源码分析--------------------------- 全书主要分为三部分介绍Redis。第一部分介绍Redis5中使用的数据结构,包括动态字符串、跳跃表、压缩列表、字典、整数集合和快速链表,详细介绍其基本结构及常见操作。第二部分为本书核心篇章,首先介绍了Redis5的启动流程,命令解析流程,之后对Redis5中的命令实现进行了全面的介绍,包括键命令、字符串命令、哈希表命令、列表命令、集合及有序集合命令、地理位置相关的GEO命令、统计相关的HyperLogLog命令。第三部分,主要介绍了Redis5的一些特性及使用,包括事务、持久化、主从复制以及集群等。 |
| 目录 |
---------------------------Netty、Redis、ZooKeeper高并发实战--------------------------- 前言 第1章 高并发时代的必备技能 1 1.1 Netty为何这么火 1 1.1.1 Netty火热的程度 1 1.1.2 Netty是面试的必杀器 2 1.2 高并发利器Redis 2 1.2.1 什么是Redis 2 1.2.2 Redis成为缓存事实标准的原因 3 1.3 分布式利器ZooKeeper 3 1.3.1 什么是ZooKeeper 3 1.3.2 ZooKeeper的优势 4 1.4 高并发IM的综合实践 4 1.4.1 高并发IM的学习价值 4 1.4.2 庞大的应用场景 5 1.5 Netty、Redis、ZooKeeper实践计划 5 1.5.1 第1天:Java NIO实践 5 1.5.2 第2天:Reactor反应器模式实践 6 1.5.3 第3天:异步回调模式实践 7 1.5.4 第4天:Netty基础实践 8 1.5.5 第5天:解码器(Decoder)与编码器(Encoder)实践 9 1.5.6 第6天:JSON和ProtoBuf序列化实践 11 1.5.7 第7~10天:基于Netty的单聊实战 12 1.5.8 第11天:ZooKeeper实践计划 14 1.5.9 第12天:Redis实践计划 14 1.6 本章小结 16 第2章 高并发IO的底层原理 17 2.1 IO读写的基础原理 17 2.1.1 内核缓冲区与进程缓冲区 18 2.1.2 详解典型的系统调用流程 18 2.2 四种主要的IO模型 19 2.2.1 同步阻塞IO(Blocking IO) 20 2.2.2 同步非阻塞NIO(None Blocking IO) 21 2.2.3 IO多路复用模型(IO Multiplexing) 22 2.2.4 异步IO模型(Asynchronous IO) 23 2.3 通过合理配置来支持百万级并发连接 24 2.4 本章小结 26 第3章 Java NIO通信基础详解 27 3.1 Java NIO简介 27 3.1.1 NIO和OIO的对比 28 3.1.2 通道(Channel) 28 3.1.3 Selector 选择器 28 3.1.4 缓冲区(Buffer) 29 3.2 详解NIO Buffer类及其属性 29 3.2.1 Buffer类 29 3.2.2 Buffer类的重要属性 29 3.2.3 4个属性的小结 31 3.3 详解NIO Buffer类的重要方法 31 3.3.1 allocate()创建缓冲区 31 3.3.2 put()写入到缓冲区 32 3.3.3 flip()翻转 33 3.3.4 get()从缓冲区读取 34 3.3.5 rewind()倒带 35 3.3.6 mark( )和reset( ) 37 3.3.7 clear( )清空缓冲区 38 3.3.8 使用Buffer类的基本步骤 38 3.4 详解NIO Channel(通道)类 38 3.4.1 Channel(通道)的主要类型 39 3.4.2 FileChannel文件通道 39 3.4.3 使用FileChannel完成文件复制的实践案例 41 3.4.4 SocketChannel套接字通道 42 3.4.5 使用SocketChannel发送文件的实践案例 44 3.4.6 DatagramChannel数据报通道 46 3.4.7 使用DatagramChannel数据包通道发送数据的实践案例 47 3.5 详解NIO Selector选择器 49 3.5.1 选择器以及注册 49 3.5.2 SelectableChannel可选择通道 50 3.5.3 SelectionKey选择键 50 3.5.4 选择器使用流程 50 3.5.5 使用NIO实现Discard服务器的实践案例 52 3.5.6 使用SocketChannel在服务器端接收文件的实践案例 54 3.6 本章小结 57 第4章 鼎鼎大名的Reactor反应器模式 59 4.1 Reactor反应器模式为何如此重要 59 4.1.1 为什么首先学习Reactor反应器模式 59 4.1.2 Reactor反应器模式简介 60 4.1.3 多线程OIO的致命缺陷 60 4.2 单线程Reactor反应器模式 62 4.2.1 什么是单线程Reactor反应器 62 4.2.2 单线程Reactor反应器的参考代码 63 4.2.3 一个Reactor反应器版本的EchoServer实践案例 65 4.2.4 单线程Reactor反应器模式的缺点 67 4.3 多线程的Reactor反应器模式 68 4.3.1 多线程池Reactor反应器演进 68 4.3.2 多线程Reactor 反应器的实践案例 68 4.3.3 多线程Handler处理器的实践案例 70 4.4 Reactor反应器模式小结 72 4.5 本章小结 73 第5章 并发基础中的Future异步回调模式 74 5.1 从泡茶的案例说起 74 5.2 join异步阻塞 75 5.2.1 线程的join合并流程 75 5.2.2 使用join实现异步泡茶喝的实践案例 75 5.2.3 详解join合并方法 77 5.3 FutureTask异步回调之重武器 77 5.3.1 Callable接口 77 5.3.2 初探FutureTask类 78 5.3.3 Future接口 79 5.3.4 再探FutureTask类 79 5.3.5 使用FutureTask类实现异步泡茶喝的实践案例 80 5.4 Guava的异步回调 82 5.4.1 详解FutureCallback 82 5.4.2 详解ListenableFuture 83 5.4.3 ListenableFuture异步任务 84 5.4.4 使用Guava实现泡茶喝的实践案例 84 5.5 Netty的异步回调模式 87 5.5.1 详解GenericFutureListener接口 87 5.5.2 详解Netty的Future接口 88 5.5.3 ChannelFuture的使用 88 5.5.4 Netty的出站和入站异步回调 89 5.6 本章小结 90 第6章 Netty原理与基础 91 6.1 第一个Netty的实践案例DiscardServer 91 6.1.1 创建第一个Netty项目 91 6.1.2 第一个Netty服务器端程序 92 6.1.3 业务处理器NettyDiscardHandler 93 6.1.4 运行NettyDiscardServer 94 6.2 解密Netty中的Reactor反应器模式 95 6.2.1 回顾Reactor反应器模式中IO事件的处理流程 95 6.2.2 Netty中的Channel通道组件 96 6.2.3 Netty中的Reactor 反应器 96 6.2.4 Netty中的Handler处理器 97 6.2.5 Netty的流水线(Pipeline) 98 6.3 详解Bootstrap启动器类 100 6.3.1 父子通道 100 6.3.2 EventLoopGroup线程组 101 6.3.3 Bootstrap的启动流程 101 6.3.4 ChannelOption通道选项 104 6.4 详解Channel通道 105 6.4.1 Channel通道的主要成员和方法 105 6.4.2 EmbeddedChannel嵌入式通道 107 6.5 详解Handler业务处理器 108 6.5.1 ChannelInboundHandler通道入站处理器 109 6.5.2 ChannelOutboundHandler通道出站处理器 110 6.5.3 ChannelInitializer通道初始化处理器 111 6.5.4 ChannelInboundHandler的生命周期的实践案例 112 6.6 详解Pipeline流水线 115 6.6.1 Pipeline入站处理流程 115 6.6.2 Pipeline出站处理流程 116 6.6.3 ChannelHandlerContext上下文 118 6.6.4 截断流水线的处理 118 6.6.5 Handler业务处理器的热拔插 120 6.7 详解ByteBuf缓冲区 122 6.7.1 ByteBuf的优势 122 6.7.2 ByteBuf的逻辑部分 123 6.7.3 ByteBuf的重要属性 123 6.7.4 ByteBuf的三组方法 124 6.7.5 ByteBuf基本使用的实践案例 125 6.7.6 ByteBuf的引用计数 127 6.7.7 ByteBuf的Allocator分配器 128 6.7.8 ByteBuf缓冲区的类型 130 6.7.9 三类ByteBuf使用的实践案例 131 6.7.10 ByteBuf的自动释放 133 6.8 ByteBuf浅层复制的高级使用方式 136 6.8.1 slice切片浅层复制 136 6.8.2 duplicate整体浅层复制 137 6.8.3 浅层复制的问题 138 6.9 EchoServer回显服务器的实践案例 138 6.9.1 NettyEchoServer回显服务器的服务器端 138 6.9.2 共享NettyEchoServerHandler处理器 139 6.9.3 NettyEchoClient客户端代码 140 6.9.4 NettyEchoClientHandler处理器 142 6.10 本章小结 143 第7章 Decoder与Encoder重要组件 144 7.1 Decoder原理与实践 144 7.1.1 ByteToMessageDecoder解码器 145 7.1.2 自定义Byte2IntegerDecoder整数解码器的实践案例 146 7.1.3 ReplayingDecoder解码器 148 7.1.4 整数的分包解码器的实践案例 149 7.1.5 字符串的分包解码器的实践案例 152 7.1.6 MessageToMessageDecoder解码器 156 7.2 开箱即用的Netty内置Decoder 157 7.2.1 LineBasedFrameDecoder解码器 157 7.2.2 DelimiterBasedFrameDecoder解码器 158 7.2.3 LengthFieldBasedFrameDecoder解码器 159 7.2.4 多字段Head-Content协议数据帧解析的实践案例 162 7.3 Encoder原理与实践 164 7.3.1 MessageToByteEncoder编码器 165 7.3.2 MessageToMessageEncoder编码器 166 7.4 解码器和编码器的结合 167 7.4.1 ByteToMessageCodec编解码器 168 7.4.2 CombinedChannelDuplexHandler组合器 169 7.5 本章小结 169 第8章 JSON和ProtoBuf序列化 171 8.1 详解粘包和拆包 172 8.1.1 半包问题的实践案例 172 8.1.2 什么是半包问题 174 8.1.3 半包现象的原理 174 8.2 JSON协议通信 175 8.2.1 JSON序列化的通用类 175 8.2.2 JSON序列化与反序列化的实践案例 176 8.2.3 JSON传输的编码器和解码器之原理 178 8.2.4 JSON传输之服务器端的实践案例 179 8.2.5 JSON传输之客户端的实践案例 180 8.3 Protobuf协议通信 182 8.3.1 一个简单的proto文件的实践案例 182 8.3.2 控制台命令生成POJO和Builder 183 8.3.3 Maven插件生成POJO和Builder 183 8.3.4 消息POJO和Builder的使用之实践案例 184 8.4 Protobuf编解码的实践案例 187 8.4.1 Protobuf编码器和解码器的原理 187 8.4.2 Protobuf传输之服务器端的实践案例 188 8.4.3 Protobuf传输之客户端的实践案例 189 8.5 详解Protobuf协议语法 191 8.5.1 proto的头部声明 191 8.5.2 消息结构体与消息字段 192 8.5.3 字段的数据类型 193 8.5.4 其他的语法规范 194 8.6 本章小结 195 第9章 基于Netty的单体IM系统的开发实践 196 9.1 自定义ProtoBuf编解码器 196 9.1.1 自定义Protobuf编码器 197 9.1.2 自定义Protobuf解码器 198 9.1.3 IM系统中Protobuf消息格式的设计 199 9.2 概述IM的登录流程 202 9.2.1 图解登录/响应流程的9个环节 203 9.2.2 客户端涉及的主要模块 203 9.2.3 服务器端涉及的主要模块 204 9.3 客户端的登录处理的实践案例 204 9.3.1 LoginConsoleCommand和User POJO 205 9.3.2 LoginSender发送器 207 9.3.3 ClientSession客户端会话 209 9.3.4 LoginResponceHandler登录响应处理器 211 9.3.5 客户端流水线的装配 212 9.4 服务器端的登录响应的实践案例 213 9.4.1 服务器流水线的装配 214 9.4.2 LoginRequestHandler登录请求处理器 215 9.4.3 LoginProcesser用户验证逻辑 216 9.4.4 EventLoop线程和业务线程相互隔离 217 9.5 详解ServerSession服务器会话 218 9.5.1 通道的容器属性 219 9.5.2 ServerSession服务器端会话类 220 9.5.3 SessionMap会话管理器 222 9.6 点对点单聊的实践案例 223 9.6.1 简述单聊的端到端流程 223 9.6.2 客户端的ChatConsoleCommand收集聊天内容 224 9.6.3 客户端的CommandController发送POJO 224 9.6.4 服务器端的ChatRedirectHandler消息转发 225 9.6.5 服务器端的ChatRedirectProcesser异步处理 226 9.6.6 客户端的ChatMsgHandler接收POJO 227 9.7 详解心跳检测 228 9.7.1 网络连接的假死现象 228 9.7.2 服务器端的空闲检测 229 9.7.3 客户端的心跳报文 230 9.8 本章小结 232 第10章 ZooKeeper分布式协调 233 10.1 ZooKeeper伪集群安装和配置 233 10.1.1 创建数据和日志: 234 10.1.2 创建myid文件 234 10.1.3 创建和修改配置文件 235 10.1.4 配置文件示例 237 10.1.5 启动ZooKeeper伪集群 238 10.2 使用ZooKeeper进行分布式存储 239 10.2.1 详解ZooKeeper存储模型 239 10.2.2 zkCli客户端命令清单 240 10.3 ZooKeeper应用开发的实践 241 10.3.1 ZkClient开源客户端介绍 242 10.3.2 Curator开源客户端介绍 242 10.3.3 Curator开发的环境准备 243 10.3.4 Curator客户端实例的创建 244 10.3.5 通过Curator创建ZNode节点 245 10.3.6 在Curator中读取节点 247 10.3.7 在Curator中更新节点 248 10.3.8 在Curator中删除节点 249 10.4 分布式命名服务的实践 251 10.4.1 ID生成器 252 10.4.2 ZooKeeper分布式ID生成器的实践案例 253 10.4.3 集群节点的命名服务之实践案例 254 10.4.4 使用ZK实现SnowFlakeID算法的实践案例 256 10.5 分布式事件监听的重点 261 10.5.1 Watcher标准的事件处理器 261 10.5.2 NodeCache节点缓存的监听 265 10.5.3 PathChildrenCache子节点监听 267 10.5.4 Tree Cache节点树缓存 272 10.6 分布式锁的原理与实践 276 10.6.1 公平锁和可重入锁的原理 276 10.6.2 ZooKeeper分布式锁的原理 277 10.6.3 分布式锁的基本流程 279 10.6.4 加锁的实现 280 10.6.5 释放锁的实现 285 10.6.6 分布式锁的使用 287 10.6.7 Curator的InterProcessMutex可重入锁 288 10.7 本章小结 289 第11章 分布式缓存Redis 290 11.1 Redis入门 290 11.1.1 Redis安装和配置 290 11.1.2 Redis客户端命令 292 11.1.3 Redis Key的命名规范 294 11.2 Redis数据类型 295 11.2.1 String字符串 295 11.2.2 List列表 296 11.2.3 Hash哈希表 297 11.2.4 Set集合 298 11.2.5 Zset有序集合 299 11.3 Jedis基础编程的实践案例 300 11.3.1 Jedis操作String字符串 301 11.3.2 Jedis操作List列表 303 11.3.3 Jedis操作Hash哈希表 304 11.3.4 Jedis操作Set集合 305 11.3.5 Jedis操作Zset有序集合 306 11.4 JedisPool连接池的实践案例 308 11.4.1 JedisPool的配置 308 11.4.2 JedisPool创建和预热 310 11.4.3 JedisPool的使用 312 11.5 使用spring-data-redis完成 CRUD的实践案例 313 11.5.1 CRUD中应用缓存的场景 313 11.5.2 配置spring-redis.xml 315 11.5.3 使用RedisTemplate模板API 316 11.5.4 使用RedisTemplate模板API完成CRUD的实践案例 321 11.5.5 使用RedisCallback回调完成CRUD的实践案例 323 11.6 Spring的Redis缓存注解 325 11.6.1 使用Spring缓存注解完成CRUD的实践案例 325 11.6.2 spring-redis.xml中配置的调整 327 11.6.3 详解@CachePut和 @Cacheable注解 328 11.6.4 详解@CacheEvict注解 329 11.6.5 详解@Caching组合注解 330 11.7 详解SpringEL(SpEL) 331 11.7.1 SpEL运算符 332 11.7.2 缓存注解中的SpringEL表达式 334 11.8 本章小结 336 第12章 亿级高并发IM架构的开发实践 337 12.1 如何支撑亿级流量的高并发IM架构的理论基础 337 12.1.1 亿级流量的系统架构的开发实践 338 12.1.2 高并发架构的技术选型 338 12.1.3 详解IM消息的序列化协议选型 339 12.1.4 详解长连接和短连接 339 12.2 分布式IM的命名服务的实践案例 340 12.2.1 IM节点的POJO类 341 12.2.2 IM节点的ImWorker类 342 12.3 Worker集群的负载均衡之实践案例 345 12.3.1 ImLoadBalance负载均衡器 346 12.3.2 与WebGate的整合 348 12.4 即时通信消息的路由和转发的实践案例 349 12.4.1 IM路由器WorkerRouter 349 12.4.2 IM转发器WorkerReSender 352 12.5 Feign短连接RESTful调用 354 12.5.1 短连接API的接口准备 355 12.5.2 声明远程接口的本地代理 355 12.5.3 远程API的本地调用 356 12.6 分布式的在线用户统计的实践案例 358 12.6.1 Curator的分布式计数器 358 12.6.2 用户上线和下线的统计 360 12.7 本章小结 361 ---------------------------Redis 5设计与源码分析--------------------------- 本书赞誉 序 前言 第1章 引言1 1.1 Redis简介1 1.2 Redis 5.0的新特性2 1.3 Redis源码概述3 1.4 Redis安装与调试4 1.5 本章小结6 第2章 简单动态字符串7 2.1 数据结构7 2.2 基本操作11 2.2.1 创建字符串11 2.2.2 释放字符串12 2.2.3 拼接字符串12 2.2.4 其余API15 2.3 本章小结15 第3章 跳跃表17 3.1 简介17 3.2 跳跃表节点与结构19 3.2.1 跳跃表节点19 3.2.2 跳跃表结构20 3.3 基本操作20 3.3.1 创建跳跃表21 3.3.2 插入节点22 3.3.3 删除节点28 3.3.4 删除跳跃表30 3.4 跳跃表的应用31 3.5 本章小结32 第4章 压缩列表33 4.1 压缩列表的存储结构33 4.2 结构体35 4.3 基本操作37 4.3.1 创建压缩列表37 4.3.2 插入元素38 4.3.3 删除元素42 4.3.4 遍历压缩列表44 4.4 连锁更新44 4.5 本章小结45 第5章 字典47 5.1 基本概念47 5.1.1 数组48 5.1.2 Hash函数49 5.1.3 Hash冲突51 5.2 Redis字典的实现52 5.3 基本操作55 5.3.1 字典初始化55 5.3.2 添加元素56 5.3.3 查找元素60 5.3.4 修改元素61 5.3.5 删除元素61 5.4 字典的遍历62 5.4.1 迭代器遍历62 5.4.2 间断遍历65 5.5 API列表70 5.6 本章小结71 第6章 整数集合72 6.1 数据存储72 6.2 基本操作75 6.2.1 查询元素75 6.2.2 添加元素78 6.2.3 删除元素82 6.2.4 常用API83 6.3 本章小结85 第7章 quicklist的实现86 7.1 quicklist简介86 7.2 数据存储87 7.3 数据压缩91 7.3.1 压缩92 7.3.2 解压缩93 7.4 基本操作94 7.4.1 初始化94 7.4.2 添加元素95 7.4.3 删除元素96 7.4.4 更改元素98 7.4.5 查找元素99 7.4.6 常用API100 7.5 本章小结101 第8章 Stream102 8.1 Stream简介102 8.1.1 Stream底层结构listpack103 8.1.2 Stream底层结构Rax简介104 8.1.3 Stream结构108 8.2 Stream底层结构listpack的实现112 8.2.1 初始化112 8.2.2 增删改操作112 8.2.3 遍历操作113 8.2.4 读取元素113 8.3 Stream底层结构Rax的实现114 8.3.1 初始化114 8.3.2 查找元素114 8.3.3 添加元素116 8.3.4 删除元素118 8.3.5 遍历元素120 8.4 Stream结构的实现123 8.4.1 初始化124 8.4.2 添加元素124 8.4.3 删除元素125 8.4.4 查找元素128 8.4.5 遍历129 8.5 本章小结131 第9章 命令处理生命周期132 9.1 基本知识132 9.1.1 对象结构体robj132 9.1.2 客户端结构体client136 9.1.3 服务端结构体redisServer138 9.1.4 命令结构体redisCommand139 9.1.5 事件处理141 9.2 server启动过程149 9.2.1 server初始化149 9.2.2 启动监听152 9.3 命令处理过程155 9.3.1 命令解析156 9.3.2 命令调用159 9.3.3 返回结果161 9.4 本章小结163 第10章 键相关命令的实现164 10.1 对象结构体和数据库结构体回顾164 10.1.1 对象结构体redisObject164 10.1.2 数据库结构体redisDb166 10.2 查看键信息166 10.2.1 查看键属性166 10.2.2 查看键类型169 10.2.3 查看键过期时间170 10.3 设置键信息171 10.3.1 设置键过期时间171 10.3.2 删除键过期时间172 10.3.3 重命名键173 10.3.4 修改键最后访问173 10.4 查找键174 10.4.1 判断键是否存在174 10.4.2 查找符合模式的键175 10.4.3 遍历键176 10.4.4 随机取键177 10.5 操作键178 10.5.1 删除键178 10.5.2 序列化/反序列化键182 10.5.3 移动键183 10.5.4 键排序185 10.6 本章小结187 第11章 字符串相关命令的实现188 11.1 相关命令介绍188 11.2 设置字符串189 11.2.1 set命令189 11.2.2 mset命令195 11.3 修改字符串196 11.3.1 append命令196 11.3.2 setrange命令197 11.3.3 计数器命令197 11.4 字符串获取199 11.4.1 get命令199 11.4.2 getset命令199 11.4.3 getrange命令199 11.4.4 strlen命令200 11.4.5 mget命令201 11.5 字符串位操作201 11.5.1 setbit命令201 11.5.2 getbit命令203 11.5.3 bitpos命令203 11.5.4 bitcount命令205 11.5.5 bitop命令208 11.5.6 bitfield命令209 11.6 本章小结212 第12章 散列表相关命令的实现213 12.1 简介213 12.1.1 底层存储213 12.1.2 底层存储转换215 12.1.3 接口说明215 12.2 设置命令216 12.3 读取命令217 12.3.1 hexists命令218 12.3.2 hget/hmget命令218 12.3.3 hkeys/hvals/hgetall命令219 12.3.4 hlen命令220 12.3.5 hscan命令220 12.4 删除命令221 12.5 自增命令222 12.6 本章小结224 第13章 列表相关命令的实现225 13.1 相关命令介绍225 13.1.1 命令列表225 13.1.2 栈和队列命令列表226 13.2 push/pop相关命令228 13.2.1 push类命令的实现228 13.2.2 pop类命令的实现229 13.2.3 阻塞push/pop类命令的实现230 13.3 获取列表数据234 13.3.1 获取单个元素234 13.3.2 获取多个元素235 13.3.3 获取列表长度236 13.4 操作列表236 13.4.1 设置元素237 13.4.2 插入元素237 13.4.3 删除元素238 13.4.4 裁剪列表239 13.5 本章小结240 第14章 集合相关命令的实现241 14.1 相关命令介绍241 14.2 集合运算254 14.2.1 交集254 14.2.2 并集258 14.2.3 差集260 14.3 本章小结263 第15章 有序集合相关命令的实现264 15.1 相关命令介绍264 15.2 基本操作272 15.2.1 添加成员272 15.2.2 删除成员275 15.2.3 基数统计276 15.2.4 数量计算277 15.2.5 计数器279 15.2.6 获取排名279 15.2.7 获取分值279 15.2.8 遍历280 15.3 批量操作280 15.3.1 范围查找280 15.3.2 范围删除283 15.4 集合运算284 15.5 本章小结284 第16章 GEO相关命令285 16.1 基础知识285 16.2 命令实现288 16.2.1 使用geoadd添加坐标288 16.2.2 计算坐标的geohash291 16.2.3 使用geopos查询位置经纬度292 16.2.4 使用geodist计算两点距离295 16.2.5 使用georadius/georadius-bymembe查询范围内元素295 16.3 本章小结297 第17章 HyperLogLog相关命令的实现298 17.1 基本原理298 17.1.1 算法演进299 17.1.2 线性计数算法299 17.1.3 对数计数算法300 17.1.4 自适应计数算法302 17.1.5 超对数计数算法302 17.2 HLL Redis实现302 17.2.1 HLL头对象303 17.2.2 稀疏编码304 17.2.3 密集编码306 17.2.4 内部编码308 17.2.5 编码转换309 17.3 命令实现310 17.3.1 添加基数310 17.3.2 近似基数311 17.3.3 合并基数313 17.4 本章小结314 第18章 数据流相关命令的实现315 18.1 相关命令介绍315 18.2 基本操作命令原理分析323 18.2.1 添加消息323 18.2.2 删除消息325 18.2.3 范围查找326 18.2.4 获取队列信息327 18.2.5 长度统计327 18.2.6 剪切消息328 18.3 分组命令原理分析328 18.3.1 分组管理328 18.3.2 消费消息330 18.3.3 响应消息331 18.3.4 获取未响应消息列表331 18.3.5 修改指定未响应消息归属331 18.4 本章小结332 第19章 其他命令333 19.1 事务333 19.1.1 事务简介333 19.1.2 事务命令实现334 19.2 发布-订阅命令实现339 19.3 Lua脚本345 19.3.1 初始化Lua环境345 19.3.2 在Lua中调用Redis命令347 19.3.3 Redis和Lua数据类型转换349 19.3.4 命令实现351 19.4 本章小结356 第20章 持久化357 20.1 RDB358 20.1.1 RDB执行流程358 20.1.2 RDB文件结构359 20.2 AOF367 20.2.1 AOF执行流程368 20.2.2 AOF重写369 20.3 RDB与AOF相关配置指令372 20.4 本章小结374 第21章 主从复制375 21.1 主从复制功能实现375 21.2 主从复制源码基础378 21.3 slaver源码分析382 21.4 master源码分析388 21.5 本章小结391 第22章 哨兵和集群392 22.1 哨兵392 22.1.1 哨兵简介393 22.1.2 代码流程394 22.1.3 主从切换396 22.1.4 常用命令399 22.2 集群400 22.2.1 集群简介401 22.2.2 代码流程402 22.2.3 主从切换404 22.2.4 副本漂移406 22.2.5 分片迁移407 22.2.6 通信数据包类型409 22.3 本章小结415 |