Redis开发运维实践指南

本手册包含开发和运维的各方面的使用、应用场景和最佳实践, 以及各个高可用架构的搭建和测试。
展开查看详情

1. 目 录 致谢 Redis开发运维实践指南 简述 数据操作 key操作 列出key 测试指定key是否存在 删除给定key 返回给定key的value类型 返回从当前数据库中随机选择的一个key 原子的重命名一个key Key的超时设置处理 字符串操作 设置key对应的值为string类型的value 获取key对应的string值 增减操作 追加字符串 截取字符串 改写字符串 返回子字符串 中文字符串处理 取指定key的value值的长度 位操作 列表操作 添加元素 查看列表长度 查看列表元素 查看一段列表 截取列表 删除元素 设置list中指定下标的元素值 阻塞队列 本文档使用 书栈(BookStack.CN) 构建 - 1 -

2. 集合操作 添加元素 移除元素 删除并返回元素 随机返回一个元素 集合间移动元素 查看集合大小 判断member是否在set中 集合交集 集合并集 集合差集 获取所有元素 有序集合操作 添加元素 删除元素 增加score 获取排名 获取排行榜 返回给定分数区间的元素 返回集合中score在给定区间的数量 返回集合中元素个数 返回给定元素对应的score 评分的聚合 哈希操作 设置hash值 获取hash值 递增某一个域的值 判断某一个域是否存在 删除域 获取域的数量 获取所有的域名 获取所有域的值 获取所有域名和值 HyperLogLog操作 本文档使用 书栈(BookStack.CN) 构建 - 2 -

3. 将元素添加至 HyperLogLog 返回给定 HyperLogLog 的基数估算值 合并多个 HyperLogLog 专题功能 排序 事务 流水线 发布订阅 开发设计规范 Key设计 超时设置 数据异常处理 内存考虑 延迟考虑 典型使用场景参考 客户端推荐 上线部署规划 内存规划 网卡RPS设置 服务器部署位置 持久化设置 多实例配置 具体设置参数 其他好用的配置技巧 常见运维操作 启动 停止 查看和修改配置 批量执行操作 选择数据库 清空数据库 重命名命令 执行lua脚本 设置密码 本文档使用 书栈(BookStack.CN) 构建 - 3 -

4. 验证密码 性能测试命令 Redis-cli命令行其他操作 持久化与备份恢复 RDB相关操作 AOF相关操作 备份 恢复 数据迁移 将key从当前数据库移动到指定数据库 问题处理 一般处理流程 探测服务是否可用 探测服务延迟 监控正在请求执行的命令 查看统计信息 获取慢查询 查看客户端 查看日志 延迟检查 检查CPU情况 检查网络情况 检查redis整体情况 检查连接数 检查持久化 检查命令执行情况 内存检查 系统内存查看 系统swap内存查看 info查看内存 dump.rdb文件成生内存报告(rdb-tool) query在线分析 内存抽样分析 统计生产上比较大的key 本文档使用 书栈(BookStack.CN) 构建 - 4 -

5. 查看key内部结构和编码等问题 Rss与内存碎片增加问题 测试方法 模拟oom 模拟宕机 模拟hang 快速产生测试数据 模拟RDB load情形 模拟AOF load情形 Redis安全问题 Shell提权问题 高可用和集群简述 高可用与分片的概念 高可用主要场景和对应思路 分片主要场景和对应思路 适用场景对比列表 高可用和集群架构与实践 主从复制-sentinel架构 高可用原理 发现原理 基本切换原理 环境搭建 部署架构 网络规划 用户规划 持久化规划 目录规划 部署步骤 配置文件 维护操作 完整启动 启停redis 手动启动 启停sentinel 本文档使用 书栈(BookStack.CN) 构建 - 5 -

