| 作者 |
| 黄健宏尼恩 |
| 丛书名 |
| 数据库技术丛书 |
| 出版社 |
| 机械工业出版社 |
| ISBN |
| 9781909241051 |
| 简要 |
| 简介 |
| 内容简介书籍计算机书籍 ---------------------------Redis使用手册--------------------------- 本书系统化介绍Redis命令及其应用场景,内容深入,图文并茂,巨细靡遗,是掌握Redis的案头必备参考书。本书主要分为三大部分,共20章。第一部分“数据结构与应用”介绍Redis最核心的九种数据结构,列举了操作这些数据结构的众多命令及其详细信息,并在其中穿插介绍了多个使用 Redis 命令构建应用序的示例。通过这些程序示例,读者可以进一步加深对命令的认识,并学会如何在实际中应用这些命令,从而达到学而致用的目的。第二部分“附加功能”介绍Redis在数据结构的基础上为用户提供的额外功能。其中包括数据库管理、自动过期功能、流水线与事务、Lua 脚本、持久化、发布与订阅、模块管理等。读者可以通过阅读这一部分来学会如何将 Redis 应用在更多场景中。第三部分“多机功能”介绍 Redis 的三项多机功能:复制、Sentinel 和集群。读者可以通过阅读这一部分来获得扩展 Redis 读写性能的相关知识,并根据自己的情况为 Redis 系统选择合适的扩展方式。 ---------------------------Netty、Redis、ZooKeeper高并发实战--------------------------- 本书为了让读者扎稳高性能基础,浅显易懂地剖析高并发IO的底层原理,细致细腻地解析Reactor高性能模式,图文并茂地介绍Java异步回调模式。掌握这些基础原理,能够帮助读者解决Java后台开发的一些实际问题。 本书共12章,主要介绍高性能通信框架Netty,并详尽介绍Netty的EventLoop、Handler、Pipeline、ByteBuf、Decoder、Encoder等重要组件,然后介绍单体IM的实战设计和模块实现。本书对ZooKeeper、 Curator API、Redis、Jedis API的使用也进行详尽的介绍,让读者具备高并发、可扩展系统的设计和开发能力。 |
| 目录 |
---------------------------Redis使用手册--------------------------- 前 言 第1章 引言 1 1.1 Redis简介 1 1.2 内容编排 3 1.3 目标读者 4 1.4 预备工作 4 1.5 执行命令 5 1.6 配置服务器 6 1.7 示例代码 7 1.8 版本说明 7 1.9 读者服务网站 8 1.10 启程 8 第一部分 数据结构与应用 第2章 字符串 10 2.1 SET:为字符串键设置值 11 2.1.1 改变覆盖规则 12 2.1.2 其他信息 13 2.2 GET:获取字符串键的值 13 2.3 GETSET:获取旧值并设置新值 14 示例:缓存 14 示例:锁 16 2.4 MSET:一次为多个字符串键设置值 18 2.5 MGET:一次获取多个字符串键的值 19 2.6 MSETNX:只在键不存在的情况下,一次为多个字符串键设置值 20 示例:存储文章信息 20 2.7 STRLEN:获取字符串值的字节长度 25 2.8 字符串值的索引 26 2.9 GETRANGE:获取字符串值指定索引范围上的内容 26 2.10 SETRANGE:对字符串值的指定索引范围进行设置 27 2.10.1 自动扩展被修改的字符串 29 2.10.2 在值里面填充空字节 29 2.10.3 其他信息 30 示例:给文章存储程序加上文章长度计数功能和文章预览功能 31 2.11 APPEND:追加新内容到值的末尾 32 2.11.1 处理不存在的键 33 2.11.2 其他信息 33 示例:存储日志 34 2.12 使用字符串键存储数字值 37 2.13 INCRBY、DECRBY:对整数值执行加法操作和减法操作 37 2.13.1 类型限制 38 2.13.2 处理不存在的键 39 2.13.3 其他信息 40 2.14 INCR、DECR:对整数值执行加1操作和减1操作 40 2.15 INCRBYFLOAT:对数字值执行浮点数加法操作 41 2.15.1 处理不存在的键 41 2.15.2 使用INCRBYFLOAT执行浮点数减法操作 41 2.15.3 INCRBYFLOAT与整数值 42 2.15.4 小数位长度限制 43 2.15.5 其他信息 43 示例:ID生成器 43 示例:计数器 44 示例:限速器 46 2.16 重点回顾 48 第3章 散列 49 3.1 散列简介 50 3.2 HSET:为字段设置值 51 3.2.1 使用新值覆盖旧值 53 3.2.2 其他信息 53 3.3 HSETNX:只在字段不存在的情况下为它设置值 53 3.4 HGET:获取字段的值 54 3.4.1 处理不存在的字段或者不存在的散列 55 3.4.2 其他信息 55 示例:实现短网址生成程序 55 3.5 HINCRBY:对字段存储的整数值执行加法或减法操作 58 3.5.1 执行减法操作 58 3.5.2 处理异常情况 59 3.5.3 其他信息 59 3.6 HINCRBYFLOAT:对字段存储的数字值执行浮点数加法或减法操作 59 3.6.1 增量和字段值的类型限制 60 3.6.2 执行减法操作 60 3.6.3 其他信息 60 示例:使用散列键重新实现计数器 60 3.7 HSTRLEN:获取字段值的字节长度 63 3.8 HEXISTS:检查字段是否存在 63 3.9 HDEL:删除字段 64 3.10 HLEN:获取散列包含的字段数量 65 示例:实现用户登录会话 66 3.11 HMSET:一次为多个字段设置值 69 3.11.1 使用新值覆盖旧值 69 3.11.2 其他信息 70 3.12 HMGET:一次获取多个字段的值 70 3.13 HKEYS、HVALS、HGETALL:获取所有字段、所有值、所有字段和值 71 3.13.1 字段在散列中的排列顺序 72 3.13.2 其他信息 73 示例:存储图数据 73 示例:使用散列键重新实现文章存储程序 77 3.14 散列与字符串 79 3.14.1 散列键的优点 80 3.14.2 字符串键的优点 81 3.14.3 字符串键和散列键的选择 82 3.15 重点回顾 82 第4章 列表 83 4.1 LPUSH:将元素推入列表左端 84 4.1.1 一次推入多个元素 84 4.1.2 其他信息 86 4.2 RPUSH:将元素推入列表右端 86 4.2.1 一次推入多个元素 86 4.2.2 其他信息 88 4.3 LPUSHX、RPUSHX:只对已存在的列表执行推入操作 88 4.3.1 每次只能推入单个元素 89 4.3.2 其他信息 90 4.4 LPOP:弹出列表最左端的元素 90 4.5 RPOP:弹出列表最右端的元素 91 4.6 RPOPLPUSH:将右端弹出的元素推入左端 92 4.6.1 源列表和目标列表相同 93 4.6.2 处理空列表 94 4.6.3 其他信息 95 示例:先进先出队列 95 4.7 LLEN:获取列表的长度 96 4.8 LINDEX:获取指定索引上的元素 97 4.8.1 处理超出范围的索引 98 4.8.2 其他信息 98 4.9 LRANGE:获取指定索引范围上的元素 98 4.9.1 获取列表包含的所有元素 99 4.9.2 处理超出范围的索引 100 4.9.3 其他信息 101 示例:分页 101 4.10 LSET:为指定索引设置新元素 103 4.10.1 处理超出范围的索引 104 4.10.2 其他信息 104 4.11 LINSERT:将元素插入列表 104 4.11.1 处理不存在的元素 105 4.11.2 其他信息 105 4.12 LTRIM:修剪列表 105 4.12.1 处理负数索引 107 4.12.2 其他信息 107 4.13 LREM:从列表中移除指定元素 107 示例:待办事项列表 109 4.14 BLPOP:阻塞式左端弹出操作 112 4.14.1 解除阻塞状态 112 4.14.2 处理空列表 113 4.14.3 列表名的作用 114 4.14.4 阻塞效果的范围 114 4.14.5 其他信息 114 4.15 BRPOP:阻塞式右端弹出操作 114 4.16 BRPOPLPUSH:阻塞式弹出并推入操作 114 4.16.1 处理源列表为空的情况 116 4.16.2 其他信息 116 示例:带有阻塞功能的消息队列 116 4.17 重点回顾 119 第5章 集合 120 5.1 SADD:将元素添加到集合 121 5.1.1 忽略已存在元素 122 5.1.2 其他信息 122 5.2 SREM:从集合中移除元素 122 5.2.1 忽略不存在的元素 122 5.2.2 其他信息 123 5.3 SMOVE:将元素从一个集合移动到另一个集合 123 5.3.1 忽略不存在的元素 124 5.3.2 覆盖已存在的元素 124 5.3.3 其他信息 125 5.4 SMEMBERS:获取集合包含的所有元素 125 5.4.1 元素的无序排列 126 5.4.2 其他信息 126 5.5 SCARD:获取集合包含的元素数量 126 5.6 SISMEMBER:检查给定元素是否存在于集合 127 示例:唯一计数器 128 示例:打标签 129 示例:点赞 131 示例:投票 132 示例:社交关系 135 5.7 SRANDMEMBER:随机获取集合中的元素 137 5.7.1 返回指定数量的元素 138 5.7.2 其他信息 139 5.8 SPOP:随机地从集合中移除指定数量的元素 139 5.8.1 SPOP与SRANDMEMBER的区别 140 5.8.2 其他信息 141 示例:抽奖 141 5.9 SINTER、SINTERSTORE:对集合执行交集计算 142 5.9.1 SINTERSTORE命令 143 5.9.2 其他信息 143 5.10 SUNION、SUNIONSTORE:对集合执行并集计算 143 5.10.1 SUNIONSTORE命令 144 5.10.2 其他信息 144 5.11 SDIFF、SDIFFSTORE:对集合执行差集计算 144 5.11.1 SDIFFSTORE命令 145 5.11.2 其他信息 145 示例:共同关注与推荐关注 146 示例:使用反向索引构建商品筛选器 149 5.12 重点回顾 152 第6章 有序集合 153 6.1 ZADD:添加或更新成员 154 6.1.1 更新已有成员的分值 154 6.1.2 指定要执行的操作 154 6.1.3 返回被修改成员的数量 155 6.1.4 其他信息 156 6.2 ZREM:移除指定的成员 156 6.2.1 忽略不存在的成员 157 6.2.2 其他信息 157 6.3 ZSCORE:获取成员的分值 157 6.4 ZINCRBY:对成员的分值执行自增或自减操作 158 6.4.1 执行自减操作 159 6.4.2 处理不存在的键或者不存在的成员 160 6.4.3 其他信息 160 6.5 ZCARD:获取有序集合的大小 160 6.6 ZRANK、ZREVRANK:获取成员在有序集合中的排名 161 6.6.1 处理不存在的键或者不存在的成员 162 6.6.2 其他信息 162 6.7 ZRANGE、ZREVRANGE:获取指定索引范围内的成员 162 6.7.1 使用负数索引 163 6.7.2 获取成员及其分值 164 6.7.3 处理不存在的有序集合 165 6.7.4 其他信息 165 示例:排行榜 165 6.8 ZRANGEBYSCORE、ZREVRAN-GEBYSCORE:获取指定分值范围内的成员 167 6.8.1 获取成员及其分值 168 6.8.2 限制命令返回的成员数量 168 6.8.3 使用开区间分值范围 169 6.8.4 使用无限值作为范围 170 6.8.5 其他信息 171 6.9 ZCOUNT:统计指定分值范围内的成员数量 171 6.9.1 分值范围的格式 171 6.9.2 其他信息 172 示例:时间线 172 6.10 ZREMRANGEBYRANK:移除指定排名范围内的成员 175 6.10.1 使用负数排名 175 6.10.2 其他信息 175 6.11 ZREMRANGEBYSCORE:移除指定分值范围内的成员 176 6.12 ZUNIONSTORE、ZINTERSTORE:有序集合的并集运算和交集运算 176 6.12.1 指定聚合函数 177 6.12.2 设置权重 179 6.12.3 使用集合作为输入 180 6.12.4 其他信息 181 示例:商品推荐 181 6.13 ZRANGEBYLEX、ZREVRAN-GEBYLEX:返回指定字典序范围内的成员 182 6.13.1 ZREVRANGEBYLEX 184 6.13.2 限制命令返回的成员数量 184 6.13.3 其他信息 185 6.14 ZLEXCOUNT:统计位于字典序指定范围内的成员数量 185 6.15 ZREMRANGEBYLEX:移除位于字典序指定范围内的成员 186 示例:自动补全 187 6.16 ZPOPMAX、ZPOPMIN:弹出分值最高和最低的成员 188 6.17 BZPOPMAX、BZPOPMIN:阻塞式最大/最小元素弹出操作 189 6.18 重点回顾 191 第7章 HyperLogLog 192 7.1 HyperLogLog简介 193 7.2 PFADD:对集合元素进行计数 193 7.3 PFCOUNT:返回集合的近似基数 194 7.3.1 返回并集的近似基数 194 7.3.2 其他信息 195 示例:优化唯一计数器 195 示例:检测重复信息 196 7.4 PFMERGE:计算多个HyperLogLog的并集 198 7.4.1 PFCOUNT与PFMERGE 198 7.4.2 其他信息 199 示例:实现每周/月度/年度计数器 199 7.5 重点回顾 200 第8章 位图 201 8.1 SETBIT:设置二进制位的值 201 8.1.1 位图的扩展 202 8.1.2 偏移量只能为正数 203 8.1.3 其他信息 203 8.2 GETBIT:获取二进制位的值 203 8.2.1 处理范围之外的偏移量 204 8.2.2 其他信息 204 8.3 BITCOUNT:统计被设置的二进制位数量 204 8.3.1 只统计位图指定字节范围内的二进制位 204 8.3.2 使用负数偏移量定义统计范围 206 8.3.3 其他信息 206 示例:用户行为记录器 207 8.4 BITPOS:查找第一个指定的二进制位值 208 8.4.1 只在指定的字节范围内进行查找 209 8.4.2 使用负数偏移量定义查找范围 209 8.4.3 边界情况处理 210 8.4.4 其他信息 211 8.5 BITOP:执行二进制位运算 211 8.5.1 处理不同长度的位图 212 8.5.2 其他信息 212 示例:0-1矩阵 212 8.6 BITFIELD:在位图中存储整数值 214 8.6.1 根据偏移量对区域进行设置 214 8.6.2 根据索引对区域进行设置 216 8.6.3 获取区域存储的值 216 8.6.4 执行加法操作或减法操作 217 8.6.5 处理溢出 218 8.6.6 使用位图存储整数的原因 219 8.6.7 其他信息 219 示例:紧凑计数器 219 8.7 使用字符串命令对位图进行操作 221 8.8 重点回顾 222 第9章 地理坐标 223 9.1 GEOADD:存储坐标 224 9.1.1 更新已有位置的坐标 224 9.1.2 其他信息 224 9.2 GEOPOS:获取指定位置的坐标 224 9.3 GEODIST:计算两个位置之间的直线距离 225 9.3.1 指定距离的单位 225 9.3.2 处理不存在的位置 226 9.3.3 其他信息 226 示例:具有基本功能的用户地理位置程序 226 9.4 GEORADIUS:查找指定坐标半径范围内的其他位置 228 9.4.1 返回被匹配位置与中心点之间的距离 229 9.4.2 返回被匹配位置的坐标 229 9.4.3 排序查找结果 230 9.4.4 限制命令获取的位置数量 231 9.4.5 同时使用多个可选项 231 9.4.6 其他信息 232 9.5 GEORADIUSBYMEMBER:查找指定位置半径范围内的其他位置 232 示例:查找附近用户 233 9.6 GEOHASH:获取指定位置的Geohash值 235 9.6.1 在进行范围查找时获取Geohash值 235 9.6.2 其他信息 236 9.7 使用有序集合命令操作GEO数据 236 9.8 重点回顾 237 第10章 流 238 10.1 XADD:追加新元素到流的末尾 239 10.1.1 流元素的ID 239 10.1.2 不完整的流ID 240 10.1.3 流元素ID的限制 240 10.1.4 自动生成元素ID 241 10.1.5 限制流的长度 242 10.1.6 其他信息 243 10.2 XTRIM:对流进行修剪 243 10.3 XDEL:移除指定元素 244 10.4 XLEN:获取流包含的元素数量 244 10.5 XRANGE、XREVRANGE:访问流中元素 245 10.5.1 获取ID指定的单个元素 245 10.5.2 获取指定ID范围内的多个元素 246 10.5.3 获取所有元素 247 10.5.4 获取指定数量的元素 248 10.5.5 对流进行迭代 249 10.5.6 以逆序访问流中元素 251 10.5.7 其他信息 251 10.6 XREAD:以阻塞或非阻塞方式获取流元素 251 10.6.1 从多个流中获取大于指定ID的元素 251 10.6.2 迭代流 253 10.6.3 阻塞 254 10.6.4 只获取新出现的元素 256 10.6.5 其他信息 258 示例:消息队列 258 10.7 消费者组 260 10.7.1 创建消费者组 261 10.7.2 读取消费者组 262 10.7.3 消费者 262 10.7.4 消息的状态转换 263 10.7.5 实际示例 263 10.8 XGROUP:管理消费者组 264 10.8.1 创建消费者组 264 10.8.2 修改消费者组的最后递送消息ID 265 10.8.3 删除消费者 267 10.8.4 删除消费者组 268 10.9 XREADGROUP:读取消费者组中的消息 268 10.9.1 读取未递送过的新消息 269 10.9.2 其他信息 270 10.10 XPENDING:显示待处理消息的相关信息 270 10.11 XACK:将消息标记为“已处理” 271 10.12 XCLAIM:转移消息的归属权 272 10.12.1 只返回被转移消息的ID 273 10.12.2 其他信息 273 10.13 XINFO:查看流和消费者组的相关信息 273 10.13.1 打印消费者信息 273 10.13.2 打印消费者组信息 274 10.13.3 打印流消息 274 10.13.4 其他信息 275 示例:为消息队列提供消费者组功能 275 10.14 重点回顾 277 第二部分 附加功能 第11章 数据库 280 11.1 SELECT:切换至指定的数据库 281 11.2 KEYS:获取所有与给定匹配符相匹配的键 282 11.2.1 全局匹配符 282 11.2.2 其他信息 283 11.3 SCAN:以渐进方式迭代数据库中的键 283 11.3.1 一次简单的迭代示例 284 11.3.2 SCAN命令的迭代保证 285 11.3.3 游标的使用 285 11.3.4 迭代与给定匹配符相匹配的键 285 11.3.5 指定返回键的期望数量 286 11.3.6 数据结构迭代命令 287 11.3.7 其他信息 289 示例:构建数据库迭代器 289 11.4 RANDOMKEY:随机返回一个键 292 11.5 SORT:对键的值进行排序 292 11.5.1 指定排序方式 293 11.5.2 对字符串值进行排序 294 11.5.3 只获取部分排序结果 294 11.5.4 获取外部键的值作为结果 295 11.5.5 使用外部键的值作为排序权重 298 11.5.6 保存排序结果 299 11.5.7 其他信息 300 11.6 EXISTS:检查给定键是否存在 300 11.6.1 只能接受单个键的EXISTS命令 300 11.6.2 其他信息 300 11.7 DBSIZE:获取数据库包含的键值对数量 301 11.8 TYPE:查看键的类型 301 示例:数据库取样程序 302 11.9 RENAME、RENAMENX:修改键名 304 11.9.1 覆盖已存在的键 305 11.9.2 只在新键名尚未被占用的情况下进行改名 305 11.9.3 其他信息 306 11.10 MOVE:将给定的键移动到另一个数据库 306 11.10.1 不覆盖同名键 306 11.10.2 其他信息 307 11.11 DEL:移除指定的键 307 11.12 UNLINK:以异步方式移除指定的键 307 11.13 FLUSHDB:清空当前数据库 308 11.13.1 async选项 308 11.13.2 其他信息 309 11.14 FLUSHALL:清空所有数据库 309 11.14.1 async选项 309 11.14.2 其他信息 309 11.15 SWAPDB:互换数据库 309 示例:使用SWAPDB命令实行在线替换数据库 310 11.16 重点回顾 312 第12章 自动过期 313 12.1 EXPIRE、PEXPIRE:设置生存时间 313 12.1.1 更新键的生存时间 315 12.1.2 其他信息 315 示例:带有自动移除特性的缓存程序 316 12.2 SET命令的EX选项和PX选项 317 12.2.1 组合命令的安全问题 317 12.2.2 其他信息 318 示例:带有自动释放特性的锁 318 12.3 EXPIREAT、PEXPIREAT:设置过期时间 319 12.3.1 EXPIREAT使用示例 320 12.3.2 PEXPIREAT使用示例 320 12.3.3 更新键的过期时间 321 12.3.4 自动过期特性的不足之处 321 12.3.5 其他信息 322 12.4 TTL、PTTL:获取键的剩余生存时间 322 12.4.1 没有剩余生存时间的键和不存在的键 322 12.4.2 TTL命令的精度问题 322 12.4.3 其他信息 323 示例:自动过期的登录会话 323 示例:自动淘汰冷门数据 326 12.5 重点回顾 328 第13章 流水线与事务 329 13.1 流水线 329 示例:使用流水线优化随机键创建程序 331 13.2 事务 333 13.2.1 MULTI:开启事务 335 13.2.2 EXEC:执行事务 335 13.2.3 DISCARD:放弃事务 336 13.2.4 事务的安全性 337 13.2.5 事务对服务器的影响 337 13.2.6 流水线与事务 337 示例:实现mlpop()函数 338 13.3 带有乐观锁的事务 339 13.3.1 WATCH:对键进行监视 341 13.3.2 UNWATCH:取消对键的监视 342 示例:带有身份验证功能的锁 343 示例:带有身份验证功能的计数信号量 344 13.4 重点回顾 347 第14章 Lua脚本 348 14.1 EVAL:执行脚本 349 14.1.1 使用脚本执行Redis命令 349 14.1.2 值转换 350 14.1.3 全局变量保护 352 14.1.4 在脚本中切换数据库 353 14.1.5 脚本的原子性 353 14.1.6 以命令行方式执行脚本 353 14.1.7 其他信息 354 示例:使用脚本重新实现带有身份验证功能的锁 354 示例:实现LPOPRPUSH命令 355 14.2 SCRIPT LOAD和EVALSHA:缓存并执行脚本 357 14.3 脚本管理 359 14.3.1 SCRIPT EXISTS:检查脚本是否已被缓存 359 14.3.2 SCRIPT FLUSH:移除所有已缓存脚本 359 14.3.3 SCRIPT KILL:强制停止正在运行的脚本 360 14.4 内置函数库 361 14.4.1 redis包 362 14.4.2 bit包 364 14.4.3 struct包 364 14.4.4 cjson包 365 14.4.5 cmsgpack包 365 14.5 脚本调试 366 14.5.1 一个简单的调试示例 366 14.5.2 调试命令 368 14.5.3 断点 369 14.5.4 动态断点 371 14.5.5 输出调试日志 372 14.5.6 执行指定的代码或命令 373 14.5.7 显示调用链 373 14.5.8 重载脚本 375 14.5.9 调试模式 376 14.5.10 终止调试会话 378 14.6 重点回顾 379 第15章 持久化 380 15.1 RDB持久化 380 15.1.1 SAVE:阻塞服务器并创建RDB文件 381 15.1.2 BGSAVE:以非阻塞方式创建RDB文件 382 15.1.3 通过配置选项自动创建RDB文件 382 15.1.4 SAVE命令和BGSAVE命令的选择 384 15.1.5 RDB文件结构 384 15.1.6 载入RDB文件 386 15.1.7 数据丢失 387 15.2 AOF持久化 389 15.2.1 打开AOF持久化功能 390 15.2.2 设置AOF文件的冲洗频率 391 15.2.3 AOF重写 391 15.2.4 AOF持久化的优缺点 394 15.3 RDB-AOF混合持久化 394 15.4 同时使用RDB持久化和AOF持久化 396 15.5 无持久化 397 15.6 SHUTDOWN:关闭服务器 397 15.6.1 通过可选项指示持久化操作 398 15.6.2 其他信息 399 15.7 重点回顾 399 第16章 发布与订阅 400 16.1 PUBLISH:向频道发送消息 402 16.2 SUBSCRIBE:订阅频道 402 16.2.1 接收频道消息 403 16.2.2 其他信息 404 16.3 UNSUBSCRIBE:退订频道 404 16.3.1 UNSUBSCRIBE命令在不同客户端中的应用 404 16.3.2 其他信息 405 16.4 PSUBSCRIBE:订阅模式 405 16.4.1 接收模式消息 406 16.4.2 其他信息 407 16.5 PUNSUBSCRIBE:退订模式 407 16.5.1 PUNSUBSCRIBE命令在不同客户端中的应用 407 16.5.2 其他信息 408 16.6 PUBSUB:查看发布与订阅的相关信息 408 16.6.1 查看被订阅的频道 408 16.6.2 查看频道的订阅者数量 409 16.6.3 查看被订阅模式的总数量 409 16.6.4 其他信息 409 示例:广播系统 409 16.7 重点回顾 411 第17章 模块 412 17.1 模块的管理 413 17.1.1 编译模块 413 17.1.2 载入模块 413 17.1.3 列出已载入的模块 414 17.1.4 卸载模块 415 17.2 ReJSON模块 416 17.2.1 编译和载入 416 17.2.2 使用示例 417 17.2.3 ReJSON路径 418 17.2.4 API简介 420 17.3 RediSQL模块 423 17.3.1 编译模块 423 17.3.2 使用示例 424 17.3.3 API简介 425 17.4 RediSearch模块 428 17.4.1 下载与编译 428 17.4.2 使用示例 429 17.4.3 API简介 430 17.5 重点回顾 442 第三部分 多机功能 第18章 复制 444 18.1 REPLICAOF:将服务器设置为从服务器 446 18.1.1 通过配置选项设置从服务器 447 18.1.2 取消复制 447 18.1.3 其他信息 448 18.2 ROLE:查看服务器的角色 448 18.2.1 主服务器执行ROLE命令 448 18.2.2 从服务器执行ROLE命令 449 18.2.3 其他信息 449 18.3 数据同步 449 18.3.1 完整同步 450 18.3.2 在线更新 450 18.3.3 部分同步 451 18.4 无须硬盘的复制 452 18.5 降低数据不一致情况出现的概率 452 18.6 可写的从服务器 453 示例:使用从服务器处理复杂计算操作 454 18.7 脚本复制 455 18.7.1 脚本传播模式 455 18.7.2 命令传播模式 456 18.7.3 选择性命令传播 457 18.7.4 模式的选择 458 18.8 重点回顾 459 第19章 Sentinel 460 19.1 启动Sentinel 461 19.2 Sentinel网络 464 19.3 Sentinel管理命令 466 19.3.1 SENTINEL masters:获取所有被监视主服务器的信息 467 19.3.2 SENTINEL master:获取指定被监视主服务器的信息 468 19.3.3 SENTINEL slaves:获取被监视主服务器的从服务器信息 469 19.3.4 SENTINEL sentinels:获取其他Sentinel的相关信息 471 19.3.5 SENTINEL get-master-addr-by-name:获取给定主服务器的IP地址和端口号 472 19.3.6 SENTINEL reset:重置主服务器状态 473 19.3.7 SENTINEL failover:强制执行故障转移 473 19.3.8 SENTINEL ckquorum:检查可用Sentinel的数量 474 19.3.9 SENTINEL flushconfig:强制写入配置文件 474 19.4 在线配置Sentinel 475 19.4.1 SENTINEL monitor:监视给定主服务器 475 19.4.2 SENTINEL remove:取消对给定主服务器的监视 476 19.4.3 SENTINEL set:修改Sentinel配置选项的值 477 19.4.4 使用在线配置命令的注意事项 478 示例:使用redis-py管理Sentinel 479 19.5 重点回顾 479 第20章 集群 481 20.1 基本特性 481 20.1.1 复制与高可用 481 20.1.2 分片与重分片 482 20.1.3 高性能 482 20.1.4 简单易用 483 20.2 搭建集群 483 20.2.1 快速搭建集群 483 20.2.2 手动搭建集群 486 示例:使用客户端连接集群 489 20.3 散列标签 491 20.4 打开/关闭从节点的读命令执行权限 492 20.4.1 READONLY:打开读命令执行权限 493 20.4.2 READWRITE:关闭读命令执行权限 493 20.4.3 其他信息 494 20.5 集群管理工具redis-cli 494 20.5.1 创建集群 495 20.5.2 查看集群信息 496 20.5.3 检查集群 497 20.5.4 修复槽错误 498 20.5.5 重分片 499 20.5.6 负载均衡 501 20.5.7 添加节点 502 20.5.8 移除节点 503 20.5.9 执行命令 504 20.5.10 设置超时时间 504 20.5.11 导入数据 505 20.6 集群管理命令 506 20.6.1 CLUSTER MEET:将节点添加至集群 506 20.6.2 CLUSTER NODES:查看集群内所有节点的相关信息 508 20.6.3 CLUSTER MYID:查看当前节点的运行ID 511 20.6.4 CLUSTER INFO:查看集群信息 512 20.6.5 CLUSTER FORGET:从集群中移除节点 513 20.6.6 CLUSTER REPLICATE:将节点变为从节点 514 20.6.7 CLUSTER REPLICAS:查看给定节点的所有从节点 515 20.6.8 CLUSTER FAILOVER:强制执行故障转移 516 20.6.9 CLUSTER RESET:重置节点 517 20.7 槽管理命令 518 20.7.1 CLUSTER SLOTS:查看槽与节点之间的关联信息 519 20.7.2 CLUSTER ADDSLOTS:把槽指派给节点 520 20.7.3 CLUSTER DELSLOTS:撤销对节点的槽指派 521 20.7.4 CLUSTER FLUSHSLOTS:撤销对节点的所有槽指派 522 20.7.5 CLUSTER KEYSLOT:查看键所属的槽 523 20.7.6 CLUSTER COUNTKEYSINSLOT:查看槽包含的键数量 524 20.7.7 CLUSTER GETKEYSINSLOT:获取槽包含的键 524 20.7.8 CLUSTER SETSLOT:改变槽的状态 525 20.8 重点回顾 527 附录A Redis安装方法 528 附录B redis-py安装方法 531 附录C Redis命令索引表 533 ---------------------------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 |