本书围绕“高并发大数据”的项目需求,全面讲述分布式缓存组件Redis的基本语法、核心技术和实战技能。
本书分为13章,第1~7章主要介绍Redis入门知识、Redis基本数据类型、Redis常用命令、Redis服务器和客户端实践技巧、Redis数据库操作技巧、Redis AOF和RDB持久化操作技巧、Redis集群的搭建方式,第8~11章主要介绍Redis同MySQL和MyCAT集群的整合技巧、Redis同lua的整合技巧等,第12、13章主要介绍Redis、Spring Boot和Spring Cloud如何构建微服务应用。
目录
- 前言
- 第1章 构建Redis开发环境1
- 1.1 Redis概述1
- 1.1.1 对比传统数据库与NoSQL数据库1
- 1.1.2 Redis的特点2
- 1.1.3 Redis更适合以分布式集群的方式提供服务2
- 1.2 了解必要的Docker技能3
- 1.2.1 Docker容器、镜像和仓库3
- 1.2.2 在Windows上安装Docker3
- 1.2.3 Docker镜像相关的命令4
- 1.2.4 Docker容器相关的命令4
- 1.3 安装和配置基于Docker的Redis环境5
- 1.3.1 用docker pull下载最新Redis镜像5
- 1.3.2 用docker run启动Redis容器5
- 1.3.3 用docker logs观察Redis启动效果6
- 1.3.4 通过docker exec进入Redis容器6
- 1.3.5 停止、重启和删除Redis容器7
- 1.3.6 查看Redis的版本8
- 1.3.7 Redis服务器和客户端8
- 1.3.8 总结容器和Redis的相关命令9
- 1.4 本章小结10
- 第2章 实践Redis的基本数据类型11
- 2.1 Redis缓存初体验11
- 2.1.1 用redis-cli启动客户端并缓存数据11
- 2.1.2 设置数据的生存时间12
- 2.2 针对字符串的命令13
- 2.2.1 读写字符串的set和get命令13
- 2.2.2 设置和获取多个字符串的命令14
- 2.2.3 对值进行增量和减量操作15
- 2.2.4 通过getset命令设置新值16
- 2.2.5 针对字符串的其他操作17
- 2.3 针对哈希类型变量的命令17
- 2.3.1 设置并获取哈希值18
- 2.3.2 hsetnx命令19
- 2.3.3 针对key的相关操作19
- 2.3.4 用hexists命令判断值是否存在20
- 2.3.5 对哈希类型数据的删除操作21
- 2.4 针对列表类型变量的命令21
- 2.4.1 读写列表的命令21
- 2.4.2 lpushx和rpushx命令23
- 2.4.3 用list模拟堆栈和队列24
- 2.4.4 用lrange命令获取指定区间内的数据25
- 2.4.5 用lset命令修改列表数据26
- 2.4.6 删除列表数据的命令26
- 2.5 针对集合的命令28
- 2.5.1 读写集合的命令28
- 2.5.2 列表和集合类数据的使用场景29
- 2.5.3 用sismember命令判断元素是否存在29
- 2.5.4 获取集合的交集、并集和差集29
- 2.5.5 用srem命令删除集合数据30
- 2.6 针对有序集合的命令31
- 2.6.1 读写有序集合的命令31
- 2.6.2 通过zincrby命令修改元素的分值33
- 2.6.3 用zscore命令获取指定元素的分数33
- 2.6.4 查看有序集合里的元素排名34
- 2.6.5 删除有序集合里的值35
- 2.7 本章小结36
- 第3章 实践Redis的常用命令37
- 3.1 键操作命令37
- 3.1.1 用exists命令判断键是否存在37
- 3.1.2 用keys命令查找键38
- 3.1.3 用scan命令查找键38
- 3.1.4 重命名键39
- 3.1.5 用del命令删除键40
- 3.1.6 关于键生存时间的命令41
- 3.2 HyperLogLog相关命令42
- 3.2.1 用pfadd添加键值对42
- 3.2.2 用pfcount统计基数值43
- 3.2.3 用pfmerge进行合并操作43
- 3.2.4 统计网站访问总人数44
- 3.3 lua脚本相关命令44
- 3.3.1 把lua脚本装载到缓存里45
- 3.3.2 通过evalsha命令执行缓存中的脚本45
- 3.3.3 清空缓存中lua脚本的命令45
- 3.3.4 用eval命令执行lua脚本46
- 3.4 排序相关命令46
- 3.4.1 用sort命令进行排序46
- 3.4.2 用by参数指定排序模式48
- 3.4.3 用limit参数返回部分排序结果48
- 3.4.4 sort命令里get参数的用法49
- 3.4.5 通过store参数提升性能50
- 3.5 本章小结51
- 第4章 实践Redis服务器和客户端的操作52
- 4.1 Redis服务器管理客户端的命令52
- 4.1.1 获取和设置客户端的名字52
- 4.1.2 通过client list命令查看客户端的信息53
- 4.1.3 通过client pause命令暂停客户端的命令53
- 4.1.4 通过client kill命令中断客户端连接54
- 4.1.5 通过shutdown命令关闭服务器和客户端54
- 4.2 查看Redis服务器的详细信息55
- 4.2.1 通过info命令查看服务器信息55
- 4.2.2 查看客户端连接状况56
- 4.2.3 观察最大连接数56
- 4.2.4 查看每秒执行多少条指令56
- 4.2.5 观察内存用量57
- 4.2.6 通过command命令查看Redis命令57
- 4.2.7 查看指定Redis命令的信息58
- 4.2.8 获取指定命令的所有键58
- 4.3 查看并修改服务器的常用配置59
- 4.3.1 查看服务器的配置59
- 4.3.2 通过修改服务器配置设置密码60
- 4.3.3 用config rewrite命令改写Redis配置文件61
- 4.3.4 启动Redis服务器时加载配置文件61
- 4.4 多个客户端连接远端服务器63
- 4.4.1 多个Redis客户端连接远端服务器63
- 4.4.2 通过docker inspect命令观察IP地址64
- 4.4.3 实践客户端命令65
- 4.4.4 通过info观察服务器状态65
- 4.5 本章小结66
- 第5章 Redis数据库操作实战67
- 5.1 切换数据库操作67
- 5.1.1 查看和设置默认的数据库个数67
- 5.1.2 用select命令切换数据库69
- 5.2 Redis事务操作70
- 5.2.1 事务的概念与ACID特性70
- 5.2.2 实现Redis事务的相关命令70
- 5.2.3 通过discard命令撤销事务中的操作71
- 5.2.4 Redis持久化与事务持久性72
- 5.2.5 用watch命令监视指定键73
- 5.3 地理位置相关操作75
- 5.3.1 用geoadd命令存储地理位置75
- 5.3.2 获取地理位置的经纬度信息76
- 5.3.3 查询指定范围内的地理信息76
- 5.3.4 查询地理位置间的距离77
- 5.4 位图数据类型的应用78
- 5.4.1 setbit和getbit操作78
- 5.4.2 用bitop对位图进行运算79
- 5.4.3 bitcount操作80
- 5.5 慢查询实战分析81
- 5.5.1 慢查询相关的配置参数81
- 5.5.2 用slowlog get命令观察慢查询81
- 5.5.3 慢查询相关命令82
- 5.6 本章小结83
- 第6章 Redis数据持久化操作84
- 6.1 Redis持久化机制概述84
- 6.1.1 基于AOF的持久化机制84
- 6.1.2 基于RDB的持久化机制85
- 6.2 AOF持久化机制实战85
- 6.2.1 AOF配置文件的说明85
- 6.2.2 实践AOF持久化86
- 6.2.3 观察重写AOF文件的效果88
- 6.2.4 模拟数据恢复的流程89
- 6.2.5 修复AOF文件91
- 6.3 RDB持久化机制实战91
- 6.3.1 编写配置文件,生成RDB快照92
- 6.3.2 用快照文件恢复数据93
- 6.3.3 save和bgsave命令94
- 6.4 如何选用持久化方式94
- 6.4.1 对比两种持久化方式95
- 6.4.2 综合使用两种持久化方式95
- 6.4.3 查看持久化状态的命令96
- 6.5 本章小结97
- 第7章 搭建Redis集群98
- 7.1 搭建基于主从复制模式的集群98
- 7.1.1 主从复制模式概述98
- 7.1.2 用命令搭建主从集群99
- 7.1.3 通过配置搭建主从集群101
- 7.1.4 配置读写分离效果103
- 7.1.5 用心跳机制提高主从复制的可靠性103
- 7.1.6 用偏移量检查数据是否一致104
- 7.2 搭建哨兵模式的集群105
- 7.2.1 哨兵模式概述105
- 7.2.2 搭建哨兵模式集群106
- 7.2.3 哨兵节点的常用配置108
- 7.2.4 哨兵模式下的故障自动恢复效果109
- 7.2.5 通过日志观察故障恢复流程110
- 7.2.6 故障节点恢复后的表现112
- 7.3 搭建cluster集群113
- 7.3.1 哈希槽与cluster集群113
- 7.3.2 初步搭建cluster集群114
- 7.3.3 在cluster集群中读写数据120
- 7.3.4 模拟扩容和数据迁移动作121
- 7.3.5 cluster集群的常用配置参数123
- 7.4 本章小结124
- 第8章 Java整合MySQL与Redis125
- 8.1 Java通过Jedis读写Redis125
- 8.1.1 以Maven方式引入Jedis包125
- 8.1.2 通过Jedis读写Redis字符串126
- 8.1.3 操作各种Redis命令128
- 8.1.4 以事务的方式操作Redis129
- 8.1.5 Jedis连接池130
- 8.1.6 用管道的方式提升操作性能131
- 8.2 Java与各种Redis数据类型132
- 8.2.1 读写列表类对象132
- 8.2.2 读写哈希表对象134
- 8.2.3 读写集合对象135
- 8.2.4 读写有序集合对象135
- 8.2.5 操作地理位置数据136
- 8.3 Redis与MySQL的整合137
- 8.3.1 通过Docker安装MySQL开发环境138
- 8.3.2 通过JDBC连接并操作MySQL数据库139
- 8.3.3 引入Redis做缓存142
- 8.3.4 模拟缓存穿透现象146
- 8.3.5 模拟内存使用不当的场景147
- 8.4 Redis缓存实战分析148
- 8.4.1 缓存不存在的键,以防穿透148
- 8.4.2 合理设置超时时间,以防内存溢出150
- 8.4.3 超时时间外加随机数,以防穿透152
- 8.5 本章小结153
- 第9章 Redis应用场景与案例实现154
- 9.1 Redis消息队列实战154
- 9.1.1 消息队列与Redis消息订阅发布模式154
- 9.1.2 消息订阅发布的命令和流程155
- 9.1.3 消息订阅发布的相关命令汇总159
- 9.1.4 Java与消息队列的实战范例159
- 9.2 用Java实战Redis分布式锁162
- 9.2.1 观察分布式锁的特性162
- 9.2.2 加锁与解锁的Redis命令分析163
- 9.2.3 基于Java语言的Redis分布式锁163
- 9.3 用Java实现Redis限流167
- 9.3.1 zset有序集合相关命令与限流167
- 9.3.2 zset有序集合与限流167
- 9.4 Redis压力测试实战169
- 9.5 本章小结171
- 第10章 Redis整合MySQL集群与MyCAT分库分表组件172
- 10.1 Redis整合MySQL主从集群172
- 10.1.1 用Docker搭建MySQL主从集群172
- 10.1.2 准备数据176
- 10.1.3 创建Java项目,准备pom文件177
- 10.1.4 用Java代码读写MySQL集群和Redis178
- 10.1.5 MySQL主从集群整合Redis主从集群181
- 10.2 Redis整合MySQL和MyCAT分库组件185
- 10.2.1 分库分表概述185
- 10.2.2 用MyCAT组件实现分库分表187
- 10.2.3 Java、MySQL与MyCAT的整合范例190
- 10.2.4 Redis集群与MySQL和MyCAT整合范例195
- 10.3 本章小结199
- 第11章 Redis整合lua脚本实战200
- 11.1 在Redis里调用lua脚本200
- 11.1.1 结合Redis叙述lua的特性200
- 11.1.2 通过redis-cli命令运行lua脚本201
- 11.1.3 直接通过eval命令执行脚本202
- 11.1.4 通过return返回脚本运行结果203
- 11.1.5 整理Redis里和lua相关的命令203
- 11.1.6 观察lua脚本阻塞Redis的效果204
- 11.2 Redis整合lua高级实战205
- 11.2.1 通过KEYS和ARGV传递参数205
- 11.2.2 在脚本里引入分支语句206
- 11.2.3 while循环调用207
- 11.2.4 for循环调用208
- 11.2.5 在Java程序里调用Redis的lua脚本209
- 11.2.6 lua脚本有错,不会执行210
- 11.3 Redis整合lua脚本的实例分析211
- 11.3.1 以计数模式实现限流效果211
- 11.3.2 用lua脚本防止超卖214
- 11.4 本章小结217
- 第12章 Redis与Spring Boot的整合应用218
- 12.1 在Spring Boot框架里引入Redis218
- 12.1.1 SSM和Spring Boot框架介绍218
- 12.1.2 准备MySQL数据库和数据表220
- 12.1.3 搭建Spring Boot框架221
- 12.1.4 在框架里引入Redis等组件222
- 12.1.5 启动Spring Boot,观察缓存效果228
- 12.2 Spring Boot框架整合Redis哨兵集群229
- 12.2.1 搭建Redis哨兵集群229
- 12.2.2 在Spring Boot框架里引入Redis哨兵集群230
- 12.2.3 观察整合效果231
- 12.3 Spring Boot框架整合Redis cluster集群232
- 12.3.1 搭建Redis cluster集群232
- 12.3.2 在Spring Boot里使用Redis cluster集群232
- 12.4 在Spring Boot里实现秒杀案例233
- 12.4.1 构建Spring Boot项目233
- 12.4.2 编写启动类235
- 12.4.3 在Controller层里定义秒杀接口235
- 12.4.4 在Service层里通过lua脚本实现秒杀效果236
- 12.4.5 配置Redis连接参数238
- 12.4.6 演示秒杀效果239
- 12.5 本章小结242
- 第13章 Redis整合Spring Cloud微服务243
- 13.1 微服务和Spring Cloud相关概念243
- 13.1.1 传统架构与微服务的比较243
- 13.1.2 Spring Cloud全家桶组件与微服务的关系245
- 13.2 多模块整合Redis,构建微服务体系246
- 13.2.1 用Docker准备Redis和MySQL集群环境246
- 13.2.2 含Redis和Eureka的微服务架构图247
- 13.2.3 开发Eureka服务器248
- 13.2.4 开发含Redis的风控模块(Eureka客户端)251
- 13.2.5 开发含Redis的下单模块(Eureka客户端)259
- 13.3 Redis与Ribbon整合使用264
- 13.3.1 Ribbon负载均衡组件与Redis的整合效果265
- 13.3.2 引入多个风控组件分摊流量265
- 13.3.3 从缓存和负载均衡维度观察整合后的效果267
- 13.4 本章小结268