6. 查看sentinel状态 查看master地址和端口 查看master配置 重置该sentinel 动态修改sentinel配置 主动切换 主从是否完全一致 接收所有事件信息 高可用和异常测试 测试环境介绍 手动切换测试 主实例宕测试 单从实例宕测试 双从实例宕测试 单sentinel宕测试 双sentinel宕测试 master所在主机整体宕测试 slave所在主机整体宕测试 脑裂测试 quorum测试 Master hang死测试 附:sentinel.conf被修改后的含义 附:sentinel事件含义 其他问题 只读性 事件通知 虚拟IP切换 持久化动态修改 Sentinel最大连接数 Sharding架构(Redis 3.0 Cluster) 高可用与分片原理 集群数据分片 集群的主从复制模型 一致性保证 本文档使用 书栈(BookStack.CN) 构建 - 6 -

7. 环境搭建 安装部署 集群配置参数 维护操作 连接集群 查看集群状态 查看集群节点状态 增加节点 删除节点 查看slot分配情况 查看key位于哪个slot 查看slot包含的键值对数量 返回 count 个 slot 槽中的键 重置节点 切换主从关系 Sharding架构(Twemproxy) 高可用原理 本文档使用 书栈(BookStack.CN) 构建 - 7 -

8.致谢 致谢 当前文档 《Redis开发运维实践指南》 由 进击的皇虫 使用 书 栈(BookStack.CN) 进行构建,生成于 2018-04-11。 书栈(BookStack.CN) 仅提供文档编写、整理、归类等功能,以 及对文档内容的生成和导出工具。 文档内容由网友们编写和整理,书栈(BookStack.CN) 难以确认 文档内容知识点是否错漏。如果您在阅读文档获取知识的时候,发现文 档内容有不恰当的地方,请向我们反馈,让我们共同携手,将知识准 确、高效且有效地传递给每一个人。 同时,如果您在日常生活、工作和学习中遇到有价值有营养的知识 文档,欢迎分享到 书栈(BookStack.CN) ,为知识的传承献上您的 一份力量! 如果当前文档生成时间太久,请到 书栈(BookStack.CN) 获取 最新的文档,以跟上知识更新换代的步伐。 文档地址:http://www.bookstack.cn/books/All-About- Redis 书栈官网:http://www.bookstack.cn 书栈开源:https://github.com/TruthHun 分享,让知识传承更久远! 感谢知识的创造者,感谢知识的分享 者,也感谢每一位阅读到此处的读者,因为我们都将成为知识的传承 者。 本文档使用 书栈(BookStack.CN) 构建 - 8 -

9.致谢 本文档使用 书栈(BookStack.CN) 构建 - 9 -

10.Redis开发运维实践指南 Redis开发运维实践指南 Redis开发运维实践指南 新书发布: 技术交流: 技术交流记录: 长期招聘: 赞助名单(由于微信面对面收钱无法显示,停止更新): Redis开发运维实践指南 本手册是我在一家中国大陆的中型商业银行做大数据系统工程师中进行 的总结归纳,包含开发和运维的各方面的使用、应用场景和最佳实践, 以及各个高可用架构的搭建和测试。 下载和线上阅读最新版请访 问:https://www.gitbook.com/book/gnuhpc/redis-all- about/details 我会定期持续更新此指南,以供各位了解认识redis。 其中会有引用的各种文献和图片,我会尽可能的标注引用,如果您发现 您的文字或者图片未标注引用,请fork本手册的github并pull request: https://github.com/gnuhpc/All-About-Redis 本手册符合共同创作协议, 协议文本见 http://creativecommons.net.cn/licenses/meet-the- licenses/ 有不正确的地方,请通过gnuhpc@weixin或者 本文档使用 书栈(BookStack.CN) 构建 - 10 -

11.Redis开发运维实践指南 huangpengcheng#cmbc.com.cn (:s/#/@)联系我。 如果你觉得这些内容有帮助,欢迎Star我,也欢迎打赏 ^_^ ,我会 不定期公布支持我的好朋友名单。 — Pengcheng Huang 新书发布: 我和Airbnb美国的工程师王左非一起写的新书Redis 4.x Cookbook已经由Packt出版,目前在Amazon.com上销售,请大家多 多支持! https://www.amazon.com/Redis-4-X-Cookbook-Pengcheng- Huang/dp/1783988169/ref=sr_1_2? ie=UTF8&qid=1519899713&sr=8- 2&keywords=redis&dpID=51x10vJb%252B6L&preST=_SX218_B O1,204,203,200_QL40_&dpSrc=srch 亚马逊中国Kindle版地址: https://www.amazon.cn/dp/B07B6SDXQH/ref=sr_1_2? ie=UTF8&qid=1522737150&sr=8- 2&keywords=redis+cookbook 中文版正在翻译,将在博文视点出版。 技术交流: 谢谢大家的赞助,我建立了一个Redis技术交流微信群(主群已满,有 目前codis、pika、tidb等知名开源软件的作者),专门交流Redis 开发和运维相关技术的,由于已经超100人,想加入的请先加我的微 信:gnuhpc。谢谢! 本文档使用 书栈(BookStack.CN) 构建 - 11 -

12.Redis开发运维实践指南 技术交流记录: 为了上述Redis技术交流群,我还创建了一个知识星球,您可以使用微 信扫描下列二维码进入,免费 长期招聘: 我现在所在团队负责我行全行大数据基础架构平台和产品的建设和维护 工作,待遇大于等于一线互联网,技术实力银行业大数据基础架构前三 名,较之同规模的互联网团队也有技术特点。 坐标:北京市顺义区(公司有市内多趟班车来往,开车反方向无压力, 本文档使用 书栈(BookStack.CN) 构建 - 12 -

13.Redis开发运维实践指南 团队崇尚任务驱动型,基本不加班)。 欢迎期待工作生活平衡又希望技术上有所精进的同学联系,有意者请发 简历至 gnuhpc@foxmail.com 或加微信gnuhpc,具体要求如下: 赞助名单(由于微信面对面收钱无法显示,停止更 新): 1. Tina 10元 2016-01-13 2. FloydZhang 10元 2016-01-15 3. Sammy-lp 16.8元 2016-01-21 4. Yunwei 10.1元 2016-01-25 5. csyangchsh 15元 2016-01-29 6. 黄海斌 10元 2016-04-04 7. Ghost 16.88元 2016-04-13 本文档使用 书栈(BookStack.CN) 构建 - 13 -

14. Redis开发运维实践指南 8. zbdba 18.8元 2016-04-19 9. 慎独 10元 2016-04-19 10. Truman 18.8元 2016-04-20 11. 蓝金伟 8.8元 2016-04-26 12. Mengjie 18.8元 2016-04-26 13. Jason Young 66元 2016-04-26 ……. 微信二维码: 支付宝二维码: 本文档使用 书栈(BookStack.CN) 构建 - 14 -

15.Redis开发运维实践指南 本文档使用 书栈(BookStack.CN) 构建 - 15 -

16.简述 简述 1. 简述 1. 简述 Redis为一个运行在内存中的数据结构服务器(data structures server)。Redis使用的是单进程(除持久化时),所以在配置时, 一个实例只会用到一个CPU。本手册分为三部分,第一部分从开发角度 介绍了redis开发中使用API、场景和生产设计规范最佳实践,第二部 分从运维角度介绍了如何运维redis,其间的常见操作和最佳实践等, 第三部分是从高可用和集群方面介绍了redis相关的集群架构、搭建和 测试。 本文档使用 书栈(BookStack.CN) 构建 - 16 -

17.数据操作 数据操作 2. 数据操作 2. 数据操作 熟悉每个数据操作前一定要明白每个操作都是代价,以时间复杂度和对 应查询集或者结果集大小为衡量。时间复杂度收敛状况如下: 本文档使用 书栈(BookStack.CN) 构建 - 17 -

18.key操作 key操作 2.1. key操作 2.1. key操作 redis 的key操作是涉及范围最广的操作 。 本文档使用 书栈(BookStack.CN) 构建 - 18 -

19.列出key 列出key 2.1.1 列出key 2.1.1 列出key 1. keys *user* 2. keys * 有3个通配符 *, ? ,[] *: 通配任意多个字符 ?: 通配单个字符 []: 通配括号内的某1个字符 注:生产已经禁止。更安全的做法是采用scan,原理和操作如下: 针对Keys的改进,支持分页查询Key。在迭代过程中,Keys有增删时不会要锁定写操作,数据 集完整度不做任何保证,同一条key可能会被返回多次. 本文档使用 书栈(BookStack.CN) 构建 - 19 -

20.列出key 对于其他危险的命令,新版本也进行了替代: redis-cli下的扫描: 1. redis-cli --scan --pattern 'chenqun_*' 这是用scan命令扫描redis中的key,—pattern选项指定扫描的key 的pattern。相比keys pattern模式,不会长时间阻塞redis而导致 其他客户端的命令请求一直处于阻塞状态。 本页中采用了小象学院的两张片子,版权归 http://www.chinahadoop.cn/ 所有 本文档使用 书栈(BookStack.CN) 构建 - 20 -

21.列出key 本文档使用 书栈(BookStack.CN) 构建 - 21 -

22.测试指定key是否存在 测试指定key是否存在 2.1.2 测试指定key是否存在 2.1.2 测试指定key是否存在 1. exists key 返回1表示存在,0不存在 本文档使用 书栈(BookStack.CN) 构建 - 22 -

23.删除给定key 删除给定key 2.1.3 删除给定key 2.1.3 删除给定key 1. del key1 key2 ....keyN 返回1表示存在,0不存在 本文档使用 书栈(BookStack.CN) 构建 - 23 -

24.返回给定key的value类型 返回给定key的value类型 2.1.4 返回给定key的value类型 2.1.4 返回给定key的value类型 1. type key 返回 none 表示不存在key。string字符类型,list 链表类型 set 无序集合类型… 本文档使用 书栈(BookStack.CN) 构建 - 24 -

25.返回从当前数据库中随机选择的一个key 返回从当前数据库中随机选择的一个key 2.1.5 返回从当前数据库中随机选择的一个key 2.1.5 返回从当前数据库中随机选择的一个key 1. randomkey 如果当前数据库是空的,返回空串 本文档使用 书栈(BookStack.CN) 构建 - 25 -

26.原子的重命名一个key 原子的重命名一个key 2.1.6 原子的重命名一个key 2.1.6 原子的重命名一个key 1. rename oldkey newkey 如果newkey存在,将会被覆盖,返回1表示成功,0失败。可能是 oldkey不存在或者和newkey相同 1. renamenx oldkey newkey 同上,但是如果newkey存在返回失败 本文档使用 书栈(BookStack.CN) 构建 - 26 -

27.Key的超时设置处理 Key的超时设置处理 2.1.7 Key的超时设置处理 2.1.7 Key的超时设置处理 1. expire key seconds 单位是秒。返回1成功,0表示key已经设置过过期时间或者不存在。 如果想消除超时则使用persist key。如果希望采用绝对超时,则使 用expireat命令。 1. ttl key 返回设置过过期时间的key的剩余过期秒数 -1表示没有设置过过期时 间,对于不存在的key,返回-2。 1. pexpire key 毫秒数 设置生命周期。 1. pttl key 以毫秒返回生命周期。 注意: 当client主动访问key会先对key进行超时判断,过时的key会立刻删除。 如果clien永远都不再get那条key呢? 它会在Master的后台,每秒10次的执行如下操作: 随机选取100个key校验是否过期,如果有25个以上的key过期了,立刻额外随机选取下100个 key(不计算在10次之内)。可见,如果过期的key不多,它最多每秒回收200条左右,如果有超 本文档使用 书栈(BookStack.CN) 构建 - 27 -

28.Key的超时设置处理 过25%的key过期了,它就会做得更多,但只要key不被主动get,它占用的内存什么时候最终 被清理掉只有天知道。 在主从复制环境中,由于上述原因存在已经过期但是没有删除的key,在主snapshot时并不包 含这些key,因此在slave环境中我们往往看到dbsize较master是更小的。 本文档使用 书栈(BookStack.CN) 构建 - 28 -

29.字符串操作 字符串操作 最大字符串为512M,但是大字符串非常不建议。 本文档使用 书栈(BookStack.CN) 构建 - 29 -