Repository: AobingJava/JavaFamily Branch: master Commit: 015249a6fae7 Files: 105 Total size: 191.4 KB Directory structure: gitextract_raa9y6v2/ ├── .idea/ │ ├── codeStyles/ │ │ └── codeStyleConfig.xml │ ├── vcs.xml │ └── workspace.xml ├── README.md └── docs/ ├── all/ │ ├── Java必会基础与新版本特性.md │ ├── db/ │ │ ├── MySQL基础知识.md │ │ ├── 事务特性、隔离级别、数据安全.md │ │ ├── 分库分表.md │ │ ├── 数据库性能调优.md │ │ ├── 数据库面试题.md │ │ └── 索引、锁机制.md │ ├── jvm/ │ │ ├── 垃圾回收器、垃圾回收算法.md │ │ ├── 垃圾回收机制.md │ │ ├── 性能调优、线上问题排查.md │ │ ├── 深入浅出JVM.md │ │ └── 类加载机制详解.md │ ├── line.md │ ├── mq/ │ │ ├── RocketMQ.md │ │ ├── kafka.md │ │ └── 重复消费、顺序消费、分布式事务.md │ ├── 人物&杂谈.md │ ├── 各地互联网公司盘点.md │ ├── 基础核心/ │ │ ├── io.md │ │ ├── java基础知识.md │ │ ├── linux.md │ │ └── 计算机操作系统.md │ ├── 大数据/ │ │ └── Flink.md │ ├── 学习路线.md │ ├── 并发与多线程/ │ │ ├── 多线程基础知识.md │ │ ├── 多线程经典面试题.md │ │ ├── 多线程锁机制.md │ │ ├── 常见关键字.md │ │ ├── 常见的JUC工具类.md │ │ └── 线程池知识点.md │ ├── 开源/ │ │ └── 开源框架.md │ ├── 必会框架/ │ │ ├── RPC/ │ │ │ ├── Dubbo.md │ │ │ ├── Netty.md │ │ │ └── RPC实践.md │ │ ├── SpringCloud.md │ │ ├── Zookeeper.md │ │ └── spring.md │ ├── 搜索引擎/ │ │ └── es.md │ ├── 架构演进之路/ │ │ ├── 互联网架构之路.md │ │ ├── 分布式&分布式事务.md │ │ └── 怎么设计一个能顶住双十一的系统.md │ ├── 研发规范/ │ │ ├── 大厂技术研发规范.md │ │ ├── 开源漏洞.md │ │ └── 阿里巴巴技术规范.md │ ├── 科普.md │ ├── 程序人生/ │ │ ├── 成长经历.md │ │ ├── 生活趣事.md │ │ ├── 职场经历.md │ │ ├── 自媒体经历.md │ │ ├── 读者经历.md │ │ └── 过年特辑.md │ ├── 线上问题排查.md │ ├── 缓存/ │ │ ├── Redis常见线上故障及其解决方案.md │ │ ├── Redis常见面试题.md │ │ ├── Redis数据结构、基础知识.md │ │ ├── redis/ │ │ │ ├── Redis基础.md │ │ │ ├── Redis常见面试题.md │ │ │ ├── 布隆过滤器(BloomFilter).md │ │ │ ├── 缓存击穿、雪崩、穿透.md │ │ │ └── 集群高可用、哨兵、持久化、LRU.md │ │ └── 知识点之外的缓存之路.md │ ├── 职场杂谈.md │ ├── 计算机网络/ │ │ ├── HTTP/ │ │ │ └── HTTPS.md │ │ ├── TCP/ │ │ │ └── IP.md │ │ └── 网络基础.md │ ├── 设计模式和使用场景.md │ ├── 集合框架/ │ │ ├── ArrayList.md │ │ ├── ConcurrentHashMap.md │ │ ├── HashMap.md │ │ ├── Vector.md │ │ └── 基础.md │ ├── 面试技巧/ │ │ ├── 加分项.md │ │ ├── 简历.md │ │ ├── 语言组织.md │ │ └── 面试流程.md │ └── 面试真题&面经分享/ │ ├── bilibili.md │ ├── 京东.md │ ├── 其他.md │ ├── 国企.md │ ├── 外企.md │ ├── 字节跳动面试题.md │ ├── 小红书.md │ ├── 拼多多面试题.md │ ├── 校招面试题.md │ ├── 百度.md │ ├── 网易.md │ ├── 美团.md │ ├── 腾讯面试题.md │ └── 阿里巴巴面试题.md ├── basics/ │ └── HashMap.md ├── coderLife/ │ ├── 写作一个月在感恩节对大家说的话.md │ ├── 敖丙用20行代码拿了比赛冠军.md │ ├── 教你在服务器搭建个人面试项目.md │ └── 记一次差点害敖丙丢工作的的线上P0事故.md ├── creative/ │ ├── 《吐血整理》十年风雨技术人的书单整理.md │ ├── 彩蛋.md │ └── 顶级程序员的百宝箱.md └── idea/ ├── idea.md ├── 电子书.md ├── 知识星球.md └── 资料.md ================================================ FILE CONTENTS ================================================ ================================================ FILE: .idea/codeStyles/codeStyleConfig.xml ================================================ ================================================ FILE: .idea/vcs.xml ================================================ ================================================ FILE: .idea/workspace.xml ================================================ { "lastFilter": { "state": "OPEN", "assignee": "AobingJava" } } { "selectedUrlAndAccountId": { "url": "https://github.com/AobingJava/JavaFamily.git", "accountId": "db293c56-b1d4-4a65-bc7c-ff15bdc7754a" } } { "associatedIndex": 2 } { "keyToString": { "RunOnceActivity.ShowReadmeOnStart": "true", "git-widget-placeholder": "master", "kotlin-language-version-configured": "true", "node.js.detected.package.eslint": "true", "node.js.detected.package.tslint": "true", "node.js.selected.package.eslint": "(autodetect)", "node.js.selected.package.tslint": "(autodetect)", "nodejs_package_manager_path": "npm", "vue.rearranger.settings.migration": "true" } } 1720708986075 ================================================ FILE: README.md ================================================ 我会从下图中的知识点去写这个系列,很多细节的点,可能想得不是很完善,大家可以去[【公众号】](#公众号)获取或者加我[【微信】](#微信)提意见(别忘记**Star**哟)。 原创文章每周最少两篇,公众号首发文章,[【B站】](https://space.bilibili.com/130763764)首发视频,比博客早一到两篇。

微信群 公众号 投稿 公众号 投稿 投稿

# 目录(善用Ctrl+F) **ps : 没链接的是还没写(耐心等待更哟)** #### [后端面试点合集](https://mp.weixin.qq.com/s/gBr3UfC1HRcw4U-ZMmtRaQ) #### [脑图在线编辑地址](https://www.processon.com/view/5e86b713e4b0bf3ebcf4e376) - [讯飞星辰](https://juejin.cn/post/7562737437380034612) - [学习路线](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF.md) - Java基础核心串讲 - [Java基础知识](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E5%9F%BA%E7%A1%80%E6%A0%B8%E5%BF%83/java%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86.md) - [计算机操作系统](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E5%9F%BA%E7%A1%80%E6%A0%B8%E5%BF%83/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F.md) - [IO](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E5%9F%BA%E7%A1%80%E6%A0%B8%E5%BF%83/io.md) - [Linux](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E5%9F%BA%E7%A1%80%E6%A0%B8%E5%BF%83/linux.md) - [计算机网络](https://github.com/AobingJava/JavaFamily/tree/master/docs/all/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C) - [HTTP/HTTPS](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/HTTP/HTTPS.md) - [TCP/IP](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/TCP/IP.md) - [7种常见的设计模式和使用场景](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E5%92%8C%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF.md) - [Java必会基础与新版本特性](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/Java%E5%BF%85%E4%BC%9A%E5%9F%BA%E7%A1%80%E4%B8%8E%E6%96%B0%E7%89%88%E6%9C%AC%E7%89%B9%E6%80%A7.md) - [线上问题排查](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E7%BA%BF%E4%B8%8A%E9%97%AE%E9%A2%98%E6%8E%92%E6%9F%A5.md) - 集合框架 - [HashMap](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E9%9B%86%E5%90%88%E6%A1%86%E6%9E%B6/HashMap.md) - [ConcurrentHashMap](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E9%9B%86%E5%90%88%E6%A1%86%E6%9E%B6/ConcurrentHashMap.md) - [ArrayList](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E9%9B%86%E5%90%88%E6%A1%86%E6%9E%B6/ArrayList.md) - [Vector](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E9%9B%86%E5%90%88%E6%A1%86%E6%9E%B6/Vector.md) - 深入浅出JVM - [JVM内存模型](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/jvm/%E6%B7%B1%E5%85%A5%E6%B5%85%E5%87%BAJVM.md) - [性能调优、线上问题排查](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/jvm/%E6%80%A7%E8%83%BD%E8%B0%83%E4%BC%98%E3%80%81%E7%BA%BF%E4%B8%8A%E9%97%AE%E9%A2%98%E6%8E%92%E6%9F%A5.md) - [类加载机制详解](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/jvm/%E7%B1%BB%E5%8A%A0%E8%BD%BD%E6%9C%BA%E5%88%B6%E8%AF%A6%E8%A7%A3.md) - [垃圾回收机制](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/jvm/%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6.md) - [垃圾回收器、垃圾回收算法](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/jvm/%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E5%99%A8%E3%80%81%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E7%AE%97%E6%B3%95.md) - 并发与多线程 - [多线程基础知识](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E5%B9%B6%E5%8F%91%E4%B8%8E%E5%A4%9A%E7%BA%BF%E7%A8%8B/%E5%A4%9A%E7%BA%BF%E7%A8%8B%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86.md) - [常见关键字](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E5%B9%B6%E5%8F%91%E4%B8%8E%E5%A4%9A%E7%BA%BF%E7%A8%8B/%E5%B8%B8%E8%A7%81%E5%85%B3%E9%94%AE%E5%AD%97.md) - [多线程锁机制](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E5%B9%B6%E5%8F%91%E4%B8%8E%E5%A4%9A%E7%BA%BF%E7%A8%8B/%E5%A4%9A%E7%BA%BF%E7%A8%8B%E9%94%81%E6%9C%BA%E5%88%B6.md) - [线程池知识点](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E5%B9%B6%E5%8F%91%E4%B8%8E%E5%A4%9A%E7%BA%BF%E7%A8%8B/%E7%BA%BF%E7%A8%8B%E6%B1%A0%E7%9F%A5%E8%AF%86%E7%82%B9.md) - [常见的JUC工具类](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E5%B9%B6%E5%8F%91%E4%B8%8E%E5%A4%9A%E7%BA%BF%E7%A8%8B/%E5%B8%B8%E8%A7%81%E7%9A%84JUC%E5%B7%A5%E5%85%B7%E7%B1%BB.md) - [多线程经典面试题](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E5%B9%B6%E5%8F%91%E4%B8%8E%E5%A4%9A%E7%BA%BF%E7%A8%8B/%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%BB%8F%E5%85%B8%E9%9D%A2%E8%AF%95%E9%A2%98.md) - 常用工具集 - JVM问题排查工具-JMC - IDEA开发神器 - 线上调试神器-btrace - Git原理与工作流 - Linux常用分析工具 - 数据结构与算法 - 从二叉搜索树到B+树 - 经典问题之字符串 - 经典问题之TOPK - [最大公共子串](https://mp.weixin.qq.com/s/Yx3uRVGFYikx8gm-oi-0vg) - [动态规划](https://mp.weixin.qq.com/s/1dG8Dk7nZeIGHQ0Hp8gq7Q) - [大厂面试爱问的「调度算法」,20 张图一举拿下](https://mp.weixin.qq.com/s/B9MVq1617YgtgBtwvhVg-Q) - [图解红黑树](https://mp.weixin.qq.com/s/-8JFh5iLr88XA4AJ9mMf6g) - [面试必备 | 不可不会的反转链表](https://mp.weixin.qq.com/s/_DJgsdhY4drJyEPN9xZX6Q) - [红黑树【图解】](https://mp.weixin.qq.com/s/sPIE54UmvNgINZIATQKyew) - [算法学习工具网站](https://mp.weixin.qq.com/s/pWXxg9O5BwcC9Zi68PT3TQ) - 必会框架 - [Spring全家桶以及源码分析](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E5%BF%85%E4%BC%9A%E6%A1%86%E6%9E%B6/spring.md) - [SpringCloud](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E5%BF%85%E4%BC%9A%E6%A1%86%E6%9E%B6/SpringCloud.md) - 分布式框架基石-RPC - [Dubbo](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E5%BF%85%E4%BC%9A%E6%A1%86%E6%9E%B6/RPC/Dubbo.md) - [RPC实践](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E5%BF%85%E4%BC%9A%E6%A1%86%E6%9E%B6/RPC/RPC%E5%AE%9E%E8%B7%B5.md) - [Netty](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E5%BF%85%E4%BC%9A%E6%A1%86%E6%9E%B6/RPC/Netty.md) - ORM框架Mybatis源码分析 - [Zookeeper](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E5%BF%85%E4%BC%9A%E6%A1%86%E6%9E%B6/Zookeeper.md) - 高并发架构基石-缓存 - [Redis数据结构、基础知识](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E7%BC%93%E5%AD%98/Redis%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E3%80%81%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86.md) - [Redis常见线上故障及其解决方案](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E7%BC%93%E5%AD%98/Redis%E5%B8%B8%E8%A7%81%E7%BA%BF%E4%B8%8A%E6%95%85%E9%9A%9C%E5%8F%8A%E5%85%B6%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88.md) - [Redis常见面试题](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E7%BC%93%E5%AD%98/Redis%E5%B8%B8%E8%A7%81%E9%9D%A2%E8%AF%95%E9%A2%98.md) - [知识点之外的缓存之路](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E7%BC%93%E5%AD%98/%E7%9F%A5%E8%AF%86%E7%82%B9%E4%B9%8B%E5%A4%96%E7%9A%84%E7%BC%93%E5%AD%98%E4%B9%8B%E8%B7%AF.md) - 消息队列 - [消息队列基础知识](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/mq/%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97%E5%9F%BA%E7%A1%80.md) - [Kafka](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/mq/kafka.md) - [RocketMQ](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/mq/RocketMQ.md) - [消息队列面试题](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/mq/%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97%E9%9D%A2%E8%AF%95%E9%A2%98.md) - 数据库 - [MySQL基础知识](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/db/MySQL%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86.md) - [索引、锁机制](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/db/%E7%B4%A2%E5%BC%95%E3%80%81%E9%94%81%E6%9C%BA%E5%88%B6.md) - [事务特性、隔离级别、数据安全](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/db/%E4%BA%8B%E5%8A%A1%E7%89%B9%E6%80%A7%E3%80%81%E9%9A%94%E7%A6%BB%E7%BA%A7%E5%88%AB%E3%80%81%E6%95%B0%E6%8D%AE%E5%AE%89%E5%85%A8.md) - [数据库性能调优](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/db/%E6%95%B0%E6%8D%AE%E5%BA%93%E6%80%A7%E8%83%BD%E8%B0%83%E4%BC%98.md) - [分库分表](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/db/%E5%88%86%E5%BA%93%E5%88%86%E8%A1%A8.md) - [数据库面试题](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/db/%E6%95%B0%E6%8D%AE%E5%BA%93%E9%9D%A2%E8%AF%95%E9%A2%98.md) - 大数据 - [大数据体系](https://mp.weixin.qq.com/s/7rW9eHxdRXtWJExVupcZZQ) - ODPS离线分析 - Hive - Spark - Hadoop - Hbase - HDFS - [Flink](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E5%A4%A7%E6%95%B0%E6%8D%AE/Flink.md) - 搜索引擎 - [ElasticSearch](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E/es.md) - Canal - Kibana - Lucene - Logstash - [优秀开源框架推荐](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E5%BC%80%E6%BA%90/%E5%BC%80%E6%BA%90%E6%A1%86%E6%9E%B6.md) - 架构演进之路 - 从All in one 到微服务 - [互联网架构之路](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E6%9E%B6%E6%9E%84%E6%BC%94%E8%BF%9B%E4%B9%8B%E8%B7%AF/%E4%BA%92%E8%81%94%E7%BD%91%E6%9E%B6%E6%9E%84%E4%B9%8B%E8%B7%AF.md) - [怎么设计一个能顶住双十一的系统?](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E6%9E%B6%E6%9E%84%E6%BC%94%E8%BF%9B%E4%B9%8B%E8%B7%AF/%E6%80%8E%E4%B9%88%E8%AE%BE%E8%AE%A1%E4%B8%80%E4%B8%AA%E8%83%BD%E9%A1%B6%E4%BD%8F%E5%8F%8C%E5%8D%81%E4%B8%80%E7%9A%84%E7%B3%BB%E7%BB%9F.md) - [分布式&分布式事务](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E6%9E%B6%E6%9E%84%E6%BC%94%E8%BF%9B%E4%B9%8B%E8%B7%AF/%E5%88%86%E5%B8%83%E5%BC%8F%26%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1.md) - 互联网前沿技术 - 容器化:Docker与k8s详解 - 面试技巧 - [简历](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E9%9D%A2%E8%AF%95%E6%8A%80%E5%B7%A7/%E7%AE%80%E5%8E%86.md) - [语言组织](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E9%9D%A2%E8%AF%95%E6%8A%80%E5%B7%A7/%E8%AF%AD%E8%A8%80%E7%BB%84%E7%BB%87.md) - [加分项](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E9%9D%A2%E8%AF%95%E6%8A%80%E5%B7%A7/%E5%8A%A0%E5%88%86%E9%A1%B9.md) - [面试流程](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E9%9D%A2%E8%AF%95%E6%8A%80%E5%B7%A7/%E9%9D%A2%E8%AF%95%E6%B5%81%E7%A8%8B.md) - 研发规范 - [阿里巴巴技术规范](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E7%A0%94%E5%8F%91%E8%A7%84%E8%8C%83/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4%E6%8A%80%E6%9C%AF%E8%A7%84%E8%8C%83.md) - [开源漏洞](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E7%A0%94%E5%8F%91%E8%A7%84%E8%8C%83/%E5%BC%80%E6%BA%90%E6%BC%8F%E6%B4%9E.md) - [大厂技术研发规范](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E7%A0%94%E5%8F%91%E8%A7%84%E8%8C%83/%E5%A4%A7%E5%8E%82%E6%8A%80%E6%9C%AF%E7%A0%94%E5%8F%91%E8%A7%84%E8%8C%83.md) - [各地互联网公司盘点](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E5%90%84%E5%9C%B0%E4%BA%92%E8%81%94%E7%BD%91%E5%85%AC%E5%8F%B8%E7%9B%98%E7%82%B9.md) - 面试真题&面经分享 - [阿里巴巴](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E9%9D%A2%E8%AF%95%E7%9C%9F%E9%A2%98%26%E9%9D%A2%E7%BB%8F%E5%88%86%E4%BA%AB/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4%E9%9D%A2%E8%AF%95%E9%A2%98.md) - [字节跳动](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E9%9D%A2%E8%AF%95%E7%9C%9F%E9%A2%98%26%E9%9D%A2%E7%BB%8F%E5%88%86%E4%BA%AB/%E5%AD%97%E8%8A%82%E8%B7%B3%E5%8A%A8%E9%9D%A2%E8%AF%95%E9%A2%98.md) - [拼多多](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E9%9D%A2%E8%AF%95%E7%9C%9F%E9%A2%98%26%E9%9D%A2%E7%BB%8F%E5%88%86%E4%BA%AB/%E6%8B%BC%E5%A4%9A%E5%A4%9A%E9%9D%A2%E8%AF%95%E9%A2%98.md) - [哔哩哔哩](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E9%9D%A2%E8%AF%95%E7%9C%9F%E9%A2%98%26%E9%9D%A2%E7%BB%8F%E5%88%86%E4%BA%AB/bilibili.md) - [小红书](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E9%9D%A2%E8%AF%95%E7%9C%9F%E9%A2%98%26%E9%9D%A2%E7%BB%8F%E5%88%86%E4%BA%AB/%E5%B0%8F%E7%BA%A2%E4%B9%A6.md) - [京东](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E9%9D%A2%E8%AF%95%E7%9C%9F%E9%A2%98%26%E9%9D%A2%E7%BB%8F%E5%88%86%E4%BA%AB/%E4%BA%AC%E4%B8%9C.md) - [百度](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E9%9D%A2%E8%AF%95%E7%9C%9F%E9%A2%98%26%E9%9D%A2%E7%BB%8F%E5%88%86%E4%BA%AB/%E7%99%BE%E5%BA%A6.md) - [美团](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E9%9D%A2%E8%AF%95%E7%9C%9F%E9%A2%98%26%E9%9D%A2%E7%BB%8F%E5%88%86%E4%BA%AB/%E7%BE%8E%E5%9B%A2.md) - [网易](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E9%9D%A2%E8%AF%95%E7%9C%9F%E9%A2%98%26%E9%9D%A2%E7%BB%8F%E5%88%86%E4%BA%AB/%E7%BD%91%E6%98%93.md) - [腾讯](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E9%9D%A2%E8%AF%95%E7%9C%9F%E9%A2%98%26%E9%9D%A2%E7%BB%8F%E5%88%86%E4%BA%AB/%E8%85%BE%E8%AE%AF%E9%9D%A2%E8%AF%95%E9%A2%98.md) - [国企](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E9%9D%A2%E8%AF%95%E7%9C%9F%E9%A2%98%26%E9%9D%A2%E7%BB%8F%E5%88%86%E4%BA%AB/%E5%9B%BD%E4%BC%81.md) - [外企](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E9%9D%A2%E8%AF%95%E7%9C%9F%E9%A2%98%26%E9%9D%A2%E7%BB%8F%E5%88%86%E4%BA%AB/%E5%A4%96%E4%BC%81.md) - [校招](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E9%9D%A2%E8%AF%95%E7%9C%9F%E9%A2%98%26%E9%9D%A2%E7%BB%8F%E5%88%86%E4%BA%AB/%E6%A0%A1%E6%8B%9B%E9%9D%A2%E8%AF%95%E9%A2%98.md) - 社招 - [其他](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E9%9D%A2%E8%AF%95%E7%9C%9F%E9%A2%98%26%E9%9D%A2%E7%BB%8F%E5%88%86%E4%BA%AB/%E5%85%B6%E4%BB%96.md) - 职场杂谈 - 程序人生系列 - [成长经历](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E7%A8%8B%E5%BA%8F%E4%BA%BA%E7%94%9F/%E6%88%90%E9%95%BF%E7%BB%8F%E5%8E%86.md) - [职场经历](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E7%A8%8B%E5%BA%8F%E4%BA%BA%E7%94%9F/%E8%81%8C%E5%9C%BA%E7%BB%8F%E5%8E%86.md) - [自媒体经历](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E7%A8%8B%E5%BA%8F%E4%BA%BA%E7%94%9F/%E8%87%AA%E5%AA%92%E4%BD%93%E7%BB%8F%E5%8E%86.md) - [生活趣事](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E7%A8%8B%E5%BA%8F%E4%BA%BA%E7%94%9F/%E7%94%9F%E6%B4%BB%E8%B6%A3%E4%BA%8B.md) - [读者经历](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E7%A8%8B%E5%BA%8F%E4%BA%BA%E7%94%9F/%E8%AF%BB%E8%80%85%E7%BB%8F%E5%8E%86.md) - [过年特辑](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E7%A8%8B%E5%BA%8F%E4%BA%BA%E7%94%9F/%E8%BF%87%E5%B9%B4%E7%89%B9%E8%BE%91.md) - [科普](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E7%A7%91%E6%99%AE.md) - [人物&杂谈](https://github.com/AobingJava/JavaFamily/blob/master/docs/all/%E4%BA%BA%E7%89%A9%26%E6%9D%82%E8%B0%88.md) - [AI工具](https://juejin.cn/post/7389069052436217896#comment) - **福利** - [Java/后端学习路线](https://mp.weixin.qq.com/s/5QpuDtXAalR-pz59B5t27g) - [Java/后端学习路线 2.0优化版本](https://mp.weixin.qq.com/s/QrRVMp6z7HjZA4trsga_cg) - [整理的书单(附个人喜欢的文学书)](https://mp.weixin.qq.com/s/Wod2cGjGkGeB0iLVAqpksQ) - [敖丙大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了](https://mp.weixin.qq.com/s/7NS452k5hVPW0dUQ-oTi-A) - [整理好用的工具集](https://mp.weixin.qq.com/s/WYiXHVJ-p1sZAf4jb5gIXg) - [通用的学习方法](https://mp.weixin.qq.com/s/JX72OoiNrZ9R0DTuOOtcoA) - [IDEA破解(请勿传播)](https://github.com/AobingJava/JavaFamily/blob/master/docs/idea/idea.md) - [电子书(请勿传播)](https://github.com/AobingJava/JavaFamily/blob/master/docs/idea/%E7%94%B5%E5%AD%90%E4%B9%A6.md) - [面试资料(持续更新)](https://github.com/AobingJava/JavaFamily/blob/master/docs/idea/%E8%B5%84%E6%96%99.md) - [简历模板(欢迎补充)](https://github.com/AobingJava/JavaFamily/blob/master/docs/idea/%E8%B5%84%E6%96%99.md) - [概要设计模板](https://github.com/AobingJava/JavaFamily/blob/master/docs/idea/%E8%B5%84%E6%96%99.md) - [5分钟白嫖敖丙常用的免费效率软件/工具!](https://mp.weixin.qq.com/s/2_hM5Z9IMLIRQ2QEPTABcQ) 所有文章pdf版本 : 链接:https://pan.baidu.com/s/1PKO0LDspwJPNqT6qwqNorQ 密码:f654 ### 阿里、字节、快手、腾讯、美团、滴滴内推 ao_bing@foxmail.com ![](https://tva1.sinaimg.cn/large/00831rSTly1gck2pplt8ej315u0u0k1b.jpg) ## Star History Star History Chart # 祝福 希望大家都能找到心仪的工作,学习是一条时而郁郁寡欢,时而开怀大笑的路,加油。 如果你通过努力成功进入到了心仪的公司,一定不要懈怠放松,职场成长和新技术学习一样,不进则退。 敖丙在工作中发现我身边的人真的就是实力越强的越努力,**最高级的自律,享受孤独**。 ================================================ FILE: docs/all/Java必会基础与新版本特性.md ================================================ [枚举](https://mp.weixin.qq.com/s/U5FkL9zyzr0PkAp8MJJ8BQ) [从String中移除空白字符的多种方式!?差别竟然这么大!](https://mp.weixin.qq.com/s/Du2huBEkI7IR3noPeK_67g) [双亲委派原则](https://mp.weixin.qq.com/s/6nJ-6cDLW6TfysWV5ZB3Iw) [Java 16 新特征,真香!](https://mp.weixin.qq.com/s/-NQoKpBTXwGUxd2hUbCU2Q) ================================================ FILE: docs/all/db/MySQL基础知识.md ================================================ [国庆肝了8天整整2W字的数据库知识点](https://mp.weixin.qq.com/s/J3kCOJwyv2nzvI0_X0tlnA) [MySQL大表怎么DDL变更](https://mp.weixin.qq.com/s/pinOFeF09orQCnIp4L6XyA) [MySql主从复制,从原理到实践!](https://mp.weixin.qq.com/s/eEWMSTAUF1H-gFBx26jujw) [MySQL查询缓存](https://mp.weixin.qq.com/s/LZBctWNWi3qehb-dgUCmxQ) [MySQL 的 InnoDB 存储引擎是怎么设计的?](https://mp.weixin.qq.com/s/wr2gJGQSA8QH_lmPh1XOkw) [你怎么连模糊匹配like %%怎么优化都不知道](https://mp.weixin.qq.com/s/ygvuP35B_sJAlBHuuEJhfg) [数据库基础知识](https://mp.weixin.qq.com/s/NDL1Q6nqdPq5oMBWSpq4ug) [MySQL面试夺命20问](https://mp.weixin.qq.com/s/vwHkXGNCdRdx8k7BeBMy9w) [mysql 的一行记录是怎么存储的?](https://mp.weixin.qq.com/s/3d66-yXVZoDFRG1wyRw7kA) [MySQL的性能到底有多强?](https://mp.weixin.qq.com/s/Chsfldp_BUNOFFCoCPN-ZQ) [MySql 35卷](https://mp.weixin.qq.com/s/MaVYENapeJcLNpYcR7tqBQ) [为什么 MySQL 喜欢 B+ 树?](https://mp.weixin.qq.com/s/AoPq8poENF9T4mVS1fDFPw) ================================================ FILE: docs/all/db/事务特性、隔离级别、数据安全.md ================================================ [MySQL安全方案](https://mp.weixin.qq.com/s/rQDitOOnLpLEoj8M11NHwg) [数据库连接池到底应该设多大?这篇文章可能会颠覆你的认知](https://mp.weixin.qq.com/s/dQFSrXEmgBMh1PW835rlwQ) [数据库设计](https://mp.weixin.qq.com/s/yo_LJ6IwGnjiBXSA7ZHdOA) [漫话:如何给女朋友解释什么是撞库、脱库和洗库?](https://mp.weixin.qq.com/s/L0XUMHInnwN9gSYGH2nzdg) [MVCC和事务隔离级别的关系](https://mp.weixin.qq.com/s/0-YEqTMd0OaIhW99WqavgQ) [MySQL事务与MVCC如何实现的隔离级别](https://mp.weixin.qq.com/s/CZHuGT4sKs_QHD_bv3BfAQ) [数据库事务](https://mp.weixin.qq.com/s/iFmvvt4DJ-_qFeb0XUh6QA) [MySQL 默认隔离级别是RR,为什么阿里等大厂会改成RC?](https://mp.weixin.qq.com/s/mIz0T0v68_dvUgCrj-qdug) ================================================ FILE: docs/all/db/分库分表.md ================================================ [我们为什么要分库分表?](https://mp.weixin.qq.com/s/-Jipxjwe-jAax4hJSe-9Jg) [分库分表方案](https://mp.weixin.qq.com/s/dMqXBW6W8DeqfAPvko3ViQ) ================================================ FILE: docs/all/db/数据库性能调优.md ================================================ [为什么MySQL不建议使用delete删除数据?](https://mp.weixin.qq.com/s/7dpNkLaglIyb_9DKdH43eQ) [工作以来总结的大厂SQL调优姿势](https://mp.weixin.qq.com/s/nEmN4S9JOTVGj5IHyfNtCw) [为啥阿里巴巴不建议MySQL使用Text类型?](https://mp.weixin.qq.com/s/oVjm_iLvbkximBjHv9d8ig) [用对了这些场景下的索引,技术总监夸我棒](https://mp.weixin.qq.com/s/-gmAPfiKMNJgHhIZqR2C4A) [MySQL索引凭什么让查询效率提高这么多?](https://mp.weixin.qq.com/s/qESZSzHoxUKQRJhb1EQA_Q) [MySQL调优](https://mp.weixin.qq.com/s/e0CqJG2-PCDgKLjQfh02tw) ================================================ FILE: docs/all/db/数据库面试题.md ================================================ [innodb是如何插入数据的?](https://mp.weixin.qq.com/s/SqSPxSRslkjUcDasBHGRSQ) [数据库自增ID用完了会怎么样?](https://mp.weixin.qq.com/s/qEA1pC2pfh3xz9HuM8iIBg) [阿里面试:说说一致性读实现原理?](https://mp.weixin.qq.com/s/qHzb6oPrrbAPoIlfLJVNAg) [我说 SELECT COUNT(*) 会造成全表扫描,面试官让我回去等通知](https://mp.weixin.qq.com/s/SNRvdmyS57oWS_CyYKVvSA) [原来MySQL面试还会问这些(undo log)](https://mp.weixin.qq.com/s/Lx4TNPLQzYaknR7D3gmOmQ) [explain](https://mp.weixin.qq.com/s/izOKK9Ft5wLts8hWIo4ODQ) [你说说一条更新SQL的执行过程?](https://mp.weixin.qq.com/s/-5N6eg1yMBUvDMbJOXp0eg) [一条SQL语句执行得很慢的原因有哪些?](https://mp.weixin.qq.com/s/YKmFEtHcZPBn1S9so0kxYw) [数据库的锁,到底锁的是什么?](https://mp.weixin.qq.com/s/mvG0wVr2kpbM8iqfZnimiQ) ================================================ FILE: docs/all/db/索引、锁机制.md ================================================ [数据库索引](https://mp.weixin.qq.com/s/_9rDde9wRYoZeh07EASNQQ) [一口气搞懂MySQL索引所有知识点](https://mp.weixin.qq.com/s/faOaXRQM8p0kwseSHaMCbg) [你都是如何设计索引的?](https://mp.weixin.qq.com/s/fShA7jxjshKyHEHfVDrLVA) [MySQL的索引是怎么加速查询的?](https://mp.weixin.qq.com/s/7TPVOT7sloDUKmhldf9uvg) [索引下推](https://mp.weixin.qq.com/s/87qsrj-_hG54uxcOlFr35Q) [MySQL 的全局锁、表锁和行锁](https://mp.weixin.qq.com/s/1LGJjbx_n_cvZndjM3R8mQ) [聊聊索引失效?](https://mp.weixin.qq.com/s/WnO_4SoEL6jugkxPHW4KCg) ================================================ FILE: docs/all/jvm/垃圾回收器、垃圾回收算法.md ================================================ [垃圾回收底层原理](https://mp.weixin.qq.com/s/nY6vL5MlUXY1lfnIvNHMnw) ================================================ FILE: docs/all/jvm/垃圾回收机制.md ================================================ [看完这篇垃圾回收,和面试官扯皮没问题了](https://mp.weixin.qq.com/s/_AKQs-xXDHlk84HbwKUzOw) ================================================ FILE: docs/all/jvm/性能调优、线上问题排查.md ================================================ [线上服务的FGC问题排查,看这篇就够了!](https://mp.weixin.qq.com/s/P8s3kuceBNovUP5adXpFCQ) [记一次大促期间JVM堆外内存泄漏故障排查记录](https://mp.weixin.qq.com/s/yutHXOi6Xl3-Qn91Pvg9wA) [怎么排查堆内存溢出啊?](https://mp.weixin.qq.com/s/7XGD-Z3wrThv5HyoK3B8AQ) [CPU100%,排查](https://mp.weixin.qq.com/s/roEMz-5tzBZvGxbjq8NhOQ) [排查YGC问题](https://mp.weixin.qq.com/s/LRx9tLtx1tficWPvUWUTuQ) [CPU飙高排查](https://mp.weixin.qq.com/s/nWghy4McYx6Ix3QPSLSmkQ) ================================================ FILE: docs/all/jvm/深入浅出JVM.md ================================================ [【JVM故事】了解JVM的结构,好在面试时吹牛](https://mp.weixin.qq.com/s/fit90VdZUa2pG9lbET0i7w) [Java堆内存是线程共享的!面试官:你确定吗?](https://mp.weixin.qq.com/s/Wws24Fhg1nH4dHvtcFYi2g) [JVM](https://mp.weixin.qq.com/s/0XqhneKz7F5A-PE9CdzyoA) [面试系列重启:JVM篇](https://mp.weixin.qq.com/s/FEPtidbx7WKz6LbhoerRcA) ================================================ FILE: docs/all/jvm/类加载机制详解.md ================================================ [JVM必问知识点:类加载过程](https://mp.weixin.qq.com/s/eHqFONXXNc-LD4ugaKM6UA) ================================================ FILE: docs/all/line.md ================================================ ![](https://tva1.sinaimg.cn/large/0082zybply1gcb2u3keh9j30p02j4h2r.jpg) ![](https://tva1.sinaimg.cn/large/007S8ZIlgy1gf8flovpg1j30u07l7hdx.jpg) ================================================ FILE: docs/all/mq/RocketMQ.md ================================================ [RocketMQ](https://mp.weixin.qq.com/s/y-4TVwbc7AFGEA7q-_OkYw) ================================================ FILE: docs/all/mq/kafka.md ================================================ [Kafka架构与原理](https://mp.weixin.qq.com/s/-IPfWPS1WQMEgcIu0Ak2VQ) [Kafka 架构设计](https://mp.weixin.qq.com/s/8wfZEsNDpeLr-_uu2CawFw) [Kafka性能篇:为何Kafka这么"快"?](https://mp.weixin.qq.com/s/kMIhPW2uLdy-mgS9sF6agw) [Kafka 精妙的高性能设计(上篇)](https://mp.weixin.qq.com/s/kImrkVLE4dtpVnb-Yp479Q) [Kafka 精妙的高性能设计(下篇)](https://mp.weixin.qq.com/s/YJFltTP4J5si1Z5SbuMUJw) [kafka夺命连环11问](https://mp.weixin.qq.com/s/sFUvgaQUXSA8b4hshhbwOQ) ================================================ FILE: docs/all/mq/重复消费、顺序消费、分布式事务.md ================================================ > 你知道的越多,你不知道的越多 > 点赞再看,养成习惯 > **GitHub**上已经开源 [https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily) 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和完善 ## 前言 **消息队列**在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在**消息队列**的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸,打败了无数竞争对手,每次都只能看到无数落寞的身影失望的离开,略感愧疚(**请允许我使用一下夸张的修辞手法**)。 于是在一个寂寞难耐的夜晚,**暖男**我痛定思痛,决定开始写**《吊打面试官》**系列,希望能帮助各位读者以后面试势如破竹,对面试官进行360°的反击,吊打问你的面试官,让一同面试的同僚瞠目结舌,疯狂收割大厂Offer! ## 捞一下 上一期,简单的介绍了一下**消息队列**的基础知识,里面有消息队列的应用场景,以及使用之后可能带来的问题,但是上期没对怎么解决这些问题做回答,因为要控制篇幅嘛(明明是自己觉得MQ写不了多少期,要多怼一期出来!渣男) 咳咳,我们言归正传,没看的朋友去看一下,有助于这期的阅读: [《吊打面试官》系列-消息队列基础](https://juejin.im/post/5dd3ff85e51d453fe34dfcc5) ## 面试开始 >一个风度翩翩,穿着格子衬衣的中年男子,拿着一个满是划痕的mac向你走来,看着铮亮的头,心想着肯定是尼玛顶级架构师吧!但是我们看过暖男敖丙的系列,腹有诗书气自华,虚都不虚。 ![](https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1573833391430&di=f71f2ee36285f2bd553423b29d9a9ff9&imgtype=0&src=http%3A%2F%2Fpic4.zhimg.com%2Fv2-f698be82de32b998da130d425287b797_b.jpg) ### 没错小伙子还是我,上次话说一半你就溜了,这次我非得好好的问问你。 好的面试官,因为上次着急,敖丙的系列更新了所以赶回家去看了! ### 我信你个鬼,我们开始吧,上次说到了消息队列的消息重复消费,你能跟我介绍这是怎么样子的场景么? 消息**重复消费**是使用消息队列之后,必须考虑的一个问题,也是比较严重和常见的问题,**帅丙**我在开发过程中,但凡用到了消息队列,我第一时间考虑的就是**重复消费**的问题。 就比如有这样的一个场景,用户下单成功后我需要去一个活动页面给他加**GMV**(销售总额),最后根据他的GMV去给他发奖励,这是电商活动很常见的玩法。 类似累计下单金额到哪个梯度给你返回什么梯度的奖励这样。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g98cyh5oboj30a00jgqba.jpg) 我只能告诉你这样的活动页面**10000%**是用**异步**去加的(别问我为什么,因为这个活动的后端是敖丙我做的😂),不然你想,你一个用户下一单就给他加一下,那就意味着对那张表就要操作一下,你考虑下双十一当天多少次对这个表的操作?这数据库或者缓存都顶不住吧。 而且大家应该也有这样的体会,你下单了马上去看一些活动页面,有时候马上就有了,有时候却延迟有很久,为啥?这个速度**取决于消息队列的消费速度**,消费慢堵塞了就迟点看到呗。 你下个单**支付成功**你就发个消息出去,我们上面那个活动的开发人员就**监听**你的**支付成功消息**,我监听到你这个订单成功支付的消息,那我就去我活动GMV表里给你加上去,听到这里大家可能**觉得顺理成章**。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g982pptuarj30hz0cwmxs.jpg) **但是**我告诉大家一般消息队列的使用,我们都是有**重试机制**的,就是说我下游的业务发生异常了,我会抛出异常并且要求你**重新发一次**。 我这个活动这里发生错误,你要求重发肯定没问题。但是大家**仔细想一下**问题在哪里? 是的,不止你一个人监听这个消息啊,**还有别的服务也在监听**,他们也会失败啊,他一失败他也要求重发,但是你这里其实是成功的,重发了,你的钱不就加了两次了? **对不对???是不是这个道理???** 还不理解?看下面 **↓** ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g982ss9ku2j30ir0gcjs7.jpg) 就好比上面的这样,我们的**积分系统处理失败**了,他这个系统肯定要求你**重新发送**一次这个消息对吧,积分的系统重新接收并且处理成功了,但是别人的活动,优惠券等等服务**也监听了这个消息**呀,那不就可能出现活动系统给他加GMV加两次,优惠券扣两次这种情况么? 真实的情况其实重试是很正常的,服务的**网络抖动**,**开发人员代码Bug**,还有**数据问题**等都可能处理失败要求重发的。 ### 嗯小伙子分析得很仔细嘛,那你在开发过程中是怎么去保证的呀? 一般我们叫这样的处理叫接口**幂等**。 > **幂等(idempotent、idempotence)**是一个数学与计算机学概念,常见于抽象代数中。 > > 在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。 > > 幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。 > > 例如,“setTrue()”函数就是一个幂等函数,**无论多次执行,其结果都是一样的.**更复杂的操作幂等保证是利用唯一交易号(流水号)实现. 通俗了讲就是你**同样的参数调用我这个接口,调用多少次结果都是一个**,你加GMV同一个订单号你加一次是多少钱,你加N次都还是多少钱。 但是如果**不做幂等**,你一个订单调用多次钱不就加多次嘛,同理你退款调用多次钱也就减多次了。 大致处理流程如下: ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g9831ucfapj309e0j5dgs.jpg) ### 那怎么保证呢? 一般**帅丙**我是这么回答的: 帅气面试官您好,一般**幂等**,我会**分场景去考虑**,看是**强校验**还是**弱校验**,比如跟金钱相关的场景那就很关键呀,就做强校验,别不是很重要的场景做弱校验。 #### 强校验: 比如你监听到用户支付成功的消息,你监听到了去加GMV是不是要调用加钱的接口,那加钱接口下面再调用一个加流水的接口,**两个放在一个事务,成功一起成功失败一起失败**。 每次消息过来都要拿着**订单号+业务场景这样的唯一标识**(比如天猫双十一活动)去流水表查,看看有没有这条流水,有就直接return不要走下面的流程了,没有就执行后面的逻辑。 之所以用**流水表**,是因为涉及到金钱这样的活动,有啥问题后面也可以去流水表**对账**,还有就是帮助开发人员定位问题。 有的小伙伴可能还是有点懵,然后**人才交流群**的小伙伴也说有些例子可以放一点伪代码,那这期开始能用代码将的我也写点。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g983n2pvocj30lp0fp417.jpg) **Tip**:**GItHub** [https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily) 上有进群方式和个人联系方式,说实话在这个群,哪怕您不说话,光看聊天记录,都能学到东西(美团王炸,三歪(Java3y),并夕夕等的大佬都在)。 #### 弱校验: 这个简单,一些不重要的场景,比如给谁发短信啥的,我就把这个id+场景唯一标识作为**Redis**的key,放到缓存里面失效时间看你场景,**一定时间内**的这个消息就去Redis判断。 用KV就算消息丢了可能这样的场景也没关系,反正丢条**无关痛痒**的通知短信嘛(你敢说你没验证码短信丢失的情况?)。 还有很多公司的弱校验用**token**啊什么的,反正花样很多,但是**重要的场景一定要强校验**,真正查问题的时候没有在磁盘持久化的数据,心里还是空空的,就像你和女朋友分开的时候的心里状态一样。(我单身的怎么知道这种感觉?猜的) ### 你们有接触过消息顺序消费这样的场景么?你怎么保证的? 没有!over! 乖,你肯定不能说没有啊,就是算真的没有,你看过**敖帅丙**的文章都要说有! **Tip**:但是说实话**顺序消费**这里很难介绍,我上周到这周问了很多身边的师兄开发过程中这样的场景不多,我跟三歪也讨论了几次,网上更多的都是介绍binlog的同步,好像更多的场景就没了。 一般都是**同个业务场景下不同几个操作的消息同时过去**,本身顺序是对的,但是你发出去的时候同时发出去了,消费的时候却乱掉了,这样就有问题了。 我之前做电商活动也是有这样的例子,我们都知道数据量大的时候数据同步压力还是很大的,有时候数据量大的表需要同步几个亿的数据。(并不是主从同步,主从延迟大的话会有问题,可能是从数据库或者主数据库同步到**备库**) 这种情况我们都是怼到队列里面去,然后慢慢消费的,那问题就来了呀,我们在数据库同时对一个Id的数据进行了增、改、删三个操作,但是你消息发过去消费的时候变成了改,删、增,这样数据就不对了。 本来一条数据应该删掉了,结果在你那却还在,这不是**出大问题**! ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g91aa7fdi0j30fl093aaa.jpg) 两者的结果是不是完全不一样了 **↑** ### 那你怎么解决呢? 我简单的说一下我们使用的**RocketMQ**里面的一个简单实现吧。 **Tip**:为啥用**RocketMQ**举例呢,这玩意是阿里开源的,我问了下身边的朋友很多公司都有使用,所以读者大概率是这个的话我就用这个举例吧,具体的细节我后面会在**RocketMQ**和**Kafka**各自章节说到。 生产者消费者一般需要保证顺序消息的话,可能就是一个业务场景下的,比如订单的创建、支付、发货、收货。 那这些东西是不是一个订单号呢?一个订单的肯定是一个订单号的说,那简单了呀。 **一个topic下有多个队列**,为了保证发送有序,**RocketMQ**提供了**MessageQueueSelector**队列选择机制,他有三种实现: ![](https://img-blog.csdnimg.cn/20181128124324615.png) 我们可使用**Hash取模法**,让同一个订单发送到同一个队列中,再使用同步发送,只有同个订单的创建消息发送成功,再发送支付消息。这样,我们保证了发送有序。 **RocketMQ**的topic内的队列机制,可以保证存储满足**FIFO**(First Input First Output 简单说就是指先进先出),剩下的只需要消费者顺序消费即可。 **RocketMQ**仅保证顺序发送,顺序消费由消费者业务保证!!! 这里很好理解,一个订单你发送的时候放到一个队列里面去,你同一个的订单号Hash一下是不是还是一样的结果,那肯定是一个消费者消费,那顺序是不是就保证了? 真正的顺序消费不同的中间件都有自己的不同实现我这里就举个例子,大家思路理解下。 **Tip**:我写到这点的时候人才群里也有人问我,一个队列有序出去,一个消费者消费不就好了,我想说的是**消费者是多线程**的,你消息是有序的给他的,你能保证他是有序的处理的?还是一个消费成功了再发下一个**稳妥**。 ### 你能跟我聊一下分布式事务么? **分布式事务**在现在遍地都是分布式部署的系统中几乎是必要的。 我们先聊一下啥是**事务**? **分布式事务**、**事务隔离级别**、**ACID**我相信大家这些东西都耳熟能详了,那什么是事务呢? #### 概念: > **一般是指要做的或所做的事情。** > > 在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。 > > 事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序用户程序的执行所引起,并用形如**begin transaction**和**end transaction**语句(或函数调用)来界定。 > > 事务由事务开始(**begin transaction**)和事务结束(**end transaction**)之间执行的全体操作组成。 #### 特性: > 事务是恢复和并发控制的基本单位。 > > 事务应该具有4个属性:**原子性、一致性、隔离性、持久性**。这四个属性通常称为**ACID特性**。 > > **原子性(atomicity)**:一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。 > > **一致性(consistency)**:事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。 > > **隔离性(isolation)**:一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。 > > **持久性(durability)**:**持久性也称永久性(permanence)**,指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。 那有同学还是不理解,敖丙我总结了一下就是:**事务就是一系列操作,要么同时成功,要么同时失败。**然后会从事务的 **ACID** 特性**(原子性、一致性、隔离性、持久性)展开叙述**。 事务就是为了保证一系列操作可以正常执行,它必须同时满足 **ACID** 特性。 ### 那什么是分布式事务呢? 大家可以想一下,你下单流程可能涉及到10多个环节,你下单付钱都成功了,但是你优惠券扣减失败了,积分新增失败了,前者公司会被薅羊毛,后者用户会不开心,但是**这些都在不同的服务怎么保证大家都成功呢**? 聪明,**分布式事务**,你看你都会抢答了! **Tip**:真实的应用场景可能比我介绍的场景复杂数倍,我只是为了举例方便一下大家理解所以用了很简单的例子。 我接触和了解到的分布式事务大概分为: - 2pc(两段式提交) - 3pc(三段式提交) - TCC(Try、Confirm、Cancel) - 最大努力通知 - XA - 本地消息表(ebay研发出的) - 半消息/最终一致性(RocketMQ) 这里我就介绍下最简单的**2pc(两段式)**,以及大家以后可能比较常用的**半消息事务**也就是**最终一致性**,目的是让大家理解下分布式事务里面**消息中间件的作用**,别的事务都大同小异,都有很多优点。 当然也都有**种种弊端**: 例如**长时间锁定数据库资源**,导致系统的**响应不快**,**并发上不去**。 网络抖动出现**脑裂**情况,导致事物参与者,不能很好地执行协调者的指令,导致**数据不一致**。 **单点故障**:例如事物协调者,在某一时刻宕机,虽然可以通过选举机制产生新的Leader,但是这过程中,必然出现问题,而TCC,只有强悍的技术团队,才能支持开发,**成本太高**。 不多BB了,我们开始介绍这个两个事物吧。 **2pc(两段式提交)** : ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g98xqtg1ibj30l40in400.jpg) **2pc(两段式提交)**可以说是分布式事务的最开始的样子了,像极了**媒婆**,就是通过消息中间件协调多个系统,在两个系统操作事务的时候都锁定资源但是不提交事务,等两者都准备好了,告诉消息中间件,然后再分别提交事务。 **但是我不知道大家看到问题所在没有?** 是的你可能已经发现了,如果A系统事务提交成功了,但是B系统在提交的时候网络波动或者各种原因提交失败了,其实还是会失败的。 **最终一致性**: ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g98a8jg8ipj31ds0oiaff.jpg) 整个流程中,我们能保证是: - 业务主动方本地事务提交失败,业务被动方不会收到消息的投递。 - 只要业务主动方本地事务执行成功,那么消息服务一定会投递消息给下游的业务被动方,并最终保证业务被动方一定能成功消费该消息(消费成功或失败,即最终一定会有一个最终态)。 不过呢技术就是这样,**各种极端的情况我们都需要考虑**,也很难有完美的方案,所以才会有这么多的方案**三段式**、**TCC**、**最大努力通知**等等分布式事务方案,大家只需要知道为啥要做,做了有啥好处,有啥坏处,在实际开发的时候都注意下就好好了,**系统都是根据业务场景设计出来的,离开业务的技术没有意义,离开技术的业务没有底气**。 还是那句话:**没有最完美的系统,只有最适合的系统。** ##面试结束 ### 小伙子看不出来啊,还是有点东西的嘛,这几个点都回答的不错,明天你能跟我聊一下RocketMQ么? 敖丙这章花了这么多时间,不确定他写不写的完,心疼他。好想给他**点赞**啊,**消息回溯**也在单独介绍消息中间件的时候介绍吧,这章篇幅有点长了。 ## 总结 这章其实我写的时间**比之前的秒杀还要久**,因为**顺序消息这个场景**我不知道怎么讲出来大家容易懂一点,最后就参考了网上的,顺序消息的实际应用场景没别的那么广泛,跟3y也聊了好几次,最后定了这个binlog的场景。 总之就是**这期创作源泉有点枯竭**,这章是真的难写,包括分布式事务在实际开发过程中也是很复杂的环节,需要用的时候光是做设计都要很久,反正我的流程图长得一匹。 我每次都想着写得**通俗易懂**一点,这篇即使是这样我觉得还是不够通俗易懂,但是消息的场景就是这样,还有大家加我也不要一上来就问我很多扣细节的点,**自己多点思考我觉得可能帮助比我告诉你答案好很多吧**? ## 絮叨 敖丙我呀,这周**有牌面**哟,上了**CSDN**的原力计划榜单,而且奖金高达50块!!! ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g98aiqhe8yj30ul01maa5.jpg) 钱不多但是很开心,跟老妈聊到她也觉得我出息了,刚好她生日,以前我们这一家人就是那种不过生日的,不过呀今年我工作了,而且**有牌面**的我拿了的奖金就很关键,偷偷叫表弟悄悄去给她买了蛋糕和礼物🎁,嘻嘻,开心。🎂 ### DISS ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8zza7rjn5j30o902lwes.jpg) 这是**博客园的一个网友**在我文章下面的评论,说实话不知道**大家怎么看**的,我只想说:呵呵!傻* 我不知道这个多年的经验到底是怎么样子的多年的经验,我本来其实不准备说出来的,因为我发现我群里很多都是还没毕业的**大学生**或者**应届生**,那就假设我读者还有很多这样的学生,他们都**没社会经验**我怕他们被这样的人给误导了。 我记得我在群里说过: ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g98b32sxw3j30vw0gw0vv.jpg) 我可以80%肯定的告诉大家他这个观点就是扯淡,还有那20%我是**认同他的谦虚那个观点**,但是**谦虚难道不应该是我们对待事物最基本的态度嘛?** 但是**面试装傻**这个观点?还有什么**不会要比你强的人**这个观点?技术人我相信也有面试官也在看我的文章,你们在面试的时候,我想遇到厉害的人巴不得招入麾下,为自己冲锋陷阵吧。 而且**正常面试**的时候你是1-3年的经验,面试你的基本上都是3年以上的,然后依次顺推,当然也有很多很厉害的Leader(我前东家Leader95年的,字节跳动某产品线很强的Leader96的等等)等大家工作了你就会发现有些东西**没有时间积累**是学不到的,你要做的只是一步一个脚印踏实走好就好了。 那些人不管年轻与否能坐在那面试你**肯定有他的原因**,那你有什么才华,你**尽情施展**,他没那个度量包容你的优秀,这样的公司不去也罢,但是技术人这样的真的很少,程序员是一群很崇拜能力的人。 所以**面试你有啥都秀出来,把你的才华尽情的展示出来,风就在那,你只管飞翔。** ## 鸣谢 涉及到分布式事务的环节我参考了前大神同事:**鲁班**(花名)的技术分享,很感谢他的文章给的思路,还有问题的解析! ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g98uvqyf90j30xa0gstcx.jpg) 每次写我都会在群里问大家,下次大家都在我的交流群里面也可以多给我点意见,谢谢了。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g98uw3kh4kj30vo0l0wjt.jpg) 看到没,就很民主。(敖丙你个渣男,呸,自己不会就不写!) **Tip**: **GItHub** [https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily) 上有进群方式和个人联系方式,说实话在这个群,哪怕您不说话,光看聊天记录,都能学到东西(美团王炸,三歪(Java3y),并夕夕等的大佬都在)。 ## 日常求赞 好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是**人才**。 我每周都会更新几篇《吊打面试官》系列和互联网常用技术栈相关的文章,非常感谢**人才**们能看到这里,如果这个文章写得还不错,觉得「敖丙」我**有点东西**的话 **求点赞👍** **求关注❤️** **求分享👥** 对暖男我来说真的 **非常有用**!!! 创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见! 敖丙 | 文 【原创】【转载请联系本人】 如果本篇博客有任何错误,请批评指教,不胜感激 ! ------ > 《吊打面试官》系列每周持续更新,可以关注我的公众号「 **JavaFamily** 」第一时间阅读和催更(公众号比博客早一到两篇哟),本文**GitHub**上已经收录[https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily),有一线大厂面试点思维导图,欢迎Star和完善,里面也有我个人联系方式有什么问题也可以直接找我,也有人才交流群,我们一起有点东西。 ![](https://user-gold-cdn.xitu.io/2019/11/16/16e7340546a49ea9?w=900&h=500&f=png&s=201521) ================================================ FILE: docs/all/人物&杂谈.md ================================================ [罗永浩](https://mp.weixin.qq.com/s/FUbxHFAQeUgV59Zhp7Fe0w) [俞敏洪](https://mp.weixin.qq.com/s/Udd3B4L-94hH9ggEtOcJAw) [远方是门票机酒,前方是山川大海](https://mp.weixin.qq.com/s/RasTw7_XpxZoDP5k2bpz0w) [门户前浪退市,从此只做“新浪”](https://mp.weixin.qq.com/s/lt_RxXC_OAl7aezCkmSyyg) [“小破站”二次上市 - ( ゜- ゜)つロ 乾杯~](https://mp.weixin.qq.com/s/a4CzPbx5Bim6mFzzqq0vrA) [我们在努力成为恒星](https://mp.weixin.qq.com/s/s2xcFud-8IJq7MpgO1QSHA) [苏宁张近东:三十年沉沉浮浮,零售史上不为人知的秘密](https://mp.weixin.qq.com/s/bTWTgiQInITy9Dv5BJ-Dgg) [陈欧,带货网红鼻祖的起起落落落落落落创业路](https://mp.weixin.qq.com/s/LyWW3tXSNMGY6MNi-HnNOg) ================================================ FILE: docs/all/各地互联网公司盘点.md ================================================ [北京有哪些牛逼的互联网公司](https://mp.weixin.qq.com/s/OcVumzBwGjX9GIkS-lGMoA) [武汉有哪些不错的互联网公司?](https://mp.weixin.qq.com/s/fhMkMMqTrAe-8Af6Jk4XAg) [杭州有哪些牛批的互联网公司](https://mp.weixin.qq.com/s/35YoYTQkehqSi_tOj1XZAg) [上海有哪些不错的互联网公司?](https://mp.weixin.qq.com/s/oBUoRuMvbhQJI5n2keIa1Q) [成都有哪些牛批的互联网公司](https://mp.weixin.qq.com/s/POFAsVr5bNz6zu-IVYVA8g) ================================================ FILE: docs/all/基础核心/io.md ================================================ [迄今为止把同步/异步/阻塞/非阻塞/BIO/NIO/AIO讲的这么清楚的好文章(快快珍藏)](https://mp.weixin.qq.com/s/EVequWGVMWV5Ki2llFzdHg) [原来 8 张图,就能学废 Reactor 和 Proactor](https://mp.weixin.qq.com/s/px6-YnPEUCEqYIp_YHhDzg) [敖丙说了这么多次 I/O,可你知道其中的原理么?](https://mp.weixin.qq.com/s/TJghsMRqkzBIsoHjGiEwFw) [「网络IO套路」当时就靠它追到女友](https://mp.weixin.qq.com/s/x-AZQO5uiuu5svIvScotzA) [IO 多路复用](https://mp.weixin.qq.com/s/CMWlDywI1zbgJSoeGTBmuw) [一次相亲经历,我彻底搞懂了什么叫阻塞非阻塞,同步异步](https://mp.weixin.qq.com/s/DEd0VY3dhR6B0hjQSEtB7Q) [让我们,从头到尾,通透I/O模型](https://mp.weixin.qq.com/s/Gb6tZl_7B3IwLYdR6Au6-w) [为什么网络 I/O 会被阻塞?](https://mp.weixin.qq.com/s/RTJRzM1R7t344w5whESYmg) ================================================ FILE: docs/all/基础核心/java基础知识.md ================================================ [Java基础面试16问](https://mp.weixin.qq.com/s/-xFSHf7Gz3FUcafTJUIGWQ) [零拷贝](https://mp.weixin.qq.com/s/FgBCop2zFfcX5ZszE0NoCQ) [面试官:详细说说你对序列化的理解](https://mp.weixin.qq.com/s/nzFBPuUGSSIGZaBbE-FkTg) [同事:你能跟我聊聊class文件么?](https://mp.weixin.qq.com/s/QgC65Ld5UCXo11xXgQ_6UA) [JAVA代码编译流程是怎样的?](https://mp.weixin.qq.com/s/q4q-jr-6NDXxkXuC2ZegJQ) ================================================ FILE: docs/all/基础核心/linux.md ================================================ [52图初探Linux通用知识](https://mp.weixin.qq.com/s/dP8AJbvGgvYIXDy3zeXCRg) [大厂面试Linux就这5个问题](https://mp.weixin.qq.com/s/24vBHgtw5efC9V9yYqknNg) [Linux 内核 vs Windows 内核](https://mp.weixin.qq.com/s/7iQ5jO_qfYbwKdM21qywYg) [学习linux命令,看这篇2w多字的命令详解就够了](https://mp.weixin.qq.com/s/7bSwKiPmtJbs7FtRWZZqpA) [Linux IO 模型](https://mp.weixin.qq.com/s/TbIPlBtkK_zCyt54cCX8dw) [Linux命令](https://mp.weixin.qq.com/s/T6try9YIKh8gTLG2lyKKOQ) [3万字Linux总结](https://mp.weixin.qq.com/s/kG1g7ghTkOMzyEoZ6tQMHQ) ================================================ FILE: docs/all/基础核心/计算机操作系统.md ================================================ [图解 | 计算机文件系统](https://mp.weixin.qq.com/s/j2msue1Hjcwd9z1U2p0TDQ) [浏览器的秘密藏在这31张图里](https://mp.weixin.qq.com/s/11MRrxmiyZybTUbjRDRubQ) [带宽、延时、吞吐率、PPS 这些都是啥?](https://mp.weixin.qq.com/s/eWHQ8co0jF_a26Xz8ZQLjg) [进程和线程基础知识全家桶,30 张图一套带走](https://mp.weixin.qq.com/s/FaHKGRI69TqDj0AJtNiVoA) [20 张图揭开内存管理的迷雾](https://mp.weixin.qq.com/s/oexktPKDULqcZQeplrFunQ) [看完这篇操作系统,和面试官扯皮就没问题了。](https://mp.weixin.qq.com/s/59xyIj1nIFp2TtkKFYnR-g) [计算机内存管理基础知识](https://mp.weixin.qq.com/s/OGRMAJeDw8wuO7UW5PjoVQ) [用动图的方式,理解 CPU 缓存一致性协议!](https://mp.weixin.qq.com/s/cyI2VAP4dqkStbsNMDWhDQ) [进程间通信](https://mp.weixin.qq.com/s/mblyh6XrLj1bCwL0Evs-Vg) [进程之间究竟有哪些通信方式?](https://mp.weixin.qq.com/s/CGqy0j5WvarN6mTmYB8vSA) [键盘敲入 A 字母时,操作系统期间发生了什么...](https://mp.weixin.qq.com/s/fKHOf_CzG8HYXHlg54V_rg) [一口气搞懂「文件系统」,就靠这 25 张图了](https://mp.weixin.qq.com/s/UT2JrfpkA5OUC9fJJ_MirQ) [10 张图打开 CPU 缓存一致性的大门](https://mp.weixin.qq.com/s/hjywA21UrvZSzdgvAr6fQA) [2.5w字 + 36 张图+一周时间:爆肝操作系统面试题](https://mp.weixin.qq.com/s/ws6bgcv6dKIIJDwYYliMAg) [计算机时间到底是怎么来的?](https://mp.weixin.qq.com/s/uM1ZNT8UwfvhqoscK8FJiQ) ================================================ FILE: docs/all/大数据/Flink.md ================================================ [Flink入门教程](https://mp.weixin.qq.com/s/xa2iGrmyoXq3FtZeU9GU-w) [Flink的CheckPoint机制](https://mp.weixin.qq.com/s/-OY0VGDWUoOMgKg-xKjZRQ) [Flink背压](https://mp.weixin.qq.com/s/Ttm9lCYxu7Wx0oE-LsjRlw) [Flink入门](https://mp.weixin.qq.com/s/Ey-oWpGO_QDo4DixiccVGg) ================================================ FILE: docs/all/学习路线.md ================================================ [后端技术学些啥](https://mp.weixin.qq.com/s/co6ZiALBCUHxc-8SpcKxPw) [从毕业到技术专家我做了啥](https://mp.weixin.qq.com/s/mYfVAo8-jkPFwhbqDZyQzw) [秒杀系统设计](https://mp.weixin.qq.com/s/z2S1EjWQDwKm5Ud36IenNw) [全栈秒杀系统设计](https://mp.weixin.qq.com/s/RRHN8t017ofOvb4nvlCStg) [秒杀系统2.0](https://mp.weixin.qq.com/s/KWb3POodisbOEsQVblsoGw) ================================================ FILE: docs/all/并发与多线程/多线程基础知识.md ================================================ [可重入锁](https://mp.weixin.qq.com/s/GDno-X1N8zc98h9MZ8_KoA) [(并发问题的根源到底是什么?)](https://mp.weixin.qq.com/s/TsENp5ygFdE0_REgz5Y3Ew) [敖丙稳住了多线程翻车的现场](https://mp.weixin.qq.com/s/g_eWT05_38AURchMIvNSnA) [2w字 + 40张图带你参透并发编程!](https://mp.weixin.qq.com/s/NZAJWBiFvGzCZXjr0KC9Dw) [图解Java中那18 把锁](https://mp.weixin.qq.com/s/XCR93HSm_E0c3KDcmZk3cA) ================================================ FILE: docs/all/并发与多线程/多线程经典面试题.md ================================================ [【面试】如果把线程当作一个人来对待,所有问题都瞬间明白了](https://mp.weixin.qq.com/s/PrUa0tFyu3UZllP2FRDyVA) [Java 并发进阶常见面试题总结](https://mp.weixin.qq.com/s/cdHfTTvMpH60SwG2bjTMBw) [如果你这样回答“什么是线程安全”,面试官都会对你刮目相看(建议珍藏)](https://mp.weixin.qq.com/s/WDeewsvWUEBIuabvVVhweA) ================================================ FILE: docs/all/并发与多线程/多线程锁机制.md ================================================ [乐观锁、悲观锁](https://mp.weixin.qq.com/s/WtAdXvaRuBZ-SXayIKu1mA) [互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景](https://mp.weixin.qq.com/s/6QrQ0TZVqSQq26Rms0_mvA) ================================================ FILE: docs/all/并发与多线程/常见关键字.md ================================================ [死磕Synchronized源码](https://mp.weixin.qq.com/s/2ka1cDTRyjsAGk_-ii4ngw) [当Synchronized遇到这玩意儿,有个大坑,要注意!](https://mp.weixin.qq.com/s/0oUXYFxpsi6Q9MfR5NKtLQ) [面试官想到,一个Volatile,敖丙都能吹半小时](https://mp.weixin.qq.com/s/Oa3tcfAFO9IgsbE22C5TEg) ================================================ FILE: docs/all/并发与多线程/常见的JUC工具类.md ================================================ [AQS](https://mp.weixin.qq.com/s/hB5ncpe7_tVovQj1sNlDRA) [我画了35张图就是为了让你深入 AQS](https://mp.weixin.qq.com/s/trsjgUFRrz40Simq2VKxTA) [1.5w字,30图带你彻底掌握 AQS!](https://mp.weixin.qq.com/s/iNz6sTen2CSOdLE0j7qu9A) [TheadLocal 引起的内存泄露故障分析](https://mp.weixin.qq.com/s/Gf4MiHPz8DynY80UmwH04Q) [终于有人把 CountDownLatch,CyclicBarrier,Semaphore 说明白了!](https://mp.weixin.qq.com/s/TDw7GnzDw5FK3RWwkIzzZA) [Java面试必问:ThreadLocal](https://mp.weixin.qq.com/s/LzkZXPtLW2dqPoz3kh3pBQ) [StampedLock](https://mp.weixin.qq.com/s/gjfeayR36vDAr3FAVd4w4g) ================================================ FILE: docs/all/并发与多线程/线程池知识点.md ================================================ [记一次线程池引发的故障 排查下来是三歪的锅](https://mp.weixin.qq.com/s/TQGtNpPiTypeKd5kUnfxEw) [深入线程池,连环17问](https://mp.weixin.qq.com/s/NDOx94yY06OnHjrYq2lVYw) ================================================ FILE: docs/all/开源/开源框架.md ================================================ [阿里巴巴开源限流系统 Sentinel 全解析](https://mp.weixin.qq.com/s/NgS9tL4IVwGZrssz7fURpA) [支付宝的架构到底有多牛逼?还没看完我就跪了!](https://mp.weixin.qq.com/s/d4K9hJHzZ5IAd2aarsdQrw) ================================================ FILE: docs/all/必会框架/RPC/Dubbo.md ================================================ [Dubbo基础](https://mp.weixin.qq.com/s/FPbu8rFOHyTGROIV8XJeTA) [Dubbo的服务暴露过程](https://mp.weixin.qq.com/s/ISiN06QynyE2pPtX3cGQ9w) [Dubbo的服务引用过程](https://mp.weixin.qq.com/s/9oDy1OPcfDaEhKD4eNUdOA) [Dubbo服务调用过程](https://mp.weixin.qq.com/s/oNR9v_ID2oAlEvDI93hRcw) [Dubbo的SPI机制是啥?](https://mp.weixin.qq.com/s/gwWOsdQGEN0t2GJVMQQexw) [Dubbo集群容错负载均衡](https://mp.weixin.qq.com/s/-IkHNAM4B0R_j50LkQunig) [Dubbo面试题](https://mp.weixin.qq.com/s/FwL6qArqYc2ENymXk1eZFQ) [1w+字的 Dubbo 面试题/知识点总结!(2021 最新版)](https://mp.weixin.qq.com/s/2qSA6aJn6KRXrATVE44k0w) ================================================ FILE: docs/all/必会框架/RPC/Netty.md ================================================ [高性能NIO框架-Netty](https://mp.weixin.qq.com/s/I9PGsWo7-ykGf2diKklGtA) [Netty常见面试题总结](https://mp.weixin.qq.com/s/eJ-dAtOYsxylGL7pBv7VVA) ================================================ FILE: docs/all/必会框架/RPC/RPC实践.md ================================================ [敖丙RPC的超时设置,一不小心搞了线上事故](https://mp.weixin.qq.com/s/pkWkD1VhMxhZPRrybLcQjA) [敖丙找出Dubbo源码BUG,三歪夸了我一天](https://mp.weixin.qq.com/s/_5YMfQK1tmYbmRMldBPlaQ) ================================================ FILE: docs/all/必会框架/SpringCloud.md ================================================ [外行人都能看懂的SpringCloud,错过了血亏!](https://mp.weixin.qq.com/s/MJrahcDXwxgDr5zBdO3XWw) [20000 字的 Spring Cloud 总结](https://mp.weixin.qq.com/s/pGSx8eKFH3YnUos3SM2ITw) ================================================ FILE: docs/all/必会框架/Zookeeper.md ================================================ [什么是Zookeeper](https://mp.weixin.qq.com/s/gphDLJMO3QcRoN3zkco4EA) [分布式锁之Zookeeper](https://mp.weixin.qq.com/s/ZqQHWLfVD1Rz1agmH3LWrg) [Zookeeper之ZAB协议](https://mp.weixin.qq.com/s/k0zAExTvMsrugCaNJxs7hQ) [Zookeeper夺命连环9问](https://mp.weixin.qq.com/s/YawG0GqznDHaiHXZuTsCjA) ================================================ FILE: docs/all/必会框架/spring.md ================================================ [一分钟带你玩转 Spring IoC](https://mp.weixin.qq.com/s/WpRSitDqtgOuU9GnI1-HDw) [AOP 面试造火箭事件始末](https://mp.weixin.qq.com/s/NXZp8a3n-ssnC6Y1Hy9lzw) [SpringAOP面试题](https://mp.weixin.qq.com/s/qlAvW10TRNVak1oJyHO39Q) [Spring事务传播行为](https://mp.weixin.qq.com/s/IglQITCkmx7Lpz60QOW7HA) [什么是 Spring 循环依赖?](https://mp.weixin.qq.com/s/5mwkgJB7GyLdKDgzijyvXw) [Spring常见问题总结(补充版)](https://mp.weixin.qq.com/s/wcK2qsZxKDJTLIGqEIyaNg) [15个经典的Spring面试常见问题](https://mp.weixin.qq.com/s/OMlwHHnGcN7iZ8lerUvW7w) [敖丙说精通字符串,面试官竟然问Java中的String有没有长度限制!](https://mp.weixin.qq.com/s/6YhpbuhdTX9BM_OimoW8MA) [Spring中的循环依赖](https://mp.weixin.qq.com/s/kS0K5P4FdF3v-fiIjGIvvQ) [Spring容器启动流程](https://mp.weixin.qq.com/s/ut3mRwhfqXNjrBtTmI0oWg) [Spring循环依赖](https://mp.weixin.qq.com/s/u29hMRkfTj_1RHNSukDtEw) [我是如何在面试别人Spring事务时“套路”对方的](https://mp.weixin.qq.com/s/JcHt99SAbNIlY063rmylpA) [SpringIOC 面试题(下)](https://mp.weixin.qq.com/s/4z9V4-k2Whqiz69gXy5iMQ) [SpringIOC 面试题(上)](https://mp.weixin.qq.com/s/SH4laewpIsio66MUJFLTyg) [深入浅出Spring架构设计](https://mp.weixin.qq.com/s/wXkgudY0ThIRLFxUmohJog) [Spring](https://mp.weixin.qq.com/s/liWn2Dn91cmuiqHSxVO_fA) ================================================ FILE: docs/all/搜索引擎/es.md ================================================ [Elasticsearch入门](https://mp.weixin.qq.com/s/AjGiMikSVgCk6INyf-m8hA) [记一次害敖丙差点丢工作的线上P0事故](https://mp.weixin.qq.com/s/F8BsSg6R9LHxKt-gbH_JKQ) ================================================ FILE: docs/all/架构演进之路/互联网架构之路.md ================================================ [我难道天生就是个架构师?这可是100k并发啊](https://mp.weixin.qq.com/s/Pi_fHXhSf17l8q5CZ_U5UA) ================================================ FILE: docs/all/架构演进之路/分布式&分布式事务.md ================================================ [分布式架构由来](https://mp.weixin.qq.com/s/uv9xYgYrHWqM5acXQYFegA) [分布式事务](https://mp.weixin.qq.com/s/XknegP66mnYboiBx556Kzw) [1.4 w字,25 张图让你彻底掌握分布式事务原理](https://mp.weixin.qq.com/s/ujRRtdLOeKEHsHrtDRNXGA) [什么是分布式配置中心?](https://mp.weixin.qq.com/s/NY7_z7SpiHy7IMJglPUoMw) [几种大厂分布式ID设计方案](https://mp.weixin.qq.com/s/pT2m_xqzcJkpV3Ql0o6dMw) ================================================ FILE: docs/all/架构演进之路/怎么设计一个能顶住双十一的系统.md ================================================ [压测都做些什么?](https://mp.weixin.qq.com/s/RzJkQuMAszkC8jw8hF-k1w) [千万级、亿级流量怎么处理?](https://mp.weixin.qq.com/s/CxqnaB9cUemvCcWkw2nUcw) ================================================ FILE: docs/all/研发规范/大厂技术研发规范.md ================================================ [大厂是如何设计接口的?](https://mp.weixin.qq.com/s/ROMzeipOwWZWNrVGdVwisg) [不要再在对外接口中使用枚举类型了!](https://mp.weixin.qq.com/s/ynYi_dMlP2Y9GnQXzQxa3Q) [谁在用isXxx形式定义布尔类型年后不用来了](https://mp.weixin.qq.com/s/bhCMqJnms3Q84kVvh_cd4g) ================================================ FILE: docs/all/研发规范/开源漏洞.md ================================================ [fastjson到底做错了什么?为什么会被频繁爆出漏洞?](https://mp.weixin.qq.com/s/iV9DbX3LhbBkNiaKLL7PxA) ================================================ FILE: docs/all/研发规范/阿里巴巴技术规范.md ================================================ [为什么阿里巴巴禁止使用Apache Beanutils进行属性的copy?](https://mp.weixin.qq.com/s/3XX-Lu1KrKEc3IfB9Iqz5A) [为什么阿里巴巴禁止开发人员使用isSuccess作为变量名?](https://mp.weixin.qq.com/s/xvTCaBXkRc7e6dGCUJxRPQ) [为什么阿里巴巴要求谨慎使用ArrayList中的subList方法](https://mp.weixin.qq.com/s/9y89Hy-YnpPjXpcmXpy_GQ) [为什么阿里巴巴不建议在for循环中使用"+"进行字符串拼接](https://mp.weixin.qq.com/s/fLUf8V0Qahe8piNrRp1UVQ) [为什么阿里巴巴禁止使用BigDecimal的equals方法做等值比较?](https://mp.weixin.qq.com/s/JduY7OAeywOlVLbLiX3Xnw) [为什么阿里巴巴强制要求使用包装类型定义属性?](https://mp.weixin.qq.com/s/O_jCxZWtTTkFZ9FlaZgOCg) ================================================ FILE: docs/all/科普.md ================================================ [你知道程序是怎么处理时区问题的么?](https://mp.weixin.qq.com/s/WszidUcoV_cYeDf26EkAcA) [聊一聊理财](https://mp.weixin.qq.com/s/BMttkFZsKu0qmxSz-MqAlw) [Swagger 官方 Starter 配上这个增强方案是真的香!](https://mp.weixin.qq.com/s/13ls90r8hWbzW4J1kuVzrQ) ================================================ FILE: docs/all/程序人生/成长经历.md ================================================ [嗯,读书就是我们唯一的出路](https://mp.weixin.qq.com/s/IM6ksfs4bWnOljB0EbsyxQ) [大学个人经历 | 如诗的青春](https://mp.weixin.qq.com/s/FJC2uEg9o56dqCPijgizFA) [人生如水,由溪入海](https://mp.weixin.qq.com/s/417im7XPERSMzGiHnNaiEQ) [2019年个人经历](https://mp.weixin.qq.com/s/66ZDj60KPEfohHg0g8Cggw) [昂,我24岁了](https://mp.weixin.qq.com/s/_HCBjYI9bcNy-zBHu58l7g) [24岁我全款买了人生的第一辆车](https://mp.weixin.qq.com/s/aK6ASJO6G1q4mY3TUShCqQ) [2020个人经历](https://mp.weixin.qq.com/s/H88XxwF3GCwc_cL4rGKu8g) [我的青春结束了](https://mp.weixin.qq.com/s/matyTWXuZ_qs9hGfAl9_NQ) [鲜衣怒马少年时,一日看尽长安花](https://mp.weixin.qq.com/s/oY3CxB2Dk82mBs4W77Zrcw) [敖丙离职了](https://mp.weixin.qq.com/s/WPY13Px6OeGssBkZVOL7Aw) ================================================ FILE: docs/all/程序人生/生活趣事.md ================================================ [敖丙的第一次相亲,还没开始,就已经结束了。](https://mp.weixin.qq.com/s/mLLbpnI1pVnlUzL7H3EuNQ) [我第一次相亲就被大三岁的姐姐看上](https://mp.weixin.qq.com/s/bM7xtVDwAA82d42UrhEx2g) [敖丙参加了一场温州游资的婚礼](https://mp.weixin.qq.com/s/sM3hJe5z3_pCH-8GWs0iOA) [敖丙枯燥无味的假期,一直在吃狗粮](https://mp.weixin.qq.com/s/1jQnRCXdrUQzZInQmzABvA) [请照顾好自己,周末病魔差点一套带走我。](https://mp.weixin.qq.com/s/5C4UjGtHoZVu8uI4yP5wRg) [曾经我们并肩作战,敬未来一杯,敬资本一杯](https://mp.weixin.qq.com/s/s9HPYYi9VfYMt7UGCTqWVw) [敖丙我写了一个新手都写不出的低级bug,被骂惨了。](https://mp.weixin.qq.com/s/yB9s771gDz6oMKZsUnJuyg) [程序员删库跑路,判刑十个月](https://mp.weixin.qq.com/s/xmhMU17fSCd9aYBkozNVUg) [我是没想到老家的出租车师傅连我都敢宰,我给他上了一课](https://mp.weixin.qq.com/s/Djlxil-pt6Kn5SDqt1A_5A) ================================================ FILE: docs/all/程序人生/职场经历.md ================================================ [蘑菇街裁员说明 海阔凭鱼跃,天高任鸟飞](https://mp.weixin.qq.com/s/JB6CT4SfOg8e9lhkiWwZNg) [入职一周年,我眼中的蘑菇街](https://mp.weixin.qq.com/s/LjFfDwT62usphaock5pU8Q) [在美女如云的蘑菇街工作是怎样的体验?](https://mp.weixin.qq.com/s/_zK6ovSynkcmZ-iwzFHHMA) [【互联网寒冬】经历裁员,拿20W被迫去大厂](https://mp.weixin.qq.com/s/0WurpFJlZQtjjdleGPK0Cw) [再见了,蘑菇街最帅的男人](https://mp.weixin.qq.com/s/dzxUtvI1m9uO1OpkkcDq0g) [敖丙用20行代码拿了比赛冠军](https://mp.weixin.qq.com/s/br7Ak88kA5GkZ26hxwKUiw) [敖丙我参加了蘑菇街年会,流了一晚上鼻血](https://mp.weixin.qq.com/s/fkByjmdaqdw0TELDzdm5mQ) [时间刺客--敖丙](https://mp.weixin.qq.com/s/wlfurOBpxeaf6iy7CtHRlA) [送别了好友,敖丙跟你聊聊【离职】这个话题](https://mp.weixin.qq.com/s/pHcgkDvKfElRIVZGd4Kzng) [再见,三歪](https://mp.weixin.qq.com/s/7t2-L7ZYAYXrp0CTbYpAUg) [阿里入职培训](https://mp.weixin.qq.com/s/MijvXeWtsJOJIzxcpJdRhA) ================================================ FILE: docs/all/程序人生/自媒体经历.md ================================================ [写作一个月的感受](https://mp.weixin.qq.com/s/g6SQ6nqjKrqjlzaGuLHpYA) [我知道互联网不相信眼泪,但是敖丙今天还是没忍住](https://mp.weixin.qq.com/s/UC6NsEFlNfqMdEkzvHxKRA) [50天全网2W粉,感谢坚持!](https://mp.weixin.qq.com/s/_5tVdE9oFPBUK3Z0gKH26g) [华为现场和百万粉博主线下面基,敖丙c位出道](https://mp.weixin.qq.com/s/SBnev4kAzsqpA9l-unt4dw) [敖丙第一次见到一个亿...](https://mp.weixin.qq.com/s/KB7Gkdu4S13mQnlHGAUHfQ) [敖丙入职腾讯了](https://mp.weixin.qq.com/s/LvgziYKKE7lLIxag1v3R1A) ================================================ FILE: docs/all/程序人生/读者经历.md ================================================ [从网瘾少年逆袭拿到微软 、字节等offer(上)](https://mp.weixin.qq.com/s/irjvJkIRknxasM0D1v3FOw) [从网瘾少年逆袭拿到微软 、字节等offer(下)](https://mp.weixin.qq.com/s/CTpY8oxxjdvleTotjrpAsA) [我新浪学妹的北京日常](https://mp.weixin.qq.com/s/oSKKUOG-JO0PLMun13gi0A) [朋友被裁员之后的工行、华为外包工作经历分享](https://mp.weixin.qq.com/s/cMZN_T7Ar1skWyyx8iHI5g) [和华为的一位学长聊了很久,优秀的人果然都有过人之处](https://mp.weixin.qq.com/s/Bg0Qejvxd6nQMuG4gXFzLw) ================================================ FILE: docs/all/程序人生/过年特辑.md ================================================ [贵州打工仔回家过年,遭遇流感,被隔离,偶遇读者,偶遇直播同行...](https://mp.weixin.qq.com/s/MXSWBVQyVD4OW0tjy5UO8Q) [敖丙回家过年,外婆说没带女朋友别回来了?喝了老爸89年的酒,当场反目。](https://mp.weixin.qq.com/s/pQrepZAbgP59gmj42Z1kdA) [书房翻杂物,看到初恋的信件,看到奖牌,看到梅西、力宏,帅丙的眼角又湿了.....](https://mp.weixin.qq.com/s/VECNJbVV0Bz8PKlG8pYwVw) [疫情之下,从一座空城,到另一座空城,贵州小伙带你看不一样的杭州](https://mp.weixin.qq.com/s/8blBtbBLJtVvpnrJ7tmh_g) ================================================ FILE: docs/all/线上问题排查.md ================================================ [线上问题如何排查?](https://mp.weixin.qq.com/s/8YBJn8x7Sf9dai9jNkX6Tg) [RT 过长,排查思路](https://mp.weixin.qq.com/s/TnLl2OW9XJLSZihcpgP7VQ) [线上问题排查](https://mp.weixin.qq.com/s/fA860wCu9PZW3eQTwdbGWQ) ================================================ FILE: docs/all/缓存/Redis常见线上故障及其解决方案.md ================================================ [缓存击穿、雪崩、穿透](https://mp.weixin.qq.com/s/knz-j-m8bTg5GnKc7oeZLg) [布隆过滤器实战【防止缓存击穿】](https://mp.weixin.qq.com/s/BdwZViiAqnFhCde4ZsxwPg) [分布式锁、并发竞争、双写一致性](https://mp.weixin.qq.com/s/2hTgP3MRTVDxmmoUFhOaGw) ================================================ FILE: docs/all/缓存/Redis常见面试题.md ================================================ [Redis面试题](https://mp.weixin.qq.com/s/LkIcGS9kFTXNLFlxASPYUA) [Redis常见面试题](https://mp.weixin.qq.com/s/R1TJMo2IbPUUMox9OAAafQ) [Redis为什么变慢了?一文讲透如何排查Redis性能问题](https://mp.weixin.qq.com/s/rw42cFbJXwPtsGiqkFErfw) [Redis不是一直号称单线程效率也很高吗,为什么又采用多线程了?](https://mp.weixin.qq.com/s/mscKInWNAuhCbg183Um9_g) [缓存一致性问题怎么解决?](https://mp.weixin.qq.com/s/dYvM8_6SQnYRB6KjPsprbw) [内存耗尽后Redis会发生什么?](https://mp.weixin.qq.com/s/-caMTrOXQu-o0O44e6I9dQ) [妈妈再也不担心我面试被Redis问得脸都绿了](https://mp.weixin.qq.com/s/vXBFscXqDcXS_VaIERplMQ) ================================================ FILE: docs/all/缓存/Redis数据结构、基础知识.md ================================================ [Redis基础知识](https://mp.weixin.qq.com/s/aOiadiWG2nNaZowmoDQPMQ) [图解 Redis 数据结构](https://mp.weixin.qq.com/s/qptE172slg_6Tl1yuzdbfw) [Redis为什么这么快?](https://mp.weixin.qq.com/s/KtzvawDnQQwhfjnCoXpcMQ) [集群高可用、哨兵、持久化、LRU](https://mp.weixin.qq.com/s/EjDeypra_d9Tfsn-WkJZdw) [布隆过滤器(BloomFilter)](https://github.com/AobingJava/JavaFamily/blob/master/docs/redis/%E5%B8%83%E9%9A%86%E8%BF%87%E6%BB%A4%E5%99%A8(BloomFilter).md) [Redis—分布式锁深入探究](https://mp.weixin.qq.com/s/49hgH3COla3wU0rgyiUVgg) [Redis—跳跃表](https://mp.weixin.qq.com/s/NOsXdrMrWwq4NTm180a6vw) [Redis—5种基本数据结构](https://mp.weixin.qq.com/s/MT1tB2_7f5RuOxKhuEm1vQ) [Redis—持久化](https://mp.weixin.qq.com/s/O_qDco6-Dasu3RomWIK_Ig) [Reids—神奇的HyperLoglog解决统计问题](https://mp.weixin.qq.com/s/9dtGe3d_mbbxW5FpVPDNow) [Redis分布式锁](https://mp.weixin.qq.com/s/Z_xriP-jc2Bnmdcm0l5xzg) [Redis数据结构底层系列-SDS](https://mp.weixin.qq.com/s/VY31lBOSggOHvVf54GzvYw) [短小精悍之 Redis 命令行工具有趣的罕见用法](https://mp.weixin.qq.com/s/eSx4aL7iaMZlW0cPZswghA) [Redis分布式锁(全)](https://mp.weixin.qq.com/s/RnSokJxYxYDeenOP_JE3fQ) [Redis源码之BitMap](https://mp.weixin.qq.com/s/LavkCpqMTled_1m9CpJQ6w) [Redis源码之SDS](https://mp.weixin.qq.com/s/uYUQ1P8Dq1Cdknxif7lF-g) [读懂Redis源码,我总结了这7点心得](https://mp.weixin.qq.com/s/h-OEbiUUmKvUZqxmjfmgtg) ================================================ FILE: docs/all/缓存/redis/Redis基础.md ================================================ >你知道的越多,你不知道的越多 >点赞再看,养成习惯 ## 前言 **Redis**在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在**Redis**的使用和原理方面对小伙伴们进行360°的刁难。作为一个在互联网公司面一次拿一次offer的面霸(**请允许我使用一下夸张的修辞手法**),打败了无数竞争对手,每次都只能看到无数落寞的身影失望的离开,略感愧疚,在一个寂寞难耐的夜晚,我痛定思痛,决定开始写《吊打面试官》系列,希望能帮助各位读者以后面试势如破竹,对面试官进行360°的反击,吊打问你的面试官,让一同面试的同僚铩羽而归,疯狂收割大厂offer! ### 面试开始 >一个大腹便便,穿着格子衬衣的中年男子,拿着一个满是划痕的mac向你走来,看着快秃顶的头发,心想着肯定是尼玛顶级架构师吧!但是我们腹有诗书气自华,虚都不虚。 ![](https://user-gold-cdn.xitu.io/2019/10/31/16e1ff35c9dc4843?w=500&h=320&f=png&s=236215) ### 小伙子您好,看你简历上写了你项目里面用到了Redis,你们为啥用Redis? 心里忍不住暗骂,这叫啥问题,大家不都是用的这个嘛,但是你不能说出来。 认真回答道:**帅气迷人的面试官您好**,因为传统的关系型数据库如Mysql已经不能适用所有的场景了,比如秒杀的库存扣减,APP首页的访问流量高峰等等,都很容易把数据库打崩,所以引入了缓存中间件,目前市面上比较常用的缓存中间件有Redis 和 Memcached 不过中和考虑了他们的优缺点,最后选择了Redis。 **至于更细节的对比朋友们记得查阅Redis 和 Memcached 的区别,比如两者的优缺点对比和各自的场景,后续我有时间也会写出来。** ### 那小伙子,我再问你,Redis有哪些数据结构呀? 字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。 **这里我相信99%的读者都能回答上来Redis的5个基本数据类型。如果回答不出来的小伙伴我们就要加油补课哟,大家知道五种类型最适合的场景更好。** 但是,如果你是Redis中高级用户,而且你要在这次面试中突出你和其他候选人的不同,还需要加上下面几种数据结构HyperLogLog、Geo、Pub/Sub。 如果你还想加分,那你说还玩过Redis Module,像BloomFilter,RedisSearch,Redis-ML,这个时候面试官得眼睛就开始发亮了,心想这个小伙子**有点东西啊**。 ******注:本人在面试回答到Redis相关的问题的时候,经常提到BloomFilter(布隆过滤器)这玩意的使用场景是真的多,而且用起来是真的香,原理也好理解,看一下文章就可以在面试官面前侃侃而谈了,不香么?下方传送门 ↓****** [避免缓存穿透的利器之BloomFilter](https://juejin.im/post/5db69365518825645656c0de) ### 如果有大量的key需要设置同一时间过期,一般需要注意什么? 如果大量的key过期时间设置的过于集中,到过期的那个时间点,redis可能会出现短暂的卡顿现象。严重的话会出现缓存雪崩,我们一般需要在时间上加一个随机值,使得过期时间分散一些。 **电商首页经常会使用定时任务刷新缓存,可能大量的数据失效时间都十分集中,如果失效时间一样,又刚好在失效的时间点大量用户涌入,就有可能造成缓存雪崩** ### 那你使用过Redis分布式锁么,它是什么回事? 先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放。 ### 这时候对方会告诉你说你回答得不错,然后接着问如果在setnx之后执行expire之前进程意外crash或者要重启维护了,那会怎么样? 这时候你要给予惊讶的反馈:唉,是喔,这个锁就永远得不到释放了。紧接着你需要**抓一抓自己得脑袋,故作思考片刻**,好像接下来的结果是你主动思考出来的,然后回答:我记得set指令有非常复杂的参数,这个应该是可以同时把setnx和expire合成一条指令来用的! ### 对方这时会显露笑容,心里开始默念:嗯,这小子还不错,开始有点意思了。 ### 假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如何将它们全部找出来? 使用**keys**指令可以扫出指定模式的key列表。 ### 对方接着追问:如果这个redis正在给线上的业务提供服务,那使用keys指令会有什么问题? 这个时候你要回答redis关键的一个特性:redis的单线程的。keys指令会导致线程阻塞一段时间,线上服务会停顿,直到指令执行完毕,服务才能恢复。这个时候可以使用**scan**指令,**scan**指令可以无阻塞的提取出指定模式的key列表,但是会有一定的重复概率,在客户端做一次去重就可以了,但是整体所花费的时间会比直接用keys指令长。 **不过,增量式迭代命令也不是没有缺点的: 举个例子, 使用 SMEMBERS 命令可以返回集合键当前包含的所有元素, 但是对于 SCAN 这类增量式迭代命令来说, 因为在对键进行增量式迭代的过程中, 键可能会被修改, 所以增量式迭代命令只能对被返回的元素提供有限的保证 。** ### 使用过Redis做异步队列么,你是怎么用的? 一般使用list结构作为队列,**rpush**生产消息,**lpop**消费消息。当lpop没有消息的时候,要适当sleep一会再重试。 ### 如果对方追问可不可以不用sleep呢? list还有个指令叫**blpop**,在没有消息的时候,它会阻塞住直到消息到来。 ### 如果对方接着追问能不能生产一次消费多次呢? 使用pub/sub主题订阅者模式,可以实现 1:N 的消息队列。 ### 如果对方继续追问 pub/su b有什么缺点? 在消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如**RocketMQ**等。 ### 如果对方究极TM追问Redis如何实现延时队列? 这一套连招下来,我估计现在你很想把面试官一棒打死(**面试官自己都想打死自己了怎么问了这么多自己都不知道的**),如果你手上有一根棒球棍的话,但是你很克制。平复一下激动的内心,然后神态自若的回答道:使用sortedset,拿时间戳作为score,消息内容作为key调用zadd来生产消息,消费者用**zrangebyscore**指令获取N秒之前的数据轮询进行处理。 **到这里,面试官暗地里已经对你竖起了大拇指。并且已经默默给了你A+,但是他不知道的是此刻你却竖起了中指,在椅子背后。** ### Redis是怎么持久化的?服务主从数据怎么交互的? RDB做镜像全量持久化,AOF做增量持久化。因为RDB会耗费较长时间,不够实时,在停机的时候会导致大量丢失数据,所以需要AOF来配合使用。在redis实例重启时,会使用RDB持久化文件重新构建内存,再使用AOF重放近期的操作指令来实现完整恢复重启之前的状态。 **这里很好理解,把RDB理解为一整个表全量的数据,AOF理解为每次操作的日志就好了,服务器重启的时候先把表的数据全部搞进去,但是他可能不完整,你再回放一下日志,数据不就完整了嘛。不过Redis本身的机制是 AOF持久化开启且存在AOF文件时,优先加载AOF文件;AOF关闭或者AOF文件不存在时,加载RDB文件;加载AOF/RDB文件城后,Redis启动成功; AOF/RDB文件存在错误时,Redis启动失败并打印错误信息** ### 对方追问那如果突然机器掉电会怎样? 取决于AOF日志sync属性的配置,如果不要求性能,在每条写指令时都sync一下磁盘,就不会丢失数据。但是在高性能的要求下每次都sync是不现实的,一般都使用定时sync,比如1s1次,这个时候最多就会丢失1s的数据。 ### 对方追问RDB的原理是什么? 你给出两个词汇就可以了,fork和cow。fork是指redis通过创建子进程来进行RDB操作,cow指的是copy on write,子进程创建后,父子进程共享数据段,父进程继续提供读写服务,写脏的页面数据会逐渐和子进程分离开来。 ******注:回答这个问题的时候,如果你还能说出AOF和RDB的优缺点,我觉得我是面试官在这个问题上我会给你点赞,两者其实区别还是很大的,而且涉及到Redis集群的数据同步问题等等。想了解的伙伴也可以留言,我会专门写一篇来介绍的。 ****** ### Pipeline有什么好处,为什么要用pipeline? 可以将多次IO往返的时间缩减为一次,前提是pipeline执行的指令之间没有因果相关性。使用redis-benchmark进行压测的时候可以发现影响redis的QPS峰值的一个重要因素是pipeline批次指令的数目。 ### Redis的同步机制了解么? Redis可以使用主从同步,从从同步。第一次同步时,主节点做一次bgsave,并同时将后续修改操作记录到内存buffer,待完成后将RDB文件全量同步到复制节点,复制节点接受完成后将RDB镜像加载到内存。加载完成后,再通知主节点将期间修改的操作记录同步到复制节点进行重放就完成了同步过程。后续的增量数据通过AOF日志同步即可,有点类似数据库的binlog。 ### 是否使用过Redis集群,集群的高可用怎么保证,集群的原理是什么? Redis Sentinal着眼于高可用,在master宕机时会自动将slave提升为master,继续提供服务。 Redis Cluster着眼于扩展性,在单个redis内存不足时,使用Cluster进行分片存储。 ## 面试结束 ### 小伙子你可以的,什么时候有时间来上班啊,要不明天就来吧? 你强装镇定,这么急啊我还需要租房,要不下礼拜一吧。 ### 好的 心想这小子这么NB是不是很多Offer在手上,不行我得叫hr给他加钱。 能撑到最后,你自己都忍不住自己给自己点个赞了! (**暗示点赞,每次都看了不点赞,你们想白嫖我么?你们好坏喲,不过我喜欢**)。 ## 总结 **在技术面试的时候,不管是Redis还是什么问题,如果你能举出实际的例子,或者是直接说自己开发过程的问题和收获会给面试官的印象分会加很多,回答逻辑性也要强一点,不要东一点西一点,容易把自己都绕晕的。** **还有一点就是我问你为啥用Redis你不要一上来就直接回答问题了,你可以这样回答:** **帅气的面试官您好**,首先我们的项目DB遇到了瓶颈,特别是秒杀和热点数据这样的场景DB基本上就扛不住了,那就需要缓存中间件的加入了,目前市面上有的缓存中间件有 Redis 和 Memcached ,他们的优缺点......,综合这些然后再结合我们项目特点,最后我们在技术选型的时候选了谁。 如果你这样有条不紊,有理有据的回答了我的问题而且还说出这么多我问题外的知识点,我会觉得你不只是一个会写代码的人,你逻辑清晰,你对技术选型,对中间件对项目都有自己的理解和思考,说白了就是你的offer有戏了。 好了 以上就是这篇文章的全部内容了,我后面会不断更新《吊打面试官》系列和Java技术栈相关的文章。如果你有什么想知道的,也可以**留言**给我,我一有时间就会写出来,我们共同进步。 非常感谢您能看到这里,如果这个文章写得还不错的话 **求点赞** **求关注** **求分享** **求留言** 各位的支持和认可,就是我创作的最大动力,OK各位我们下期见! 敖丙 | 文 ---- >后面会持续更新《吊打面试官》系列可以关注我的公众号第一时间阅读,也会有朋友一线大厂的内推机会不定期推出(字节跳动,阿里,网易,PDD,滴滴,蘑菇街等),就业上有什么问题也可以直接微信滴滴我,我也是个新人,不过不影响我们一起进步,作为渣男,我给不了你工作,还给不了你温暖嘛? ![](https://user-gold-cdn.xitu.io/2019/11/1/16e25fd86ba8a0db?w=900&h=500&f=png&s=185595) ================================================ FILE: docs/all/缓存/redis/Redis常见面试题.md ================================================ > 你知道的越多,你不知道的越多 > 点赞再看,养成习惯 > [**GitHub**](https://github.com/AobingJava/JavaFamily)上已经开源[https://github.com/Java...](https://github.com/AobingJava/JavaFamily),有面试点思维导图,欢迎[**Star**](https://github.com/AobingJava/JavaFamily)和[**完善**](https://github.com/AobingJava/JavaFamily) ## 前言 **Redis**在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在**Redis**的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸,打败了无数竞争对手,每次都只能看到无数落寞的身影失望的离开,略感愧疚(**请允许我使用一下夸张的修辞手法**)。 于是在一个寂寞难耐的夜晚,我痛定思痛,决定开始写**《吊打面试官》**系列,希望能帮助各位读者以后面试势如破竹,对面试官进行360°的反击,吊打问你的面试官,让一同面试的同僚瞠目结舌,疯狂收割大厂Offer! ## 絮叨 上一期因为是在双十一一直在熬夜的大环境下完成的,所以我自己觉得质量明显没之前的好,我这不一睡好就加班加点准备补偿大家,来点干货。(熬夜太容易感冒了,这次**点个赞**别白嫖了!) 顺带提一嘴,我把我准备写啥画了一个思维导图,以后总不能每篇都放个贼大的图吧,就开源到了我的**[GitHub](https://github.com/AobingJava/JavaFamily)**,大家有兴趣可以去完善和**Star**。 这篇我就先放出来大家看看,感觉还是差点意思,等大家完善了。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8vdvnnqz4j30u029349w.jpg) ## 回望过去 上一期吊打系列我们提到了**Redis**相关的一些知识,还没看的小伙伴可以回顾一下 - **[《吊打面试官》系列-Redis基础](https://juejin.im/post/5db66ed9e51d452a2f15d833)** - **[《吊打面试官》系列-缓存雪崩、击穿、穿透](https://juejin.im/post/5dbef8306fb9a0203f6fa3e2)** - **[《吊打面试官》系列-Redis哨兵、持久化、主从、手撕LRU](https://juejin.im/post/5dc3a9fbf265da4d3c072eab)** - **[《吊打面试官》系列-Redis终章-凛冬将至、FPX-新王登基](https://juejin.im/post/5dc850b4e51d452c2308ee27)** 这期我就从缓存到一些常见的问题讲一下,有一些我是之前提到过的,不过可能大部分仔是第一次看,我就重复发一下。 ### 缓存知识点 ###### ![](https://www.lgstatic.com/i/image2/M01/8A/CA/CgoB5l14rXSAWVk7AAFdi6Ly8iM148.png) ### 缓存有哪些类型? 缓存是高并发场景下提高热点数据访问性能的一个有效手段,在开发项目时会经常使用到。 缓存的类型分为:**本地缓存**、**分布式缓存**和**多级缓存**。 #### 本地缓存: **本地缓存**就是在进程的内存中进行缓存,比如我们的 **JVM** 堆中,可以用 **LRUMap** 来实现,也可以使用 **Ehcache** 这样的工具来实现。 本地缓存是内存访问,没有远程交互开销,性能最好,但是受限于单机容量,一般缓存较小且无法扩展。 #### 分布式缓存: **分布式缓存**可以很好得解决这个问题。 分布式缓存一般都具有良好的水平扩展能力,对较大数据量的场景也能应付自如。缺点就是需要进行远程请求,性能不如本地缓存。 #### 多级缓存: 为了平衡这种情况,实际业务中一般采用**多级缓存**,本地缓存只保存访问频率最高的部分热点数据,其他的热点数据放在分布式缓存中。 在目前的一线大厂中,这也是最常用的缓存方案,单考单一的缓存方案往往难以撑住很多高并发的场景。 ### 淘汰策略 不管是本地缓存还是分布式缓存,为了保证较高性能,都是使用内存来保存数据,由于成本和内存限制,当存储的数据超过缓存容量时,需要对缓存的数据进行剔除。 一般的剔除策略有 **FIFO** 淘汰最早数据、**LRU** 剔除最近最少使用、和 **LFU** 剔除最近使用频率最低的数据几种策略。 - **noeviction**:返回错误当内存限制达到并且客户端尝试执行会让更多内存被使用的命令(大部分的写入指令,但DEL和几个例外) - **allkeys-lru**: 尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。 - **volatile-lru**: 尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放。 - **allkeys-random**: 回收随机的键使得新添加的数据有空间存放。 - **volatile-random**: 回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。 - **volatile-ttl**: 回收在过期集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。 如果没有键满足回收的前提条件的话,策略**volatile-lru**, **volatile-random**以及**volatile-ttl**就和noeviction 差不多了。 其实在大家熟悉的**LinkedHashMap**中也实现了Lru算法的,实现如下: ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8p9gl0t7nj30qw08p3z4.jpg) 当容量超过100时,开始执行**LRU**策略:将最近最少未使用的 **TimeoutInfoHolder** 对象 **evict** 掉。 真实面试中会让你写LUR算法,你可别搞原始的那个,那真TM多,写不完的,你要么怼上面这个,要么怼下面这个,找一个数据结构实现下Java版本的LRU还是比较容易的,知道啥原理就好了。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8orgm8oj0j30p10f7wfq.jpg) ### Memcache 注意后面会把 **Memcache** 简称为 MC。 先来看看 MC 的特点: - MC 处理请求时使用多线程异步 IO 的方式,可以合理利用 CPU 多核的优势,性能非常优秀; - MC 功能简单,使用内存存储数据; - MC 的内存结构以及钙化问题我就不细说了,大家可以查看[官网](http://www.memcached.org/about)了解下; - MC 对缓存的数据可以设置失效期,过期后的数据会被清除; - 失效的策略采用延迟失效,就是当再次使用数据时检查是否失效; - 当容量存满时,会对缓存中的数据进行剔除,剔除时除了会对过期 key 进行清理,还会按 LRU 策略对数据进行剔除。 另外,使用 MC 有一些限制,这些限制在现在的互联网场景下很致命,成为大家选择**Redis**、**MongoDB**的重要原因: - key 不能超过 250 个字节; - value 不能超过 1M 字节; - key 的最大失效时间是 30 天; - 只支持 K-V 结构,不提供持久化和主从同步功能。 ### Redis 先简单说一下 **Redis** 的特点,方便和 MC 比较。 - 与 MC 不同的是,Redis 采用单线程模式处理请求。这样做的原因有 2 个:一个是因为采用了非阻塞的异步事件处理机制;另一个是缓存数据都是内存操作 IO 时间不会太长,单线程可以避免线程上下文切换产生的代价。 - **Redis** 支持持久化,所以 Redis 不仅仅可以用作缓存,也可以用作 NoSQL 数据库。 - 相比 MC,**Redis** 还有一个非常大的优势,就是除了 K-V 之外,还支持多种数据格式,例如 list、set、sorted set、hash 等。 - **Redis** 提供主从同步机制,以及 **Cluster** 集群部署能力,能够提供高可用服务。 # ### 详解 Redis Redis 的知识点结构如下图所示。 ![](https://www.lgstatic.com/i/image2/M01/8A/CA/CgoB5l14rXSAHFMcAAFKedIz0a0877.png) ### 功能 来看 **Redis** 提供的功能有哪些吧! #### 我们先看基础类型: #### **String:** **String** 类型是 **Redis** 中最常使用的类型,内部的实现是通过 **SDS**(Simple Dynamic String )来存储的。SDS 类似于 **Java** 中的 **ArrayList**,可以通过预分配冗余空间的方式来减少内存的频繁分配。 这是最简单的类型,就是普通的 set 和 get,做简单的 KV 缓存。 但是真实的开发环境中,很多仔可能会把很多比较复杂的结构也统一转成**String**去存储使用,比如有的仔他就喜欢把对象或者**List**转换为**JSONString**进行存储,拿出来再反序列话啥的。 我在这里就不讨论这样做的对错了,但是我还是希望大家能在最合适的场景使用最合适的数据结构,对象找不到最合适的但是类型可以选最合适的嘛,之后别人接手你的代码一看这么**规范**,诶这小伙子**有点东西**呀,看到你啥都是用的**String**,**垃圾!** ![](https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=454498675,4139436609&fm=26&gp=0.jpg) 好了这些都是题外话了,道理还是希望大家记在心里,习惯成自然嘛,小习惯成就你。 **String**的实际应用场景比较广泛的有: - **缓存功能:String**字符串是最常用的数据类型,不仅仅是**Redis**,各个语言都是最基本类型,因此,利用**Redis**作为缓存,配合其它数据库作为存储层,利用**Redis**支持高并发的特点,可以大大加快系统的读写速度、以及降低后端数据库的压力。 - **计数器:**许多系统都会使用**Redis**作为系统的实时计数器,可以快速实现计数和查询的功能。而且最终的数据结果可以按照特定的时间落地到数据库或者其它存储介质当中进行永久保存。 - **共享用户Session:**用户重新刷新一次界面,可能需要访问一下数据进行重新登录,或者访问页面缓存**Cookie**,但是可以利用**Redis**将用户的**Session**集中管理,在这种模式只需要保证**Redis**的高可用,每次用户**Session**的更新和获取都可以快速完成。大大提高效率。 #### **Hash:** 这个是类似 **Map** 的一种结构,这个一般就是可以将结构化的数据,比如一个对象(前提是**这个对象没嵌套其他的对象**)给缓存在 **Redis** 里,然后每次读写缓存的时候,可以就操作 **Hash** 里的**某个字段**。 但是这个的场景其实还是多少单一了一些,因为现在很多对象都是比较复杂的,比如你的商品对象可能里面就包含了很多属性,其中也有对象。我自己使用的场景用得不是那么多。 #### **List:** **List** 是有序列表,这个还是可以玩儿出很多花样的。 比如可以通过 **List** 存储一些列表型的数据结构,类似粉丝列表、文章的评论列表之类的东西。 比如可以通过 **lrange** 命令,读取某个闭区间内的元素,可以基于 **List** 实现分页查询,这个是很棒的一个功能,基于 **Redis** 实现简单的高性能分页,可以做类似微博那种下拉不断分页的东西,性能高,就一页一页走。 比如可以搞个简单的消息队列,从 **List** 头怼进去,从 **List** 屁股那里弄出来。 **List**本身就是我们在开发过程中比较常用的数据结构了,热点数据更不用说了。 - **消息队列:Redis**的链表结构,可以轻松实现阻塞队列,可以使用左进右出的命令组成来完成队列的设计。比如:数据的生产者可以通过**Lpush**命令从左边插入数据,多个数据消费者,可以使用**BRpop**命令阻塞的“抢”列表尾部的数据。 - 文章列表或者数据分页展示的应用。 比如,我们常用的博客网站的文章列表,当用户量越来越多时,而且每一个用户都有自己的文章列表,而且当文章多时,都需要分页展示,这时可以考虑使用**Redis**的列表,列表不但有序同时还支持按照范围内获取元素,可以完美解决分页查询功能。大大提高查询效率。 #### **Set:** **Set** 是无序集合,会自动去重的那种。 直接基于 **Set** 将系统里需要去重的数据扔进去,自动就给去重了,如果你需要对一些数据进行快速的全局去重,你当然也可以基于 **JVM** 内存里的 **HashSet** 进行去重,但是如果你的某个系统部署在多台机器上呢?得基于**Redis**进行全局的 **Set** 去重。 可以基于 **Set** 玩儿交集、并集、差集的操作,比如交集吧,我们可以把两个人的好友列表整一个交集,看看俩人的共同好友是谁?对吧。 反正这些场景比较多,因为对比很快,操作也简单,两个查询一个**Set**搞定。 #### **Sorted Set:** **Sorted set** 是排序的 **Set**,去重但可以排序,写进去的时候给一个分数,自动根据分数排序。 有序集合的使用场景与集合类似,但是set集合不是自动有序的,而**Sorted set**可以利用分数进行成员间的排序,而且是插入时就排序好。所以当你需要一个有序且不重复的集合列表时,就可以选择**Sorted set**数据结构作为选择方案。 - 排行榜:有序集合经典使用场景。例如视频网站需要对用户上传的视频做排行榜,榜单维护可能是多方面:按照时间、按照播放量、按照获得的赞数等。 - 用**Sorted Sets**来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。 微博热搜榜,就是有个后面的热度值,前面就是名称 ### 高级用法: #### **Bitmap** : 位图是支持按 bit 位来存储信息,可以用来实现 **布隆过滤器(BloomFilter)**; #### **HyperLogLog:** 供不精确的去重计数功能,比较适合用来做大规模数据的去重统计,例如统计 UV; #### **Geospatial:** 可以用来保存地理位置,并作位置距离计算或者根据半径计算位置等。有没有想过用Redis来实现附近的人?或者计算最优地图路径? 这三个其实也可以算作一种数据结构,不知道还有多少朋友记得,我在梦开始的地方,Redis基础中提到过,你如果只知道五种基础类型那只能拿60分,如果你能讲出高级用法,那就觉得你**有点东西**。 #### **pub/sub:** 功能是订阅发布功能,可以用作简单的消息队列。 #### **Pipeline:** 可以批量执行一组指令,一次性返回全部结果,可以减少频繁的请求应答。 #### **Lua:** **Redis** 支持提交 **Lua** 脚本来执行一系列的功能。 我在前电商老东家的时候,秒杀场景经常使用这个东西,讲道理有点香,利用他的原子性。 话说你们想看秒杀的设计么?我记得我面试好像每次都问啊,想看的直接**点赞**后评论秒杀吧。 #### **事务:** 最后一个功能是事务,但 **Redis** 提供的不是严格的事务,**Redis** 只保证串行执行命令,并且能保证全部执行,但是执行命令失败时并不会回滚,而是会继续执行下去。 ### 持久化 **Redis** 提供了 RDB 和 AOF 两种持久化方式,RDB 是把内存中的数据集以快照形式写入磁盘,实际操作是通过 fork 子进程执行,采用二进制压缩存储;AOF 是以文本日志的形式记录 **Redis** 处理的每一个写入或删除操作。 **RDB** 把整个 Redis 的数据保存在单一文件中,比较适合用来做灾备,但缺点是快照保存完成之前如果宕机,这段时间的数据将会丢失,另外保存快照时可能导致服务短时间不可用。 **AOF** 对日志文件的写入操作使用的追加模式,有灵活的同步策略,支持每秒同步、每次修改同步和不同步,缺点就是相同规模的数据集,AOF 要大于 RDB,AOF 在运行效率上往往会慢于 RDB。 细节的点大家去高可用这章看,特别是两者的优缺点,以及怎么抉择。 **[《吊打面试官》系列-Redis哨兵、持久化、主从、手撕LRU](https://juejin.im/post/5dc3a9fbf265da4d3c072eab)** ### 高可用 来看 Redis 的高可用。Redis 支持主从同步,提供 Cluster 集群部署模式,通过 Sentine l哨兵来监控 Redis 主服务器的状态。当主挂掉时,在从节点中根据一定策略选出新主,并调整其他从 slaveof 到新主。 选主的策略简单来说有三个: - slave 的 priority 设置的越低,优先级越高; - 同等情况下,slave 复制的数据越多优先级越高; - 相同的条件下 runid 越小越容易被选中。 在 Redis 集群中,sentinel 也会进行多实例部署,sentinel 之间通过 Raft 协议来保证自身的高可用。 Redis Cluster 使用分片机制,在内部分为 16384 个 slot 插槽,分布在所有 master 节点上,每个 master 节点负责一部分 slot。数据操作时按 key 做 CRC16 来计算在哪个 slot,由哪个 master 进行处理。数据的冗余是通过 slave 节点来保障。 ### 哨兵 哨兵必须用三个实例去保证自己的健壮性的,哨兵+主从并**不能保证数据不丢失**,但是可以保证集群的**高可用**。 为啥必须要三个实例呢?我们先看看两个哨兵会咋样。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8p9ghsrztj30930773yg.jpg) master宕机了 s1和s2两个哨兵只要有一个认为你宕机了就切换了,并且会选举出一个哨兵去执行故障,但是这个时候也需要大多数哨兵都是运行的。 那这样有啥问题呢?M1宕机了,S1没挂那其实是OK的,但是整个机器都挂了呢?哨兵就只剩下S2个裸屌了,没有哨兵去允许故障转移了,虽然另外一个机器上还有R1,但是故障转移就是不执行。 经典的哨兵集群是这样的: ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8p9gj3qyaj309309pwei.jpg) M1所在的机器挂了,哨兵还有两个,两个人一看他不是挂了嘛,那我们就选举一个出来执行故障转移不就好了。 暖男我,小的总结下哨兵组件的主要功能: - 集群监控:负责监控 Redis master 和 slave 进程是否正常工作。 - 消息通知:如果某个 **Redis** 实例有故障,那么哨兵负责发送消息作为报警通知给管理员。 - 故障转移:如果 master node 挂掉了,会自动转移到 slave node 上。 - 配置中心:如果故障转移发生了,通知 client 客户端新的 master 地址。 ### 主从 提到这个,就跟我前面提到的数据持久化的**RDB**和**AOF**有着比密切的关系了。 我先说下为啥要用主从这样的架构模式,前面提到了单机**QPS**是有上限的,而且**Redis**的特性就是必须支撑读高并发的,那你一台机器又读又写,**这谁顶得住啊**,不当人啊!但是你让这个master机器去写,数据同步给别的slave机器,他们都拿去读,分发掉大量的请求那是不是好很多,而且扩容的时候还可以轻松实现水平扩容。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8p9gedwerj312y0hodhm.jpg) 你启动一台slave 的时候,他会发送一个**psync**命令给master ,如果是这个slave第一次连接到master,他会触发一个全量复制。master就会启动一个线程,生成**RDB**快照,还会把新的写请求都缓存在内存中,**RDB**文件生成后,master会将这个**RDB**发送给slave的,slave拿到之后做的第一件事情就是写进本地的磁盘,然后加载进内存,然后master会把内存里面缓存的那些新命名都发给slave。 **我发出来之后来自CSDN的网友:Jian_Shen_Zer 问了个问题:** 主从同步的时候,新的slaver进来的时候用**RDB**,那之后的数据呢?有新的数据进入master怎么同步到slaver啊 敖丙答:笨,**AOF**嘛,增量的就像**MySQL**的**Binlog**一样,把日志增量同步给从服务就好了 #### key 失效机制 **Redis** 的 key 可以设置过期时间,过期后 Redis 采用主动和被动结合的失效机制,一个是和 MC 一样在访问时触发被动删除,另一种是定期的主动删除。 定期+惰性+内存淘汰 ### 缓存常见问题 #### 缓存更新方式 这是决定在使用缓存时就该考虑的问题。 缓存的数据在数据源发生变更时需要对缓存进行更新,数据源可能是 DB,也可能是远程服务。更新的方式可以是主动更新。数据源是 DB 时,可以在更新完 DB 后就直接更新缓存。 当数据源不是 DB 而是其他远程服务,可能无法及时主动感知数据变更,这种情况下一般会选择对缓存数据设置失效期,也就是数据不一致的最大容忍时间。 这种场景下,可以选择失效更新,key 不存在或失效时先请求数据源获取最新数据,然后再次缓存,并更新失效期。 但这样做有个问题,如果依赖的远程服务在更新时出现异常,则会导致数据不可用。改进的办法是异步更新,就是当失效时先不清除数据,继续使用旧的数据,然后由异步线程去执行更新任务。这样就避免了失效瞬间的空窗期。另外还有一种纯异步更新方式,定时对数据进行分批更新。实际使用时可以根据业务场景选择更新方式。 #### 数据不一致 第二个问题是数据不一致的问题,可以说只要使用缓存,就要考虑如何面对这个问题。缓存不一致产生的原因一般是主动更新失败,例如更新 DB 后,更新 **Redis** 因为网络原因请求超时;或者是异步更新失败导致。 解决的办法是,如果服务对耗时不是特别敏感可以增加重试;如果服务对耗时敏感可以通过异步补偿任务来处理失败的更新,或者短期的数据不一致不会影响业务,那么只要下次更新时可以成功,能保证最终一致性就可以。 #### 缓存穿透 **缓存穿透**。产生这个问题的原因可能是外部的恶意攻击,例如,对用户信息进行了缓存,但恶意攻击者使用不存在的用户id频繁请求接口,导致查询缓存不命中,然后穿透 DB 查询依然不命中。这时会有大量请求穿透缓存访问到 DB。 解决的办法如下。 1. 对不存在的用户,在缓存中保存一个空对象进行标记,防止相同 ID 再次访问 DB。不过有时这个方法并不能很好解决问题,可能导致缓存中存储大量无用数据。 2. 使用 **BloomFilter** 过滤器,BloomFilter 的特点是存在性检测,如果 BloomFilter 中不存在,那么数据一定不存在;如果 BloomFilter 中存在,实际数据也有可能会不存在。非常适合解决这类的问题。 #### 缓存击穿 **缓存击穿**,就是某个热点数据失效时,大量针对这个数据的请求会穿透到数据源。 解决这个问题有如下办法。 1. 可以使用互斥锁更新,保证同一个进程中针对同一个数据不会并发请求到 DB,减小 DB 压力。 2. 使用随机退避方式,失效时随机 sleep 一个很短的时间,再次查询,如果失败再执行更新。 3. 针对多个热点 key 同时失效的问题,可以在缓存时使用固定时间加上一个小的随机数,避免大量热点 key 同一时刻失效。 #### 缓存雪崩 **缓存雪崩**,产生的原因是缓存挂掉,这时所有的请求都会穿透到 DB。 解决方法: 1. 使用快速失败的熔断策略,减少 DB 瞬间压力; 2. 使用主从模式和集群模式来尽量保证缓存服务的高可用。 实际场景中,这两种方法会结合使用。 老朋友都知道为啥我**没有大篇幅介绍**这个几个点了吧,我在之前的文章实在是写得太详细了,忍不住**点赞**那种,我这里就不做重复拷贝了。 - **[《吊打面试官》系列-Redis基础](https://juejin.im/post/5db66ed9e51d452a2f15d833)** - **[《吊打面试官》系列-缓存雪崩、击穿、穿透](https://juejin.im/post/5dbef8306fb9a0203f6fa3e2)** - **[《吊打面试官》系列-Redis哨兵、持久化、主从、手撕LRU](https://juejin.im/post/5dc3a9fbf265da4d3c072eab)** - **[《吊打面试官》系列-Redis终章_凛冬将至、FPX_新王登基](https://juejin.im/post/5dc850b4e51d452c2308ee27)** ### 考点与加分项 拿笔记一下! ![](https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1573584978404&di=7b060a364b3cc6d6ab876f8892d6f6af&imgtype=jpg&src=http%3A%2F%2F5b0988e595225.cdn.sohucs.com%2Fimages%2F20190113%2F3ea1a7657be04e2281dd04b2f64a57bd.jpeg) #### 考点 面试的时候问你缓存,主要是考察缓存特性的理解,对 **MC**、**Redis** 的特点和使用方式的掌握。 - 要知道缓存的使用场景,不同类型缓存的使用方式,例如: 1. - 对 DB 热点数据进行缓存减少 DB 压力;对依赖的服务进行缓存,提高并发性能; 2. - 单纯 K-V 缓存的场景可以使用 **MC**,而需要缓存 list、set 等特殊数据格式,可以使用 **Redis**; 3. - 需要缓存一个用户最近播放视频的列表可以使用 **Redis** 的 list 来保存、需要计算排行榜数据时,可以使用 **Redis** 的 zset 结构来保存。 - 要了解 MC 和 **Redis** 的常用命令,例如原子增减、对不同数据结构进行操作的命令等。 - 了解 MC 和 **Redis** 在内存中的存储结构,这对评估使用容量会很有帮助。 - 了解 MC 和 **Redis** 的数据失效方式和剔除策略,比如主动触发的定期剔除和被动触发延期剔除 - 要理解 **Redis** 的持久化、主从同步与 **Cluster** 部署的原理,比如 **RDB** 和 **AOF** 的实现方式与区别。 - 要知道缓存穿透、击穿、雪崩分别的异同点以及解决方案。 - 不管你有没有电商经验我觉得你都应该知道秒杀的具体实现,以及细节点。 - ........ 欢迎去[GitHub](https://github.com/AobingJava/JavaFamily)补充 #### 加分项 如果想要在面试中获得更好的表现,还应了解下面这些加分项。 - 是要结合实际应用场景来介绍缓存的使用。例如调用后端服务接口获取信息时,可以使用本地+远程的多级缓存;对于动态排行榜类的场景可以考虑通过 **Redis** 的 **Sorted set** 来实现等等。 - 最好你有过分布式缓存设计和使用经验,例如项目中在什么场景使用过 **Redis**,使用了什么数据结构,解决哪类的问题;使用 MC 时根据预估值大小调整 **McSlab** 分配参数等等。 - 最好可以了解缓存使用中可能产生的问题。比如 **Redis** 是单线程处理请求,应尽量避免耗时较高的单个请求任务,防止相互影响;**Redis** 服务应避免和其他 CPU 密集型的进程部署在同一机器;或者禁用 Swap 内存交换,防止 **Redis** 的缓存数据交换到硬盘上,影响性能。再比如前面提到的 MC 钙化问题等等。 - 要了解 **Redis** 的典型应用场景,例如,使用 **Redis** 来实现分布式锁;使用 **Bitmap** 来实现 **BloomFilter**,使用 **HyperLogLog** 来进行 UV 统计等等。 - 知道 Redis4.0、5.0 中的新特性,例如支持多播的可持久化消息队列 Stream;通过 Module 系统来进行定制功能扩展等等。 - ........ 还是那句话欢迎去[GitHub](https://github.com/AobingJava/JavaFamily)补充。 ## 总结 这次是对我**Redis**系列的总结,这应该是**Redis**相关的最后一篇文章了,其实四篇看下来的小伙伴很多都从**一知半解**到了**一脸懵逼**,哈哈开个玩笑。 我觉得我的方式应该还好,大部分小伙伴还是比较能理解的,这篇之后我就不会写**Redis**相关的文章了(秒杀看大家想看的热度吧),有啥问题可以微信找我,**下个系列写啥**? 大家不用急,下个系列前我会发个有意思的文章,是我在公司代码创意大赛拿奖的文章,我觉得还是**有点东西**,我忍不住分享一下,顺便就在那期发起**投票**吧哈哈。 我看到很多小伙伴都有评论说想看别的,大概搜集了一下,还没留言的这期赶紧哟: #### 掘金 **愚辛** :想看计算机基础,网络和操作系统那些(FPX牛脾) **cherish君**:讲讲dubbo经常遇到的面试题目,太多人喜欢问dubbo😃 **Java架构养成记**:真的很香啊,下一期讲Dubbbo(重点SPI)然后讲MQ好吗 #### CSDN **小殿下**:看完了所有的redis篇 希望可以出ssm #### 博客园 **程然**:Dubbo Dubbo #### 开源中国 **linshi2019**:这期明显是赶工之作啊 敖丙:这条我回一下,鞭策我,我很喜欢,不过说实话还是希望大家**理解**下,我双十一熬夜三天了,现在给你们写的时候也是值班回家2点左右了,我一天吃饭工作时间肯定是固定的,想写点东西就只有挤出睡觉时间了,这种产出肯定没周末全情投入写的来的质量高。 其实第一期看过来的小伙伴应该也知道,我在**排版**,还有很多**文案**,**配图**其实我一直都有在改进的,光是名词高亮我都要弄很久,因为怕大家看单一的黑白色调枯燥。 我是真的用心在搞,还是希望大家支持下理解下。 **知乎、简书、思否、慕课手记**没人看不知道为啥,懂行的老铁可以跟我说一下。 我只想说你们想看的肯定都在我开头和[GITHub](https://github.com/AobingJava/JavaFamily)那个图里吧,问题不大,后面都会写的。 ## 鸣谢 最后感谢下,新浪微博的技术专家张雷。 他于2013年加入**新浪微博**,作为核心技术人员参与了微博服务化、混合云等多个重点项目,是微博开源的**RPC**框架**Motan**的技术负责人,同时也负责微博的**Service Mesh**方案的研发与推广,专注于高可用架构及服务中间件开发方向。 他负责的**Motan**框架每天承载着万亿级别的请求调用,是微博平台服务化的基石,每次的突发热点事件、每次的春晚流量高峰,都离不开**Motan**框架的支撑与保障。此外,他也多次应邀在**ArchSummit、WOT、GIAC**技术峰会做技术分享。 感谢他对文章部分文案提供的支持和思路。 ## END 好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是**人才**。 我后面会每周都更新几篇《**吊打面试官**》系列和**互联网常用技术栈**相关的文章。如果你有什么想知道的,也可以留言给我,我一有时间就会写出来,我们共同进步。 非常感谢**人才**们能看到这里,如果这个文章写得还不错,觉得「敖丙」我**有点东西**的话 **求点赞👍** **求关注❤️** **求分享👥** **求留言💬** 对暖男我来说 **非常有用**!!! 各位的支持和认可,就是我创作的最大动力,我们下篇文章见! 敖丙 | 文 【原创】【转载请联系本人】 ------ > 《吊打面试官》系列每周持续更新,可以关注我的公众号[JavaFamily](https://github.com/AobingJava/JavaFamily#%E5%85%AC%E4%BC%97%E5%8F%B7)第一时间阅读和催更(**公众号比博客早一到两天哟**),[**GitHub**](https://github.com/AobingJava/JavaFamily)上已经开源[https://github.com/Java...](https://github.com/AobingJava/JavaFamily),有面试点思维导图,欢迎[**Star**](https://github.com/AobingJava/JavaFamily)和[**完善**](https://github.com/AobingJava/JavaFamily)里面也有我个人微信有什么问题也可以直接滴滴我,我们一起进步。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8p9gftfchj30p00dwjuj.jpg) ================================================ FILE: docs/all/缓存/redis/布隆过滤器(BloomFilter).md ================================================ 避免缓存击穿的利器之BloomFilter # Bloom Filter 概念 布隆过滤器(英语:Bloom Filter)是1970年由一个叫布隆的小伙子提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。 ***面试关联:一般都会在回答缓存穿透,或者海量数据去重这个时候引出来,加分项哟*** # Bloom Filter 原理 布隆过滤器的原理是,当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检元素一定不在;如果都是1,则被检元素很可能在。这就是布隆过滤器的基本思想。 Bloom Filter跟单哈希函数Bit-Map不同之处在于:Bloom Filter使用了k个哈希函数,每个字符串跟k个bit对应。从而降低了冲突的概率。 ![img](https://images2018.cnblogs.com/blog/740591/201806/740591-20180623183045586-692673875.jpg) 简单的说一下就是我们先把我们数据库的数据都加载到我们的过滤器中,比如数据库的id现在有:1、2、3 那就用id:1 为例子他在上图中经过三次hash之后,把三次原本值0的地方改为1 下次我进来查询如果id也是1 那我就把1拿去三次hash 发现跟上面的三个位置完全一样,那就能证明过滤器中有1的 反之如果不一样就说明不存在了 那应用的场景在哪里呢?一般我们都会用来防止缓存击穿(如果不知道缓存击穿是啥的小伙伴不要着急,我已经帮你准备好了,传送门 ↓ ) 简单来说就是你数据库的id都是1开始然后自增的,那我知道你接口是通过id查询的,我就拿负数去查询,这个时候,会发现缓存里面没这个数据,我又去数据库查也没有,一个请求这样,100个,1000个,10000个呢?你的DB基本上就扛不住了,如果在缓存里面加上这个,是不是就不存在了,你判断没这个数据就不去查了,直接return一个数据为空不就好了嘛。 这玩意这么好使那有啥缺点么?有的,我们接着往下看 # Bloom Filter的缺点 bloom filter之所以能做到在时间和空间上的效率比较高,是因为牺牲了判断的准确率、删除的便利性 - 存在误判,可能要查到的元素并没有在容器中,但是hash之后得到的k个位置上值都是1。如果bloom filter中存储的是黑名单,那么可以通过建立一个白名单来存储可能会误判的元素。 - 删除困难。一个放入容器的元素映射到bit数组的k个位置上是1,删除的时候不能简单的直接置为0,可能会影响其他元素的判断。可以采用[Counting Bloom Filter](http://wiki.corp.qunar.com/confluence/download/attachments/199003276/US9740797.pdf?version=1&modificationDate=1526538500000&api=v2) # Bloom Filter 实现 布隆过滤器有许多实现与优化,Guava中就提供了一种Bloom Filter的实现。 在使用bloom filter时,绕不过的两点是预估数据量n以及期望的误判率fpp, 在实现bloom filter时,绕不过的两点就是hash函数的选取以及bit数组的大小。 对于一个确定的场景,我们预估要存的数据量为n,期望的误判率为fpp,然后需要计算我们需要的Bit数组的大小m,以及hash函数的个数k,并选择hash函数 ## (1)Bit数组大小选择   根据预估数据量n以及误判率fpp,bit数组大小的m的计算方式:![img](https://images2018.cnblogs.com/blog/740591/201806/740591-20180623183107851-1156064550.png) ## (2)哈希函数选择 ​ 由预估数据量n以及bit数组长度m,可以得到一个hash函数的个数k:![img](https://images2018.cnblogs.com/blog/740591/201806/740591-20180623183135930-1940138772.png) ​ 哈希函数的选择对性能的影响应该是很大的,一个好的哈希函数要能近似等概率的将字符串映射到各个Bit。选择k个不同的哈希函数比较麻烦,一种简单的方法是选择一个哈希函数,然后送入k个不同的参数。 哈希函数个数k、位数组大小m、加入的字符串数量n的关系可以参考[Bloom Filters - the math](http://pages.cs.wisc.edu/~cao/papers/summary-cache/node8.html),[Bloom_filter-wikipedia](https://en.wikipedia.org/wiki/Bloom_filter) 要使用BloomFilter,需要引入guava包: ```java com.google.guava guava 23.0 ``` 测试分两步: 1、往过滤器中放一百万个数,然后去验证这一百万个数是否能通过过滤器 2、另外找一万个数,去检验漏网之鱼的数量 ```java /** * 测试布隆过滤器(可用于redis缓存穿透) * * @author 敖丙 */ public class TestBloomFilter { private static int total = 1000000; private static BloomFilter bf = BloomFilter.create(Funnels.integerFunnel(), total); // private static BloomFilter bf = BloomFilter.create(Funnels.integerFunnel(), total, 0.001); public static void main(String[] args) { // 初始化1000000条数据到过滤器中 for (int i = 0; i < total; i++) { bf.put(i); } // 匹配已在过滤器中的值,是否有匹配不上的 for (int i = 0; i < total; i++) { if (!bf.mightContain(i)) { System.out.println("有坏人逃脱了~~~"); } } // 匹配不在过滤器中的10000个值,有多少匹配出来 int count = 0; for (int i = total; i < total + 10000; i++) { if (bf.mightContain(i)) { count++; } } System.out.println("误伤的数量:" + count); } } ``` 运行结果: ![img](https://images2018.cnblogs.com/blog/647585/201809/647585-20180910085137286-1365750639.png) 运行结果表示,遍历这一百万个在过滤器中的数时,都被识别出来了。一万个不在过滤器中的数,误伤了320个,错误率是0.03左右。 看下BloomFilter的源码: ```java public static BloomFilter create(Funnel funnel, int expectedInsertions) { return create(funnel, (long) expectedInsertions); } public static BloomFilter create(Funnel funnel, long expectedInsertions) { return create(funnel, expectedInsertions, 0.03); // FYI, for 3%, we always get 5 hash functions } public static BloomFilter create( Funnel funnel, long expectedInsertions, double fpp) { return create(funnel, expectedInsertions, fpp, BloomFilterStrategies.MURMUR128_MITZ_64); } static BloomFilter create( Funnel funnel, long expectedInsertions, double fpp, Strategy strategy) { ...... } ``` BloomFilter一共四个create方法,不过最终都是走向第四个。看一下每个参数的含义: funnel:数据类型(一般是调用Funnels工具类中的) expectedInsertions:期望插入的值的个数 fpp 错误率(默认值为0.03) strategy 哈希算法(我也不懂啥意思)Bloom Filter的应用 在最后一个create方法中,设置一个断点: ![img](https://images2018.cnblogs.com/blog/647585/201809/647585-20180910132928928-1515000664.png) ![img](https://images2018.cnblogs.com/blog/647585/201809/647585-20180910132846403-1134753024.png) 上面的numBits,表示存一百万个int类型数字,需要的位数为7298440,700多万位。理论上存一百万个数,一个int是4字节32位,需要4*8*1000000=3200万位。如果使用HashMap去存,按HashMap50%的存储效率,需要6400万位。可以看出BloomFilter的存储空间很小,只有HashMap的1/10左右 上面的numHashFunctions,表示需要5个函数去存这些数字 使用第三个create方法,我们设置下错误率: ```java private static BloomFilter bf = BloomFilter.create(Funnels.integerFunnel(), total, 0.0003); ``` 再运行看看: ![img](https://images2018.cnblogs.com/blog/647585/201809/647585-20180910173353668-949099512.png) 此时误伤的数量为4,错误率为0.04%左右。 ![img](https://images2018.cnblogs.com/blog/647585/201809/647585-20180910172828950-221799643.png) 当错误率设为0.0003时,所需要的位数为16883499,1600万位,需要12个函数 和上面对比可以看出,错误率越大,所需空间和时间越小,错误率越小,所需空间和时间约大 常见的几个应用场景: - cerberus在收集监控数据的时候, 有的系统的监控项量会很大, 需要检查一个监控项的名字是否已经被记录到db过了, 如果没有的话就需要写入db. - 爬虫过滤已抓到的url就不再抓,可用bloom filter过滤 - 垃圾邮件过滤。如果用哈希表,每存储一亿个 email地址,就需要 1.6GB的内存(用哈希表实现的具体办法是将每一个 email地址对应成一个八字节的信息指纹,然后将这些信息指纹存入哈希表,由于哈希表的存储效率一般只有 50%,因此一个 email地址需要占用十六个字节。一亿个地址大约要 1.6GB,即十六亿字节的内存)。因此存贮几十亿个邮件地址可能需要上百 GB的内存。而Bloom Filter只需要哈希表 1/8到 1/4 的大小就能解决同样的问题。 **觉得有用的话欢迎 关注 点赞 分享 【敖丙】| 文** ================================================ FILE: docs/all/缓存/redis/缓存击穿、雪崩、穿透.md ================================================ > 你知道的越多,你不知道的越多 > 点赞再看,养成习惯 ## 前言 **Redis**在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在**Redis**的使用和原理方面对小伙伴们进行360°的刁难。作为一个在互联网公司面一次拿一次offer的面霸(**请允许我使用一下夸张的修辞手法**),打败了无数竞争对手,每次都只能看到无数落寞的身影失望的离开,略感愧疚,在一个寂寞难耐的夜晚,我痛定思痛,决定开始写**《吊打面试官》**系列,希望能帮助各位读者以后面试势如破竹,对面试官进行360°的反击,吊打问你的面试官,让一同面试的同僚瞠目结舌,疯狂收割大厂offer! ## 一点感慨 本来都把稿子放到公众号保存了,洗澡的时候想了一下晚上的比赛,觉得还是打开电脑写点东西,跟文章内容没关系,只是一点个人的感慨,不知道多少小伙伴看了昨天**SKT VS G2**的比赛,又不知道多少小伙伴还记得**Faker**手抖的那一幕。 ![](https://pic.rmb.bdstatic.com/0def24612fc43cb8cd7e83ff068644934595.gif) 不知道你们看了是什么感受,我看到他手抖的时候我内心也抖了,世界赛我支持的都是**LPL**的队伍,但是我喜欢李哥这个人,那种对胜利的执著,这么多年了那种坚持自己的坚持,这么多利益诱惑在面前却只想要胜利,这样的人我好喜欢啊,我想很多人也喜欢。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8m0agafxfj307v0e0glv.jpg) 可能就像很多网友说的那样,英雄迟暮,但是我觉得他还是有点东西,就像很多人说我们程序员只能吃年轻饭一样,但是如果你坚持自己的坚持,做个腹有诗书气自华的仔,我想最后肯定会得到自己的得到。 好了我也不煽情了,我们开始讲技术吧。 ## 正文 上一期吊打系列我们提到了Redis的基础知识,还没看的小伙伴可以回顾一下 [《吊打面试官》系列-Redis基础](https://juejin.im/post/5db66ed9e51d452a2f15d833) 那提到**Redis**我相信各位在面试,或者实际开发过程中对缓存**雪崩**,**穿透**,**击穿**也不陌生吧,就算没遇到过但是你肯定听过,那三者到底有什么区别,我们又应该怎么去防止这样的情况发生呢,我们有请下一位受害者。 ## 面试开始 > 一个大腹便便,穿着格子衬衣的中年男子,拿着一个满是划痕的mac向你走来,看着快秃顶的头发,心想着肯定是尼玛顶级架构师吧!但是我们腹有诗书气自华,虚都不虚。 ![](https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1572684195247&di=028e6f6a8788bb3cee016bdb86254945&imgtype=0&src=http%3A%2F%2Fgss0.baidu.com%2F9vo3dSag_xI4khGko9WTAnF6hhy%2Fzhidao%2Fwh%3D800%2C450%2Fsign%3D2708ae14db160924dc70aa13e43719ce%2Ff11f3a292df5e0fe08d04043576034a85fdf72ac.jpg) ### 小伙子我看你的简历上写到了Redis,那么我们直接开门见山,直接怼常见的几个大问题,Redis雪崩了解么? 帅气迷人的面试官您好,我了解的,目前电商首页以及热点数据都会去做缓存 ,一般缓存都是定时任务去刷新,或者是查不到之后去更新的,定时任务刷新就有一个问题。 **举个简单的例子**:如果所有首页的Key失效时间都是12小时,中午12点刷新的,我零点有个秒杀活动大量用户涌入,假设当时每秒 6000 个请求,本来缓存在可以扛住每秒 5000 个请求,但是缓存当时所有的Key都失效了。此时 1 秒 6000 个请求全部落数据库,数据库必然扛不住,它会报一下警,真实情况可能DBA都没反应过来就直接挂了。此时,如果没用什么特别的方案来处理这个故障,DBA 很着急,重启数据库,但是数据库立马又被新的流量给打死了。这就是我理解的缓存雪崩。 **我刻意看了下我做过的项目感觉再吊的都不允许这么大的QPS直接打DB去,不过没慢SQL加上分库,大表分表可能还还算能顶,但是跟用了Redis的差距还是很大** ![](https://user-gold-cdn.xitu.io/2019/11/3/16e30d2c5e17899c?w=574&h=500&f=png&s=38474) **同一时间大面积失效,那一瞬间Redis跟没有一样,那这个数量级别的请求直接打到数据库几乎是灾难性的,你想想如果打挂的是一个用户服务的库,那其他依赖他的库所有的接口几乎都会报错,如果没做熔断等策略基本上就是瞬间挂一片的节奏,你怎么重启用户都会把你打挂,等你能重启的时候,用户早就睡觉去了,并且对你的产品失去了信心,什么垃圾产品。** ### 面试官摸了摸自己的头发,嗯还不错,那这种情况咋整?你都是怎么去应对的? 处理缓存雪崩简单,在批量往**Redis**存数据的时候,把每个Key的失效时间都加个随机值就好了,这样可以保证数据不会在同一时间大面积失效,我相信,Redis这点流量还是顶得住的。 ```java setRedis(Key,value,time + Math.random() * 10000); ``` 如果**Redis**是集群部署,将热点数据均匀分布在不同的**Redis**库中也能避免全部失效的问题,不过本渣我在生产环境中操作集群的时候,单个服务都是对应的单个**Redis**分片,是为了方便数据的管理,但是也同样有了可能会失效这样的弊端,失效时间随机是个好策略。 或者设置热点数据永远不过期,有更新操作就更新缓存就好了(比如运维更新了首页商品,那你刷下缓存就完事了,不要设置过期时间),电商首页的数据也可以用这个操作,保险。 ### 那你了解缓存穿透和击穿么,可以说说他们跟雪崩的区别么? 嗯,了解,我先说一下缓存穿透吧,缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,我们数据库的 id 都是1开始自增上去的,如发起为id值为 -1 的数据或 id 为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大,严重会击垮数据库。 **小点的单机系统,基本上用postman就能搞死,比如我自己买的阿里云服务** ![](https://user-gold-cdn.xitu.io/2019/11/3/16e30d1847df0faf?w=458&h=480&f=png&s=30569) **像这种你如果不对参数做校验,数据库id都是大于0的,我一直用小于0的参数去请求你,每次都能绕开Redis直接打到数据库,数据库也查不到,每次都这样,并发高点就容易崩掉了。** 至于**缓存击穿**嘛,这个跟**缓存雪崩**有点像,但是又有一点不一样,缓存雪崩是因为大面积的缓存失效,打崩了DB,而缓存击穿不同的是**缓存击穿**是指一个Key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个Key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个完好无损的桶上凿开了一个洞。 ![](https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1572683877606&di=abb0c6a9d0acca45a729b7ab516c6e20&imgtype=0&src=http%3A%2F%2Fimg.juimg.com%2Ftuku%2Fyulantu%2F110214%2F6462-11021411045623.jpg) ### 面试官露出欣慰的眼光,那他们分别怎么解决 **缓存穿透**我会在接口层增加校验,比如用户鉴权校验,参数做校验,不合法的参数直接代码Return,比如:id 做基础校验,id <=0的直接拦截等。 **这里我想提的一点就是,我们在开发程序的时候都要有一颗“不信任”的心,就是不要相信任何调用方,比如你提供了API接口出去,你有这几个参数,那我觉得作为被调用方,任何可能的参数情况都应该被考虑到,做校验,因为你不相信调用你的人,你不知道他会传什么参数给你。** **举个简单的例子,你这个接口是分页查询的,但是你没对分页参数的大小做限制,调用的人万一一口气查 Integer.MAX_VALUE 一次请求就要你几秒,多几个并发你不就挂了么?是公司同事调用还好大不了发现了改掉,但是如果是黑客或者竞争对手呢?在你双十一当天就调你这个接口会发生什么,就不用我说了吧。这是之前的Leader跟我说的,我觉得大家也都应该了解下。** 从缓存取不到的数据,在数据库中也没有取到,这时也可以将对应Key的Value对写为null、位置错误、稍后重试这样的值具体取啥问产品,或者看具体的场景,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。 这样可以防止攻击用户反复用同一个id暴力攻击,但是我们要知道正常用户是不会在单秒内发起这么多次请求的,那网关层**Nginx**本渣我也记得有配置项,可以让运维大大对单个IP每秒访问次数超出阈值的IP都拉黑。 ### 那你还有别的办法么? 还有我记得**Redis**还有一个高级用法**布隆过滤器(Bloom Filter)**这个也能很好的防止缓存穿透的发生,他的原理也很简单就是利用高效的数据结构和算法快速判断出你这个Key是否在数据库中存在,不存在你return就好了,存在你就去查了DB刷新KV再return。 那又有小伙伴说了如果黑客有很多个IP同时发起攻击呢?这点我一直也不是很想得通,但是一般级别的黑客没这么多肉鸡,再者正常级别的**Redis**集群都能抗住这种级别的访问的,小公司我想他们不会感兴趣的。把系统的高可用做好了,集群还是很能顶的。 **缓存击穿**的话,设置热点数据永远不过期。或者加上互斥锁就能搞定了 **作为暖男,代码我肯定帮你们准备好了** ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8mg8yjuyqj30ug0u0guk.jpg) ##面试结束 ### 嗯嗯还不错,三个点都回答得很好,今天也不早了,面试就先到这里,明天你再过来二面我继续问一下你关于Redis集群高可用,主从同步,哨兵等知识点的问题。 晕居然还有下一轮面试!(强行下一期的伏笔哈哈)但是为了offer还是得舔,嗯嗯,好的帅气面试官。 能回答得这么全面这么细节还是忍不住点赞 (**暗示点赞,每次都看了不点赞,你们想白嫖我么?你们好坏喲,不过我喜欢**) ## 总结 我们玩归玩,闹归闹,别拿面试开玩笑。 本文简单的介绍了,**Redis**的**雪崩**,**击穿**,**穿透**,三者其实都差不多,但是又有一些区别,在面试中其实这是问到缓存必问的,大家不要把三者搞混了,因为缓存雪崩、穿透和击穿,是缓存最大的问题,要么不出现,一旦出现就是致命性的问题,所以面试官一定会问你。 大家一定要理解是**怎么发生的**,以及是怎么去**避免**的,发生之后又怎么去**抢救**,你可以不是知道很深入,但是你不能一点都不去想,面试有时候不一定是对知识面的拷问,或许是对你的态度的拷问,如果你思路清晰,然后**知其然还知其所以然**那就很赞,还知道怎么预防那来上班吧。 ### 最后暖男我继续给你们做个小的技术总结: 一般避免以上情况发生我们从三个时间段去分析下: - 事前:**Redis** 高可用,主从+哨兵,**Redis cluster**,避免全盘崩溃。 - 事中:本地 **ehcache** 缓存 + **Hystrix** 限流+降级,避免** MySQL** 被打死。 - 事后:**Redis** 持久化 **RDB**+**AOF**,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。 上面的几点我会在吊打系列Redis篇全部讲一下这个月应该可以吧Redis更完,限流组件,可以设置每秒的请求,有多少能通过组件,剩余的未通过的请求,怎么办?**走降级**!可以返回一些默认的值,或者友情提示,或者空白的值。 **好处:** 数据库绝对不会死,限流组件确保了每秒只有多少个请求能通过。 只要数据库不死,就是说,对用户来说,3/5 的请求都是可以被处理的。 只要有 3/5 的请求可以被处理,就意味着你的系统没死,对用户来说,可能就是点击几次刷不出来页面,但是多点几次,就可以刷出来一次。 **这个在目前主流的互联网大厂里面是最常见的,你是不是好奇,某明星爆出什么事情,你发现你去微博怎么刷都空白界面,但是有的人又直接进了,你多刷几次也出来了,现在知道了吧,那是做了降级,牺牲部分用户的体验换来服务器的安全,可还行?** 好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是**人才**,我后面会每周都更新几篇《**吊打面试官**》系列和Java技术栈相关的文章。如果你有什么想知道的,也可以留言给我,我一有时间就会写出来,我们共同进步。 非常感谢**靓仔/靓女**您能看到这里,如果这个文章写得还不错的话 **求点赞** **求关注** **求分享** **求留言** **(对我非常有用)**各位的支持和认可,就是我创作的最大动力,我们下篇文章见,拜了个拜! 敖丙 | 文 【原创】 ------ > 每周都会持续更新《吊打面试官》系列可以关注我的公众号第一时间阅读和催更,也可以在公众号回复【人才】加入人才交流群一起讨论面试题,就业和工作上有什么问题也可以直接滴滴我,我也是个新人,不过不影响我们一起进步,作为渣男,我给不了你工作,还给不了你温暖嘛? ![](https://user-gold-cdn.xitu.io/2019/11/1/16e25fd86ba8a0db?w=900&h=500&f=png&s=185595) ================================================ FILE: docs/all/缓存/redis/集群高可用、哨兵、持久化、LRU.md ================================================ > 你知道的越多,你不知道的越多 > 点赞再看,养成习惯 ## 前言 **Redis**在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在**Redis**的使用和原理方面对小伙伴们进行360°的刁难。作为一个在互联网公司面一次拿一次offer的面霸(**请允许我使用一下夸张的修辞手法**),打败了无数竞争对手,每次都只能看到无数落寞的身影失望的离开,略感愧疚,在一个寂寞难耐的夜晚,我痛定思痛,决定开始写**《吊打面试官》**系列,希望能帮助各位读者以后面试势如破竹,对面试官进行360°的反击,吊打问你的面试官,让一同面试的同僚瞠目结舌,疯狂收割大厂**Offer**! ## 絮叨 写这期其实比较纠结,我之前的写的比较通俗易懂,一是我都知道这些点,二是之前我在所在的电商公司对雪崩,击穿啥的还算有场景去接触。但是线上的Redis集群我实际操作经验很少,总不能在公司线上环境实践那些操作吧,所以最后看了下官网,还有一些资料(文章后面我都会贴出来),强行怼了这么篇出来。 最近双十一小忙,周末双十一值班目测没时间写,那我是暖男呀,我不能鸽啊,就有了这一篇,下一篇迟到你们不要喷我哈,而且下一篇还是**Redis**的终章还是得构思下,不熟悉的知识点我怕漏洞多,特意让以前的大牛同事看了下,所以有啥不对的地方大家及时留言**Diss**我,写这篇是真的难,诺下面就是我本人某天凌晨两点的拍的视频,多动症的仔。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8p9gh78ueg30hs0a8e81.gif) 之前说过系列第二篇到300赞我就发第三篇 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8pc846lx5j30ad08lq5v.jpg) ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8pcvajvgcj30jk0390t6.jpg) 咋样没骗你们吧,就很枯竭,不BB了,开搞。 **不点个赞对不起我,这次不要白嫖我!** ---- ##正文 上几期**《吊打面试官》**还没看的小伙伴可以回顾一下(明明就写了两期说的好像很多一样)! - [《吊打面试官》系列-Redis基础](https://juejin.im/post/5db66ed9e51d452a2f15d833) - [《吊打面试官》系列-缓存雪崩、击穿、穿透](https://juejin.im/post/5dbef8306fb9a0203f6fa3e2) 大家都知道一个技术的引入方便了开发,解决了各种问题,但是也会带来对应的问题,**技术是把双刃剑**嘛,集群的引入也会带来很多问题,如:集群的高可用怎么保证,数据怎么同步等等,我们话不多说,有请下一位受害者为我们展示。 ### 面试开始 > 三个大腹便便,穿着格子衬衣的中年男子,拿着三个满是划痕的mac向你走来,看着快秃顶的头发,心想着肯定是尼玛顶级架构师吧!而且还是三个,但是还好我看过敖丙写的《吊打面试官》系列,腹有诗书气自华,根本虚都不虚好伐。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8p9gdh974j30t00dm408.jpg) #### 小伙子你好,之前问过了你基础知识以及一些缓存的常见几个大问题了,那你能跟我聊聊为啥Redis那么快么? 哦,帅气迷人的面试官您好,我们可以先看一下关系型数据库跟Redis本质上的区别。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8p9giaxfbj31dq0mk0vc.jpg) **Redis**采用的是基于内存的采用的是单进程单线程模型的 KV 数据库,由C语言编写,官方提供的数据是可以达到100000+的**QPS(每秒内查询次数)**。 - 完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。它的,数据存在内存中,类似于**HashMap**,**HashMap**的优势就是查找和操作的时间复杂度都是O(1); - 数据结构简单,对数据操作也简单,**Redis**中的数据结构是专门进行设计的; - 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 **CPU**,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗; - 使用多路I/O复用模型,非阻塞IO; - 使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,**Redis**直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求; ### 我可以问一下啥是上下文切换么? 我可以打个比方么:我记得有过一个小伙伴微信问过我上下文切换是啥,为啥可能会线程不安全,我是这么说的,就好比你看一本英文书,你看到第十页发现有个单词不会读,你加了个书签,然后去查字典,过了一会你又回来继续从书签那里读,ok到目前为止没啥问题。 如果是你一个人读肯定没啥问题,但是你去查的时候,别的小伙伴好奇你在看啥他就翻了一下你的书,然后溜了,哦豁,你再看的时候就发现书不是你看的那一页了。不知道到这里为止我有没有解释清楚,以及为啥会线程不安全,就是因为你一个人怎么看都没事,但是人多了换来换去的操作一本书数据就乱了。可能我的解释很粗糙,但是道理应该是一样的。 ### 那他是单线程的,我们现在服务器都是多核的,那不是很浪费? 是的他是单线程的,但是,我们可以通过在单机开多个**Redis实例**嘛。 ### 既然提到了单机会有瓶颈,那你们是怎么解决这个瓶颈的? 我们用到了集群的部署方式也就是**Redis cluster**,并且是主从同步读写分离,类似**Mysql**的主从同步,**Redis cluster** 支撑 N 个 **Redis master node**,每个**master node**都可以挂载多个 **slave node**。 这样整个 **Redis** 就可以横向扩容了。如果你要支撑更大数据量的缓存,那就横向扩容更多的 **master** 节点,每个 **master** 节点就能存放更多的数据了。 ### 哦?那问题就来了,他们之间是怎么进行数据交互的?以及Redis是怎么进行持久化的?Redis数据都在内存中,一断电或者重启不就木有了嘛? 是的,持久化的话是**Redis**高可用中比较重要的一个环节,因为**Redis**数据在内存的特性,持久化必须得有,我了解到的持久化是有两种方式的。 - RDB:**RDB** 持久化机制,是对 **Redis** 中的数据执行**周期性**的持久化。 - AOF:**AOF** 机制对每条写入命令作为日志,以 **append-only** 的模式写入一个日志文件中,因为这个模式是只追加的方式,所以没有任何磁盘寻址的开销,所以很快,有点像Mysql中的**binlog**。 两种方式都可以把**Redis**内存中的数据持久化到磁盘上,然后再将这些数据备份到别的地方去,**RDB**更适合做**冷备**,**AOF**更适合做**热备**,比如我杭州的某电商公司有这两个数据,我备份一份到我杭州的节点,再备份一个到上海的,就算发生无法避免的自然灾害,也不会两个地方都一起挂吧,这**灾备**也就是**异地容灾**,地球毁灭他没办法。 **tip:两种机制全部开启的时候,Redis在重启的时候会默认使用AOF去重新构建数据,因为AOF的数据是比RDB更完整的。** ### 那这两种机制各自优缺点是啥? 我先说**RDB**吧 #### 优点: 他会生成多个数据文件,每个数据文件分别都代表了某一时刻**Redis**里面的数据,这种方式,有没有觉得很适合做**冷备**,完整的数据运维设置定时任务,定时同步到远端的服务器,比如阿里的云服务,这样一旦线上挂了,你想恢复多少分钟之前的数据,就去远端拷贝一份之前的数据就好了。 **RDB**对**Redis**的性能影响非常小,是因为在同步数据的时候他只是**fork**了一个子进程去做持久化的,而且他在数据恢复的时候速度比**AOF**来的快。 #### 缺点: **RDB**都是快照文件,都是默认五分钟甚至更久的时间才会生成一次,这意味着你这次同步到下次同步这中间五分钟的数据都很可能全部丢失掉。**AOF**则最多丢一秒的数据,**数据完整性**上高下立判。 还有就是**RDB**在生成数据快照的时候,如果文件很大,客户端可能会暂停几毫秒甚至几秒,你公司在做秒杀的时候他刚好在这个时候**fork**了一个子进程去生成一个大快照,哦豁,出大问题。 我们再来说说**AOF** ####优点: 上面提到了,**RDB**五分钟一次生成快照,但是**AOF**是一秒一次去通过一个后台的线程`fsync`操作,那最多丢这一秒的数据。 **AOF**在对日志文件进行操作的时候是以`append-only`的方式去写的,他只是追加的方式写数据,自然就少了很多磁盘寻址的开销了,写入性能惊人,文件也不容易破损。 **AOF**的日志是通过一个叫**非常可读**的方式记录的,这样的特性就适合做**灾难性数据误删除**的紧急恢复了,比如公司的实习生通过**flushall**清空了所有的数据,只要这个时候后台重写还没发生,你马上拷贝一份**AOF**日志文件,把最后一条**flushall**命令删了就完事了。 **tip:我说的命令你们别真去线上系统操作啊,想试去自己买的服务器上装个Redis试,别到时候来说,敖丙真是个渣男,害我把服务器搞崩了,Redis官网上的命令都去看看,不要乱试!!!** ####缺点: 一样的数据,**AOF**文件比**RDB**还要大。 **AOF**开启后,**Redis**支持写的**QPS**会比**RDB**支持写的要低,他不是每秒都要去异步刷新一次日志嘛**fsync**,当然即使这样性能还是很高,我记得**ElasticSearch**也是这样的,异步刷新缓存区的数据去持久化,为啥这么做呢,不直接来一条怼一条呢,那我会告诉你这样性能可能低到没办法用的,大家可以思考下为啥哟。 ###那两者怎么选择? ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8p9gc6e9pj30go0b4js2.jpg) 小孩子才做选择,**我全都要**,你单独用**RDB**你会丢失很多数据,你单独用**AOF**,你数据恢复没**RDB**来的快,真出什么时候第一时间用**RDB**恢复,然后**AOF**做数据补全,真香!冷备热备一起上,才是互联网时代一个高健壮性系统的王道。 ### 看不出来年纪轻轻有点东西的呀,对了我听你提到了高可用,Redis还有其他保证集群高可用的方式么? !!!晕 自己给自己埋个坑(其实是明早就准备好了,故意抛出这个词等他问,就怕他不问)。 假装思考一会(**不要太久,免得以为你真的不会**),哦我想起来了,还有哨兵集群**sentinel**。 哨兵必须用三个实例去保证自己的健壮性的,哨兵+主从并**不能保证数据不丢失**,但是可以保证集群的**高可用**。 为啥必须要三个实例呢?我们先看看两个哨兵会咋样。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8p9ghsrztj30930773yg.jpg) master宕机了 s1和s2两个哨兵只要有一个认为你宕机了就切换了,并且会选举出一个哨兵去执行故障,但是这个时候也需要大多数哨兵都是运行的。 那这样有啥问题呢?M1宕机了,S1没挂那其实是OK的,但是整个机器都挂了呢?哨兵就只剩下S2个裸屌了,没有哨兵去允许故障转移了,虽然另外一个机器上还有R1,但是故障转移就是不执行。 经典的哨兵集群是这样的: ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8p9gj3qyaj309309pwei.jpg) M1所在的机器挂了,哨兵还有两个,两个人一看他不是挂了嘛,那我们就选举一个出来执行故障转移不就好了。 暖男我,小的总结下哨兵组件的主要功能: - 集群监控:负责监控 Redis master 和 slave 进程是否正常工作。 - 消息通知:如果某个 **Redis** 实例有故障,那么哨兵负责发送消息作为报警通知给管理员。 - 故障转移:如果 master node 挂掉了,会自动转移到 slave node 上。 - 配置中心:如果故障转移发生了,通知 client 客户端新的 master 地址。 ### 我记得你还提到了主从同步,能说一下主从之间的数据怎么同步的么? 面试官您的记性可真是一级棒呢,我都要忘了你还记得,我特么谢谢你,提到这个,就跟我前面提到的数据持久化的**RDB**和**AOF**有着比密切的关系了。 我先说下为啥要用主从这样的架构模式,前面提到了单机**QPS**是有上限的,而且**Redis**的特性就是必须支撑读高并发的,那你一台机器又读又写,**这谁顶得住啊**,不当人啊!但是你让这个master机器去写,数据同步给别的slave机器,他们都拿去读,分发掉大量的请求那是不是好很多,而且扩容的时候还可以轻松实现水平扩容。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8p9gedwerj312y0hodhm.jpg) **回归正题,他们数据怎么同步的呢?** 你启动一台slave 的时候,他会发送一个**psync**命令给master ,如果是这个slave第一次连接到master,他会触发一个全量复制。master就会启动一个线程,生成**RDB**快照,还会把新的写请求都缓存在内存中,**RDB**文件生成后,master会将这个**RDB**发送给slave的,slave拿到之后做的第一件事情就是写进本地的磁盘,然后加载进内存,然后master会把内存里面缓存的那些新命名都发给slave。 ###数据传输的时候断网了或者服务器挂了怎么办啊? 传输过程中有什么网络问题啥的,会自动重连的,并且连接之后会把缺少的数据补上的。 **大家需要记得的就是,RDB快照的数据生成的时候,缓存区也必须同时开始接受新请求,不然你旧的数据过去了,你在同步期间的增量数据咋办?是吧?** ### 那说了这么多你能说一下他的内存淘汰机制么,来手写一下LRU代码? ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8p9gjm0cwg308c08cmx3.gif) #### 手写LRU?你是不是想直接跳起来说一句:Are U F**k Kidding me? 这个问题是我在蚂蚁金服三面的时候亲身被问过的问题,不知道大家有没有被怼到过这个问题。 **Redis**的过期策略,是有**定期删除+惰性删除**两种。 定期好理解,默认100s就随机抽一些设置了过期时间的key,去检查是否过期,过期了就删了。 ### 为啥不扫描全部设置了过期时间的key呢? 假如Redis里面所有的key都有过期时间,都扫描一遍?那太恐怖了,而且我们线上基本上也都是会设置一定的过期时间的。全扫描跟你去查数据库不带where条件不走索引全表扫描一样,100s一次,Redis累都累死了。 ###如果一直没随机到很多key,里面不就存在大量的无效key了? 好问题,**惰性删除**,见名知意,惰性嘛,我不主动删,我懒,我等你来查询了我看看你过期没,过期就删了还不给你返回,没过期该怎么样就怎么样。 ### 最后就是如果的如果,定期没删,我也没查询,那可咋整? **内存淘汰机制**! 官网上给到的内存淘汰机制是以下几个: - **noeviction**:返回错误当内存限制达到并且客户端尝试执行会让更多内存被使用的命令(大部分的写入指令,但DEL和几个例外) - **allkeys-lru**: 尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。 - **volatile-lru**: 尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放。 - **allkeys-random**: 回收随机的键使得新添加的数据有空间存放。 - **volatile-random**: 回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。 - **volatile-ttl**: 回收在过期集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。 如果没有键满足回收的前提条件的话,策略**volatile-lru**, **volatile-random**以及**volatile-ttl**就和noeviction 差不多了。 至于**LRU**我也简单提一下,手写实在是太长了,大家可以去**Redis官网**看看,我把**近视LUR**效果给大家看看 **tip:Redis为什么不使用真实的LRU实现是因为这需要太多的内存。不过近似的LRU算法对于应用而言应该是等价的。使用真实的LRU算法与近似的算法可以通过下面的图像对比。** ![LRU comparison](https://tva1.sinaimg.cn/large/006y8mN6ly1g8p9gjzdsvj30nq0chmzd.jpg) 你可以看到三种点在图片中, 形成了三种带. - 浅灰色带是已经被回收的对象。 - 灰色带是没有被回收的对象。 - 绿色带是被添加的对象。 - 在**LRU**实现的理论中,我们希望的是,在旧键中的第一半将会过期。**Redis**的**LRU**算法则是概率的过期旧的键。 你可以看到,在都是五个采样的时候Redis 3.0比Redis 2.8要好,Redis2.8中在最后一次访问之间的大多数的对象依然保留着。使用10个采样大小的Redis 3.0的近似值已经非常接近理论的性能。 注意LRU只是个预测键将如何被访问的模型。另外,如果你的数据访问模式非常接近幂定律,大部分的访问将集中在一个键的集合中,LRU的近似算法将处理得很好。 其实在大家熟悉的**LinkedHashMap**中也实现了Lru算法的,实现如下: ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8p9gl0t7nj30qw08p3z4.jpg) 当容量超过100时,开始执行**LRU**策略:将最近最少未使用的 **TimeoutInfoHolder** 对象 **evict** 掉。 真实面试中会让你写LUR算法,你可别搞原始的那个,那真TM多,写不完的,你要么怼上面这个,要么怼下面这个,找一个数据结构实现下Java版本的LRU还是比较容易的,知道啥原理就好了。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8orgm8oj0j30p10f7wfq.jpg) ## 面试结束 ### 小伙子,你确实有点东西,HRBP会联系你的,请务必保持你的手机畅通好么? 好的谢谢面试官,面试官真好,我还想再面几次,噗此。 能回答得这么全面这么细节还是忍不住点赞 **(暗示点赞,每次都看了不点赞,你们想白嫖我么?你们好坏喲,不过我好喜欢)** ## 总结 好了,我们玩归玩,闹归闹,别拿面试开玩笑,我这么写是为了节目效果,大家面试请认真对待。 这一期是这期没前面好理解了对吧,我就在自己的服务器上启动了,然后再去官网看看命令一顿瞎操作的,查阅了部分资料,这里给大家推荐几本经典的Redis入门的书籍和我参考的资料。 - [Redis中文官网](http://www.redis.cn/) - 《Redis入门指南(第2版)》 - 《Redis实战》 - 《Redis设计与实现》 - 《[大型网站技术架构](https://github.com/doocs/technical-books#architecture)——李智慧》 - 《[Redis 设计与实现](https://github.com/doocs/technical-books#database)——黄健宏》 - 《[Redis 深度历险](https://github.com/doocs/technical-books#database)——钱文品》 - 《[亿级流量网站架构核心技术](https://github.com/doocs/technical-books#architecture)——张开涛》 - 《[中华石杉](https://github.com/doocs/advanced-java)——石杉》 不出意外的话这是Redis的倒数第二期,最后一期不知道写啥还没想好,我得好好想想,加上最近不是双十一嘛得加加班,**你看看开头的我,多可怜,那还不点个赞?买个服务器**?不确定下一期多久出,想早点看到更新的小伙伴可以去公众号**催更**,公众号提前一到两天更新。 ### END 好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是**人才**,我后面会每周都更新几篇《**吊打面试官**》系列和**Java技术栈**相关的文章。如果你有什么想知道的,也可以**留言**给我,我一有时间就会写出来,我们共同进步。 非常感谢**靓仔/靓女**您能看到这里,如果这个文章写得还不错,觉得敖丙有点东西 **求点赞** **求关注** **求分享** **求留言** **(对我非常有用)**各位的支持和认可,就是我创作的最大动力,我们下篇文章见! 敖丙 | 文 【原创】 ------ > 每周都会持续更新《吊打面试官》系列可以关注我的公众号第一时间阅读和催更,公众号比博客提前一到两天更新,也可以在公众号回复【人才】加入人才交流群,里面都是人才长得好看说话还好听,进去就像回家了一样,就业和工作上有什么问题也可以直接滴滴我,我也是个新人,不过不影响我们一起进步。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8p9gftfchj30p00dwjuj.jpg) ================================================ FILE: docs/all/缓存/知识点之外的缓存之路.md ================================================ [缓存和数据库一致性问题](https://mp.weixin.qq.com/s/D4Ik6lTA_ySBOyD3waNj1w) [一个架构师的缓存修炼之路](https://mp.weixin.qq.com/s/Ls-Bld0Q6OQ1VD_az3iqbg) [再见了Antirez我永远的神](https://mp.weixin.qq.com/s/u3Ws1FGhJVIJdpM8IHI7OQ) [敖丙在蘑菇街的redis技术分享](https://mp.weixin.qq.com/s/xS2dqi5IG10AF7cHbzguAA) [课代表总结](https://mp.weixin.qq.com/s/lLTbL5YW0gIJu9Yx2T2OtA) [Redis最佳实践:7个维度+43条使用规范,带你彻底玩转Redis](https://mp.weixin.qq.com/s/8EN9vrZMhCK-40o_OdnOlg) [布隆过滤器过时了,未来属于布谷鸟过滤器?](https://mp.weixin.qq.com/s/XxY3b5FoVXCvHJWMxQH29g) [什么鬼,面试官竟然让敖丙用Redis实现一个消息队列!!?](https://mp.weixin.qq.com/s/5NOTLJ6AM3QJfhvXMSR-MA) [我最爱用的一款 Redis 可视化管理工具!好用到爆!!!](https://mp.weixin.qq.com/s/LDkcDO75gsivs04XXNLzTA) ================================================ FILE: docs/all/职场杂谈.md ================================================ [提离职,涨薪 走,别回头](https://mp.weixin.qq.com/s/1rUYxXbb0PaVOkmDQAxHpg) [我对外包的看法](https://mp.weixin.qq.com/s/lC6F1HVmAGQzXsFbpZz9Qw) [阿里五年老员工有什么话想对大家说?](https://mp.weixin.qq.com/s/9vPZd1q1vpKuE2qZazLQmA) [读研or工作?](https://mp.weixin.qq.com/s/Sn7_FcNW7Sq3WVm_LgwVrA) [敖丙的前前前同事因为几行代码坐牢了](https://mp.weixin.qq.com/s/UJVD7o-8-Oy0bWeceo7bcA) [应届毕业生工作7个月小结](https://mp.weixin.qq.com/s/XcrBvdlh1At_V42qfQZ9Kw) [蘑菇街被裁员工自述:若是有缘,江湖再见](https://mp.weixin.qq.com/s/WsMS30S1qDZCs-r5KaYmGA) [蘑菇街又裁员了](https://mp.weixin.qq.com/s/-axhH958qOS8daWULP11zA) [麻了,我的爱豆也塌房了](https://mp.weixin.qq.com/s/otVb5k76z5ejTAQZSXNpzg) [在国企里面当程序猿是一种怎样的体验?](https://mp.weixin.qq.com/s/HJ9wzgW6TAc6Cf6B8oZEdw) [跳槽季,应不应该跳,怎么跳?](https://mp.weixin.qq.com/s/enq_fh0hq2gMSgeXfunP6Q) [让你自制力提升300%的学习方法](https://mp.weixin.qq.com/s/vseVDxl3BjESeZsdKLd1eA) [教你在服务器搭建个人面试项目](https://mp.weixin.qq.com/s/D0bxHiXJKU64SinO1mh7Mw) [程序员只能吃青春饭?30岁后出路在何方?](https://mp.weixin.qq.com/s/MvA12XM_ZzOG_7ygTmzIfA) [学历对程序员重要么?](https://mp.weixin.qq.com/s/HafYjNNoBwuau-MI6W8EnQ) [有哪些事情是你成为程序员之后才知道的?](https://mp.weixin.qq.com/s/UIbINxc-lEktnXLJhLceZQ) [天天加班却不受重用,老板到底喜欢什么样的员工?](https://mp.weixin.qq.com/s/3VDS3tku0ZYZ4M_v760TEQ) [纵使社会虐我千百遍,我依然待它如初恋](https://mp.weixin.qq.com/s/RcL3Y6BZNSBQZJq8V3LCyw) [国家何时整治程序员的高薪现象?](https://mp.weixin.qq.com/s/10DvwjXysmGzLa6AoSsXNw) [大学毕业是去大城市好还是回小城市好?](https://mp.weixin.qq.com/s/-bva0Cako549qUqK5BIHkw) [大二那年,我发现学生思维在职场行不通](https://mp.weixin.qq.com/s/lr6qlbB6loJ1DMbdV-_Avw) [B站崩了,如何防止类似事故的出现?](https://mp.weixin.qq.com/s/UZyUclzkKIRhUM-8vioxvg) [每日灵魂拷问:“工作=有钱=快乐?”](https://mp.weixin.qq.com/s/QW8a0ULgSo9uNyswril3Fg) [比渣男pua更可怕的,是职场pua](https://mp.weixin.qq.com/s/zv3hhsjCSrzrFIe3rEZRYQ) [你热爱编程么?我先来:爱过](https://mp.weixin.qq.com/s/MFtq7jEqnhfi-3OnTCuY5g) ================================================ FILE: docs/all/计算机网络/HTTP/HTTPS.md ================================================ [图解HTTP协议](https://mp.weixin.qq.com/s/AK1Pb9rx0q5Hf8dq6HNOhw) [全网最透彻HTTPS(面试常问)](https://mp.weixin.qq.com/s/21JaXwdfSjItj5SgOwhapg) [一文领略 HTTP 的前世今生](https://mp.weixin.qq.com/s/ljtDM1d2KgtxAAhwUFSHkg) [硬核!30 张图解 HTTP 常见的面试题](https://mp.weixin.qq.com/s/amOya0M00LwpL5kCS96Y6w) [面试 HTTP ,99% 的面试官都爱问这些问题](https://mp.weixin.qq.com/s/t7ZYT6wBBbFYVBPOSztpRg) [中间人攻击](https://mp.weixin.qq.com/s/Mi3zM-oyMoxxdzSlSnHpQQ) ================================================ FILE: docs/all/计算机网络/TCP/IP.md ================================================ [万字长文 | 23 个问题 TCP 疑难杂症全解析](https://mp.weixin.qq.com/s/LUtk6u_zv0w8g8GIGWEuCw) [实战!敖丙用“大白鲨”让你看见 TCP](https://mp.weixin.qq.com/s/jTDU-zxP1INTYLpGLypjXQ) [面试官:换人!他连 TCP 这几个参数都不懂](https://mp.weixin.qq.com/s/ytV7RZSyFXyvPW_lKhv8hw) [TCP/IP 基础知识总结](https://mp.weixin.qq.com/s/lkX2Mb2aCj8ugOaRmVVBqw) [TCP 半连接队列和全连接队列满了会发生什么?又该如何应对?](https://mp.weixin.qq.com/s/tRXlq1hErqKQLMMLcxoXvg) [跟着动画学习TCP三次握手和四次挥手](https://mp.weixin.qq.com/s/NL7Jzh0lYoA395yzaGxBHw) [敖丙用近 40 张图解被问千百遍的 TCP 三次握手和四次挥手面试题](https://mp.weixin.qq.com/s/rX3A_FA19n4pI9HicIEsXg) [你还在为 TCP 重传、滑动窗口、流量控制、拥塞控制发愁吗?看完图解就不愁了](https://mp.weixin.qq.com/s/HjOUsKn8eLfDogbBX3hPnA) [IP 基础知识“全家桶”,敖丙45 张图一套带走你](https://mp.weixin.qq.com/s/p9oA9YTZLoXVooUOSNQCMg) [敖丙听说你 ping 用的很 6 ?给我图解一下 ping 的工作原理!](https://mp.weixin.qq.com/s/3KF0IxLum8EOtcF0ZNIiPA) [一文搞定 UDP 和 TCP 高频面试题!](https://mp.weixin.qq.com/s/BK2H7JQIo6zOrXYg9RcbeA) ================================================ FILE: docs/all/计算机网络/网络基础.md ================================================ [计算机网络](https://mp.weixin.qq.com/s/WfcozFAdXbOJ0EIcZEfLVg) [拔掉网线后, 原本的 TCP 连接还存在吗?](https://mp.weixin.qq.com/s/0YFsUWL6e9r_aDrCZeTK3w) [熬夜整理的20道计算机网络面试题](https://mp.weixin.qq.com/s/3FTuMZaUrT9Vw-ZScJkQbg) [什么是单点登录(SSO)](https://mp.weixin.qq.com/s/drPVkRbCsDIlX6Ls2pDmqA) [键入网址后,期间发生了什么?](https://mp.weixin.qq.com/s/I6BLwbIpfGEJnxjDcPXc1A) ================================================ FILE: docs/all/设计模式和使用场景.md ================================================ [单例模式](https://mp.weixin.qq.com/s/dW0L-PoBeTFHhD29HJO0BQ) [工厂模式](https://mp.weixin.qq.com/s/j42vn-A_rdWZP3aixXB8Ag) [流程引擎](https://mp.weixin.qq.com/s/b8xa3o4fKDme2438oJTakw) [建造者模式](https://mp.weixin.qq.com/s/h7iEyxgN34FPn191S8qUpA) [原型模式](https://mp.weixin.qq.com/s/fORmbucHuPVMS2z3q-mV3A) [责任链模式](https://mp.weixin.qq.com/s/l9EdvpAMukIDOgaN7x3b4w) [观察者模式](https://mp.weixin.qq.com/s/_hVGgJxefoVXFHFNXC-U6A) [策略模式](https://mp.weixin.qq.com/s/AFbt7VJMASenD2S8KbPKJQ) [策略模式2.0](https://mp.weixin.qq.com/s/HOnQf-S-w6A19tGnoIXBrg) [模板方法](https://mp.weixin.qq.com/s/oGm4ET-NDp4BSVi0p2MZxA) [迭代器模式](https://mp.weixin.qq.com/s/QHgg4CcU6VlA0gtzzQ_JLQ) [命令模式&中介者模式](https://mp.weixin.qq.com/s/dtmeTLsML6TYM8F8ch2FGQ) [对象池模式&解释器模式](https://mp.weixin.qq.com/s/a1kVL71OlUwZJrsyCE0I-A) [代理模式](https://mp.weixin.qq.com/s/lNw1yjn_xMOLpzbunaS10A) [使用Java8改造后的模板方法模式真的是yyds](https://mp.weixin.qq.com/s/O0sIOyE2rgTPyj54_QRx_g) ================================================ FILE: docs/all/集合框架/ArrayList.md ================================================ [ArrayList](https://mp.weixin.qq.com/s/WoGclm7SsbURGigI3Mwr3w) [ArrayList源码解析,老哥,来一起复习一哈?](https://mp.weixin.qq.com/s/3PNWmtS-bEZgZjd9wyMiDA) ================================================ FILE: docs/all/集合框架/ConcurrentHashMap.md ================================================ [ConcurrentHashMap & Hashtable(文末送书)](https://mp.weixin.qq.com/s/AixdbEiXf3KfE724kg2YIw) [我就知道面试官接下来要问我 ConcurrentHashMap 底层原理了](https://mp.weixin.qq.com/s/My4P_BBXDnAGX1gh630ZKw) ================================================ FILE: docs/all/集合框架/HashMap.md ================================================ [HashMap](https://mp.weixin.qq.com/s/0Gf2DzuzgEx0i3mHVvhKNQ) [面试官:HashMap 为什么线程不安全?](https://mp.weixin.qq.com/s/VtIpj-uuxFj5Bf6TmTJMTw) [万万没想到,HashMap默认容量的选择,竟然背后有这么多思考!?](https://mp.weixin.qq.com/s/ktre8-C-cP_2HZxVW5fomQ) ================================================ FILE: docs/all/集合框架/Vector.md ================================================ [面试官问我同步容器(如Vector)的所有操作一定是线程安全的吗?我懵了!](https://mp.weixin.qq.com/s/0cMrE87iUxLBw_qTBMYMgA) ================================================ FILE: docs/all/集合框架/基础.md ================================================ [Java 集合框架看这一篇就够了](https://mp.weixin.qq.com/s/bVOSat47L0Hskfx9akAN6Q) [Java 集合中「堆」是啥?](https://mp.weixin.qq.com/s/eSCVJclB-IaJYkPKsWSkRA) [别这样创建集合了,非常容易内存泄露](https://mp.weixin.qq.com/s/pFnme5EPWNtfKspI4Y1W-w) ================================================ FILE: docs/all/面试技巧/加分项.md ================================================ [面试官喜欢怎样的人](https://mp.weixin.qq.com/s/2mdcZnlTWCDYejGkZCdNOQ) ================================================ FILE: docs/all/面试技巧/简历.md ================================================ [简历怎么写?](https://mp.weixin.qq.com/s/0pNv6pMnenKn1A9PE61VnQ) [能不能好好写简历?](https://mp.weixin.qq.com/s/LxVeT49GMKu72PZJ-rDHpA) [简历这样写,技术人都不直男了!](https://mp.weixin.qq.com/s/tl4DpsQPVh-bvlFzNsrzvw) [10个简历小技巧,成为面试战神](https://mp.weixin.qq.com/s/NyJ2gLDLIomlgkIFYWVvJg) [简历制作](https://mp.weixin.qq.com/s/1TPh2mEnSgZ2ZfccVUWicg) [敖丙迟早被你们气死](https://mp.weixin.qq.com/s/KeIJDrHbMH_BRUKLnCqExw) ================================================ FILE: docs/all/面试技巧/语言组织.md ================================================ [自我介绍](https://mp.weixin.qq.com/s/br7Ak88kA5GkZ26hxwKUiw) [面试官希望你做怎样的自我介绍?](https://mp.weixin.qq.com/s/Pyi-lbocEr_vFeGxUkSl8A) ================================================ FILE: docs/all/面试技巧/面试流程.md ================================================ [互联网公司面试流程 注意事项 加分点 防骗指南](https://mp.weixin.qq.com/s/jhmpG2bBb4aXoUJzahC0Rg) [互联网公司面试流程&加分点,别跟敖丙一样被无良HR坑了](https://mp.weixin.qq.com/s/7Rq8QR58Adi5WGHRlnhDeQ) ================================================ FILE: docs/all/面试真题&面经分享/bilibili.md ================================================ [B站五面面经](https://mp.weixin.qq.com/s/tMPwanTRC3pj3X4Rx4SeTQ) [「面经」不小心拿到了B站意向书](https://mp.weixin.qq.com/s/VOVUQ2cbYX5UXrrWLIHFXQ) ================================================ FILE: docs/all/面试真题&面经分享/京东.md ================================================ [京东二面:为什么需要分布式ID?你项目中是怎么做的?](https://mp.weixin.qq.com/s/-04X2NS165vedIGb85q7QQ) ================================================ FILE: docs/all/面试真题&面经分享/其他.md ================================================ [Java后端实习面经,电子科大大三读者投稿!看了之后感触颇深!很开心!](https://mp.weixin.qq.com/s/ttKI82_CQdMmxoBw8TS92g) [敖丙8年经验读者,疫情期间面20家大厂总结](https://mp.weixin.qq.com/s/AQvDX0n8wBBaWl2OmcpnrA) [被裁一个月面试的面经和经验分享](https://mp.weixin.qq.com/s/MkjSYc0JA1-VErX3lJzPmQ) [上岸哈工大!!](https://mp.weixin.qq.com/s/MNm3k1s8CrrI6vF-47cvcg) ================================================ FILE: docs/all/面试真题&面经分享/国企.md ================================================ [怎么面国企或银行?](https://mp.weixin.qq.com/s/d4OewL8-gCm_IkqDqufvsQ) ================================================ FILE: docs/all/面试真题&面经分享/外企.md ================================================ [Bigo的Java面试,我挂在了第三轮技术面上......](https://mp.weixin.qq.com/s/3_HnVzGm16zU2zhk7BnwFw) [我经历的7轮Google面试](https://mp.weixin.qq.com/s/yYy5YUeA3VAAQMtnMhaFUQ) ================================================ FILE: docs/all/面试真题&面经分享/字节跳动面试题.md ================================================ [读者字节、滴滴面经(已拿offer)](https://mp.weixin.qq.com/s/sWtI7M8K1iajreEo3LtwIw) [敖丙读者只复习了半年,怒拿字节跳动Offer](https://mp.weixin.qq.com/s/g6qFbEWfJeahzuzjECuvDg) [春招字节跳动、蘑菇街四轮面试,分别问了啥?](https://mp.weixin.qq.com/s/xBC1IRr6v8hmIJ9lqCp5pQ) [蚂蚁金服2019实习生面经总结(已拿口头offer)](https://mp.weixin.qq.com/s/0opKiGbKjAfJkRVeVHzpZg) [2020 字节跳动后端面经分享!已拿 offer!](https://mp.weixin.qq.com/s/hr2pDs2wsiHQuDzW7jmOow) [百度、字节跳动等后台面经,已拿Offer!](https://mp.weixin.qq.com/s/BiaXzNw5rp69CPPNBRii3g) [学妹字节、蘑菇街、阿里、莉莉丝...面经](https://mp.weixin.qq.com/s/WOIkWLsA7fyyoHPyNT7HdQ) [双非本科逆袭 拿下ACM金牌、字节和旷视offer、保研985!](https://mp.weixin.qq.com/s/P2lTpC7yQ7VD8if_rMUcPg) [字节一面:“为什么网络要分层?每一层的职责、包含哪些协议?”](https://mp.weixin.qq.com/s/QNqbUI1jxOhlGQvGyssK2w) ================================================ FILE: docs/all/面试真题&面经分享/小红书.md ================================================ [小红书](https://mp.weixin.qq.com/s/3OTwlqCpJHEwtUvSQn1xmw) ================================================ FILE: docs/all/面试真题&面经分享/拼多多面试题.md ================================================ [读者一个月拿到阿里字节拼多多offer](https://mp.weixin.qq.com/s/kSiLvSrAMwrHLwxvesyjBw) ================================================ FILE: docs/all/面试真题&面经分享/校招面试题.md ================================================ [十道校招常见的面试题](https://mp.weixin.qq.com/s/wTKSvziyEXrSyf21iMjhZQ) ================================================ FILE: docs/all/面试真题&面经分享/百度.md ================================================ [二本读者实习遭领导歧视,逆袭进百度!](https://mp.weixin.qq.com/s/el7wBmABxzsUng_QLdUtaQ) [京东+百度一面,不小心都拿了Offer](https://mp.weixin.qq.com/s/VVonP6MgGRUnBnWa2ukkyw) ================================================ FILE: docs/all/面试真题&面经分享/网易.md ================================================ [双非院校非科班的学弟,刚刚拿到了腾讯、网易、美团等大厂Offer](https://mp.weixin.qq.com/s/TzaV0dfbWw2zHiF55vq_kA) ================================================ FILE: docs/all/面试真题&面经分享/美团.md ================================================ [美团面经](https://mp.weixin.qq.com/s/gSG_ZzZN7Ek2HEGtdi_Nkg) [3 年经验的 Java 后端妹子,横扫阿里、滴滴、美团,看完面经我觉得敖丙是垃圾!](https://mp.weixin.qq.com/s/oAnGGBkre7Z4VkhME-TgzQ) ================================================ FILE: docs/all/面试真题&面经分享/腾讯面试题.md ================================================ [苦修月余,斩获bigo、腾讯offer,面经奉上!](https://mp.weixin.qq.com/s/EOQafymh7xVtxblstTbQUA) [来自朋友最近阿里、腾讯、美团等P7岗位面试题](https://mp.weixin.qq.com/s/yb6MtKMrCl2rAUZVLIfJow) [研二师弟拿下微信 offer](https://mp.weixin.qq.com/s/0XJHz2seZAw4bDEA2i_i2Q) [腾讯二面:大白你了解共享内存吗?](https://mp.weixin.qq.com/s/BvV5HnwEOATPDFQoI4TYZA) ================================================ FILE: docs/all/面试真题&面经分享/阿里巴巴面试题.md ================================================ [淘宝|蚂蚁|菜鸟|盒马|嘀嘀|饿了么面经(已拿多个offer)](https://mp.weixin.qq.com/s/oEGSxv5KuNI9BsCxpdi82A) [互联网寒冬,敖丙挚友7面阿里,终获Offer](https://mp.weixin.qq.com/s/gYpZCSYK3YYEvGFFeHdFJQ) [一道蚂蚁金服笔试题,还行,中等难度](https://mp.weixin.qq.com/s/16cZLY9_uJwhi50RJXknIg) [上岸腾讯 PCG 和阿里云!](https://mp.weixin.qq.com/s/zpdLHtqJN5H3iO0VMSzMJw) [一份还热乎的蚂蚁金服面经(已拿Offer)!附答案!!](https://mp.weixin.qq.com/s/HtLwChoLzqhbM4pKldLDng) [我和阿里面试官的一次“邂逅”(附问题详解)](https://mp.weixin.qq.com/s/-DZj158-LOQmnCayf1_n3A) [二本 两年经验读者 阿里P6面经](https://mp.weixin.qq.com/s/WOS6HMdt1-mAGuLiC30_-Q) [小姐姐面试蚂蚁金服被虐经历,心疼...](https://mp.weixin.qq.com/s/nzvg3e-RgM59zs9WSeUpLg) [一位读者小姐姐的阿里面经分享,快被问哭了!(附部分问题详解)](https://mp.weixin.qq.com/s/jnegDdp4OMSKynZl8OBIpw) [朋友怎样刚拿饿了么P7 offer,然后途虎一轮游的](https://mp.weixin.qq.com/s/e6MpOuxeZ53fAatNBhiC9A) [朋友离职了,一周面了 20 多场,新鲜面经奉上](https://mp.weixin.qq.com/s/muXoICVmoXxm3XNiNHB5lg) [阿里云二面:zookeeper一致性算法](https://mp.weixin.qq.com/s/J2is0iapoxn5ZuQySX9SKw) [敖丙读者一个月面试近20家大中小厂,在互联网寒冬突破重围,成功上岸阿里云 !](https://mp.weixin.qq.com/s/F2TiFw-LYFXMRj_hsD-TIw) ================================================ FILE: docs/basics/HashMap.md ================================================ > 你知道的越多,你不知道的越多 > 点赞再看,养成习惯 > 本文 **GitHub** [https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily) 上已经收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西。 ## 前言 作为一个在互联网公司面一次拿一次Offer的面霸,打败了无数竞争对手,每次都只能看到无数落寞的身影失望的离开,略感愧疚(**请允许我使用一下夸张的修辞手法**)。 于是在一个寂寞难耐的夜晚,我痛定思痛,决定开始写互联网技术栈面试相关的文章,希望能帮助各位读者以后面试势如破竹,对面试官进行360°的反击,吊打问你的面试官,让一同面试的同僚瞠目结舌,疯狂收割大厂Offer! 所有文章的名字只是我的噱头,我们应该有一颗谦逊的心,所以希望大家怀着空杯心态好好学,一起进步。 ### 正文 > 一个婀娜多姿,穿着衬衣的小姐姐,拿着一个精致的小笔记本,径直走过来坐在我的面前。 > > 看着眼前这个美丽的女人,心想这不会就是Java基础系列的面试官吧,真香。 > > 不过看样子这么年轻应该问不出什么深度的吧,嘻嘻。(哦?是么😏) ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9pbe6ko1mj30hk0dedmn.jpg) > 小伙子,听前面的面试官说了,你Redis和消息队列都回答得不错,看来还是有点东西。 美丽迷人的面试官您好,您见笑了,全靠看了敖丙的《吊打面试官》系列,不然我还真的回答不上很多原本的知识盲区,他真的有点东西。 > 面试官心想:哦,吊打面试官是么,那今天我就让你知道,吊打这两个字怎么写的吧,年轻人啊,提前为你感到惋惜。 > > 嗯嗯小帅比,虽然前面的技术栈没啥太大的瑕疵,不过未来很长的一段时间我会用一期期的基础教你做人的,你要准备好哟! > > 好了我们开始今天的面试吧,小伙子你了解数据结构中的HashMap么?能跟我聊聊他的结构和底层原理么? 切,这也太看不起我了吧,居然问这种低级问题,不过还是要好好回答。 嗯嗯面试官,我知道HashMap是我们非常常用的数据结构,由**数组和链表组合构成**的数据结构。 大概如下,数组里面每个地方都存了Key-Value这样的实例,在Java7叫Entry在Java8中叫Node。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9pchhbrp3j30ez02ngli.jpg) 因为他本身所有的位置都为null,在put插入的时候会根据key的hash去计算一个index值。 就比如我put(”帅丙“,520),我插入了为”帅丙“的元素,这个时候我们会通过哈希函数计算出插入的位置,计算出来index是2那结果如下。 > hash(“帅丙”)= 2 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9pcqyo35ij30et03d0sq.jpg) > 你提到了还有链表,为啥需要链表,链表又是怎么样子的呢? 我们都知道数组长度是有限的,在有限的长度里面我们使用哈希,哈希本身就存在概率性,就是”帅丙“和”丙帅“我们都去hash有一定的概率会一样,就像上面的情况我再次哈希”丙帅“极端情况也会hash到一个值上,那就形成了链表。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9pd6ckj3dj30eq06mmx8.jpg) 每一个节点都会保存自身的hash、key、value、以及下个节点,我看看Node的源码。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9pcz67kemj30fv097759.jpg) > 说到链表我想问一下,你知道新的Entry节点在插入链表的时候,是怎么插入的么? **java8之前是头插法**,就是说新来的值会取代原有的值,原有的值就顺推到链表中去,就像上面的例子一样,因为写这个代码的作者认为后来的值被查找的可能性更大一点,提升查找的效率。 但是,**在java8之后,都是所用尾部插入了。** > 为啥改为尾部插入呢? 这!!!这个问题,面试官可真会问!!!还好我饱读诗书,不然死定了! ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9qv6ra54qj3073073dfs.jpg) 有人认为是作者随性而为,没啥luan用,其实不然,其中暗藏玄机 首先我们看下HashMap的扩容机制: 帅丙提到过了,数组容量是有限的,数据多次插入的,到达一定的数量就会进行扩容,也就是resize。 > 什么时候resize呢? 有两个因素: - Capacity:HashMap当前长度。 - LoadFactor:负载因子,默认值0.75f。![](https://tva1.sinaimg.cn/large/006tNbRwly1g9pdw39rwjj30xi056wf3.jpg) 怎么理解呢,就比如当前的容量大小为100,当你存进第76个的时候,判断发现需要进行resize了,那就进行扩容,但是HashMap的扩容也不是简单的扩大点容量这么简单的。 > 扩容?它是怎么扩容的呢? 分为两步 - 扩容:创建一个新的Entry空数组,长度是原数组的2倍。 - ReHash:遍历原Entry数组,把所有的Entry重新Hash到新数组。 > 为什么要重新Hash呢,直接复制过去不香么? 卧槽这个问题!有点知识盲区呀! ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9qv87tgslj306y05h74b.jpg) 1x1得 1 1x2 得 2 .... 有了,我想起来敖丙那天晚上在我耳边的话了:假如我年少有为不自卑,懂得什么是珍贵,那些美梦没给你,我一生有愧....什么鬼! 小姐姐:是因为长度扩大以后,Hash的规则也随之改变。 Hash的公式---> index = HashCode(Key) & (Length - 1) 原来长度(Length)是8你位运算出来的值是2 ,新的长度是16你位运算出来的值明显不一样了。 扩容前: ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9pe8mz5zvj30en05jq30.jpg) 扩容后: ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9ped28o4xj30m003jq2y.jpg) > 说完扩容机制我们言归正传,为啥之前用头插法,java8之后改成尾插了呢? 卧槽,我以为她忘记了!居然还是被问到了! 我先举个例子吧,我们现在往一个容量大小为2的put两个值,负载因子是0.75是不是我们在put第二个的时候就会进行resize? 2*0.75 = 1 所以插入第二个就要resize了 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9pgqt9dmvj30zy01i74i.jpg) 现在我们要在容量为2的容器里面**用不同线程**插入A,B,C,假如我们在resize之前打个短点,那意味着数据都插入了但是还没resize那扩容前可能是这样的。 我们可以看到链表的指向A->B->C **Tip:A的下一个指针是指向B的** ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9pkaxgg5ij305007odfr.jpg) 因为resize的赋值方式,也就是使用了**单链表的头插入方式,同一位置上新元素总会被放在链表的头部位置**,在旧数组中同一条Entry链上的元素,通过重新计算索引位置后,有可能被放到了新数组的不同位置上。 就可能出现下面的情况,大家发现问题没有? B的下一个指针指向了A ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9phcpl968j309j054747.jpg) 一旦几个线程都调整完成,就可能出现环形链表 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9pkh8omjyj30al06pmx4.jpg) 如果这个时候去取值,悲剧就出现了——Infinite Loop。 > 诶卧槽,小伙子难不倒他呀! > > ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9qvbtqdxbg305k05ka9y.gif) > > 小伙子有点东西呀,但是你都都说了头插是JDK1.7的那1.8的尾插是怎么样的呢? 因为**java8之后链表有红黑树**的部分,大家可以看到代码已经多了很多if else的逻辑判断了,红黑树的引入巧妙的将原本O(n)的时间复杂度降低到了O(logn)。 **Tip**:红黑树的知识点同样很重要,还是那句话**不打没把握的仗**,限于篇幅原因,我就不在这里过多描述了,以后写到数据结构再说吧,不过要面试的仔,还是要准备好,反正我是经常问到的。 **使用头插**会改变链表的上的顺序,但是如果**使用尾插**,在扩容时会保持链表元素原本的顺序,就不会出现链表成环的问题了。 就是说原本是A->B,在扩容后那个链表还是A->B ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9plftqim3j309f04y0sn.jpg) Java7在多线程操作HashMap时可能引起死循环,原因是扩容转移后前后链表顺序倒置,在转移过程中修改了原来链表中节点的引用关系。 Java8在同样的前提下并不会引起死循环,原因是扩容转移后前后链表顺序不变,保持之前节点的引用关系。 > 那是不是意味着Java8就可以把HashMap用在多线程中呢? 我认为即使不会出现死循环,但是通过源码看到put/get方法都没有加同步锁,多线程情况最容易出现的就是:无法保证上一秒put的值,下一秒get的时候还是原值,所以线程安全还是无法保证。 > 小伙子回答得很好嘛,这都被你回答道了,面试这么多人都不知道头插和尾插,还是被你说出来了,可以可以。 面试官谬赞啊,要不是你这样**美若天仙**的面试官面试我,我估计是想不起来了。 > 我*,你套近乎? > > 小姐姐抿嘴一笑,小子你offer有了,耶稣都带不走你,我说的! > > ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9qvf9i9lcj308o08k3yh.jpg) > > 那我问你HashMap的默认初始化长度是多少? 我记得我在看源码的时候初始化大小是16 > 你那知道为啥是16么? 卧*,这叫什么问题啊?他为啥是16我怎么知道???你确定你没逗我? 我努力回忆源码,不知道有没有漏掉什么细节,以前在学校熬夜看源码的一幕幕在脑海里闪过,想起那个晚上在操场上,**跟我好了半个月的小绿**拉着我的手说:你就要当爸爸了。 等等,这都是什么鬼,哦哦哦,想起来了!!! **在JDK1.8的 236 行有1<<4就是16**,为啥用位运算呢?直接写16不好么? ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9plqfeg1pj3174054jsb.jpg) 我再次陷入沉思,疯狂脑暴,叮! 有了! 面试官您好,我们在创建HashMap的时候,阿里巴巴规范插件会提醒我们最好赋初值,而且最好是2的幂。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9pluoz10nj30py052gma.jpg) 这样是为了位运算的方便,**位与运算比算数计算的效率高了很多**,之所以选择16,是为了服务将Key映射到index的算法。 我前面说了所有的key我们都会拿到他的hash,但是我们怎么尽可能的得到一个均匀分布的hash呢? 是的我们通过Key的HashCode值去做位运算。 我打个比方,key为”帅丙“的十进制为766132那二进制就是 10111011000010110100 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9pm4zheo1j30hc03yaac.jpg) 我们再看下index的计算公式:index = HashCode(Key) & (Length- 1) ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9pmcjsou4j30ca01mjrd.jpg) 15的的二进制是1111,那10111011000010110100 &1111 十进制就是4 之所以用位与运算效果与取模一样,性能也提高了不少! > 那为啥用16不用别的呢? 因为在使用不是2的幂的数字的时候,Length-1的值是所有二进制位全为1,这种情况下,index的结果等同于HashCode后几位的值。 只要输入的HashCode本身分布均匀,Hash算法的结果就是均匀的。 这是为了**实现均匀分布**。 > 哟小家伙,知道的确实很多,那我问你个问题,为啥我们重写equals方法的时候需要重写hashCode方法呢? > > 你能用HashMap给我举个例子么? ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9qvh4jpagj305i058745.jpg) 这都能被他问到,还好我看了敖丙的系列呀,不然真的完了!!! 但是我想拖延点时间,只能**故做沉思**,仰望天空片刻,45°仰望天空的样子,说实话,我看到面试官都流口水了!可惜我是他永远得不到的男人,好了不装逼了。 我想起来了面试官! 因为在java中,所有的对象都是继承于Object类。Object类中有两个方法equals、hashCode,这两个方法都是用来比较两个对象是否相等的。 在未重写equals方法我们是继承了object的equals方法,**那里的 equals是比较两个对象的内存地址**,显然我们new了2个对象内存地址肯定不一样 - 对于值对象,==比较的是两个对象的值 - 对于引用对象,比较的是两个对象的地址 大家是否还记得我说的HashMap是通过key的hashCode去寻找index的,那index一样就形成链表了,也就是说”帅丙“和”丙帅“的index都可能是2,在一个链表上的。 我们去get的时候,他就是根据key去hash然后计算出index,找到了2,那我怎么找到具体的”帅丙“还是”丙帅“呢? **equals**!是的,所以如果我们对equals方法进行了重写,建议一定要对hashCode方法重写,以保证相同的对象返回相同的hash值,不同的对象返回不同的hash值。 不然一个链表的对象,你哪里知道你要找的是哪个,到时候发现hashCode都一样,这不是完犊子嘛。 > 可以可以小伙子,我记得你上面说过他是线程不安全的,那你能跟我聊聊你们是怎么处理HashMap在线程安全的场景么? 面试官,在这样的场景,我们一般都会使用**HashTable**或者**ConcurrentHashMap**,但是因为前者的**并发度**的原因基本上没啥使用场景了,所以存在线程不安全的场景我们都使用的是ConcurrentHashMap。 HashTable我看过他的源码,很简单粗暴,直接在方法上锁,并发度很低,最多同时允许一个线程访问,ConcurrentHashMap就好很多了,1.7和1.8有较大的不同,不过并发度都比前者好太多了。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9qwe91q6lj30zo0e440r.jpg) > 那你能跟我聊聊ConcurrentHashMap么? 好呀,不过今天天色已晚,我觉得我们要不改天再约? 再说最近敖丙好像双十二比较忙,一次怎么能怼这么多呢? > 好吧好吧,小伙子还挺会为别人着想,而且还喜欢这么优秀的作者,你我觉得来日可期,那我们改日再约,今天表现很好,希望下次能保持住! ### 总结 **HashMap绝对是最常问的集合之一**,基本上所有点都要**烂熟于心**的那种,篇幅和时间的关系,我就不多介绍了,核心的点我基本上都讲到了,不过像红黑树这样的就没怎么聊了,但是不代表不重要。 篇幅和精力的原因我就介绍到了一部分的主要知识点,我总结了一些关于HashMap常见的面试题,大家问下自己能不能回答上来,不能的话要去查清楚哟。 HashMap常见面试题: - HashMap的底层数据结构? - HashMap的存取原理? - Java7和Java8的区别? - 为啥会线程不安全? - 有什么线程安全的类代替么? - 默认初始化大小是多少?为啥是这么多?为啥大小都是2的幂? - HashMap的扩容方式?负载因子是多少?为什是这么多? - HashMap的主要参数都有哪些? - HashMap是怎么处理hash碰撞的? - hash的计算规则? ## 点关注,不迷路 好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是**人才**。 我后面会每周都更新几篇一线互联网大厂面试和常用技术栈相关的文章,非常感谢**人才**们能看到这里,如果这个文章写得还不错,觉得「敖丙」我**有点东西**的话 **求点赞👍** **求关注❤️** **求分享👥** 对暖男我来说真的 **非常有用**!!! 创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见! 敖丙 | 文 【原创】 如果本篇博客有任何错误,请批评指教,不胜感激 ! ------ > 文章每周持续更新,可以微信搜索「 **三太子敖丙** 」第一时间阅读和催更(比博客早一到两篇哟),本文 **GitHub** [https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily) 已经收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西。 ================================================ FILE: docs/coderLife/写作一个月在感恩节对大家说的话.md ================================================ > 所谓活着并不是单纯的呼吸,心脏跳动,也不是脑电波,而是在这个世界上留下痕迹。 > > 要能看见自己一路走来的脚印,并确信那些都是自己留下的印记,这才叫活着。 > > > > 东野圭吾 《变身》 > > ![插画来自丑丑](https://tva1.sinaimg.cn/large/006y8mN6ly1g9cl6q9o9zj309o0b3q5i.jpg) > > 本来今天是没文章的,RocketMQ周末写了60%发不出来,但是感觉日子特殊嘛我就熬夜写一下。 今天敖丙我不写技术,不知道在看我文章的你知道今天是什么节日嘛? 上个月的今天我发了我在博客的第一篇文章,同时今天也是【感恩节】 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g9cve67y0oj305n01bq2u.jpg) 我身边熟悉的我人都知道,其实帅丙我是不过西方节日的,但是最近家里出了一些事嘛,而且也是自己工作第一年的结束,晚上上班的时候就多了很多感慨,走在路上思绪转的飞快想了很多(虽然公司走到家里我只用1分钟)。 回到家跟爸妈都发了很长很长的语音,看了看窗边,外面的风在肆虐着空气,凝望着天空。 想了很多东西说就准备在这样的节日跟大家闲聊一下。 老妈他们本来在越南工作的嘛,因为外婆身体突然不好,然后回老家去了,外婆身体一切ok的,后来老妈又说要动手术,而且老爸说检查要一个周,刚得知这个消息的我其实很爆炸,因为别人手术前检查几天就好了,但是老妈为啥要一礼拜。 我没跟老爸他们说我的担心,只是在地铁站接了电话出来后,在杭师大的操场上渡步,鼻子酸酸的,是的一个大男人哭了说出来真的很丢人。 这是我在杭州第三次哭泣了,像个弱者,第一次是因为实习交不起押一付三的房租,第二次是因为代码写太差和一些压力。 这一段我删了撤回,删了撤回,觉得丢人,但是最后大家还是看到了,反正男人嘛无所谓的。 回归主题嘛,今天是感恩节嘛,虽然我才毕业一年,但是这是我来杭州的第三年了,感慨还是很多的。 先说说家庭吧,我家条件就这样,平平淡淡,贵州的小山村嘛,经常跟群里的调侃,过年发不了文章不是我不发是没网,是的还是2g泪目。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g9dghpyv9mj31400u0qv5.jpg) 以前觉得父亲在同龄人中太平庸了,但是后来的我才知道,他付出了多少才撑起这个家,让自己读完大学,健康成长到现在。 母亲身体一直不好那种,但是她对家庭的付出跟老爸一样多,忍耐着父亲的脾气,我的幼稚,勤俭持家才有了现在的我回老家居住的环境,和我的一切。 其实在这样公开的平台说着这样的话,我觉得挺不好意思的,不过我想也没啥,我就是我,无可厚非,你就是你,也是我的朋友,不是嘛。 我就借助这样的日子把对煽情的话都说了吧哈哈,反正让我当面跟爸妈说也说不出口。 明早发了赶紧转发给他们哈哈。 友情提示:天冷了,大家记得也问候一下家人,一句话可能就让他暖得不行。 说一下我为啥写文章吧。 因为三歪的一句话吧:你真的很适合写文章。 记得是某段时间他对我经常说的,那时候回到家一直在纠结,就有了后来的系列。 其实他不说我现在应该是个B站up主吧哈哈,其实我装备都买了,视频都拍了一个了,但是没人看嘛。 因为我没啥时间拍摄,还有我上班也枯燥,剪辑也很一般般那种,就反正没人看,所以大家发现我文章里面的视频元素了么? 开头的点赞在看养成习惯,结尾的求赞,求关注,求转发,还有文章里面我会融入很多自己风格的元素,其实是相当于写文章圆了自己up主的梦吧。 还好我写了文章没继续拍下去,不然现在应该还是那个关注只有7个的小敖丙吧。 再说一下写文章一个月以来的感受吧,其实有人喷过我,有人怼过我,但是都是少数,我性格就这样怼我,表面上我也就这样吧,其实还算在意,所有有时候三歪隔着桌子看我骂空气傻*。 不过说实话谢谢大家,更多的都是鼓励我,夸奖我的,有时候我都被你们夸奖得有点飘了,觉得我是那么回事了,但是我呢这个人能经常冷静下来,我还是我,那个刚毕业一年的我,那个23岁不大不小的我。 《吊打面试官》是我最开始就定的名字,但是很多读者就问我看了是不是就能吊打面试官了,看了是不是就无敌了。 不能,不是! 我取很多标题都是为了噱头,我甚至多次想改掉了,不过写了也不少了,就没改,但是我想让大家认知正确,我刚开始学软件,我的姐就告诉我要有空杯心态,我希望大家也是一样,用一颗谦逊的心,对待每个未知事物。 面试官能面试你,肯定有人家的原因的,或许你的知识广度够但是你确定你有他深度?又或者你深度够,你能有他广度?有些东西是必须时间积累的,慢慢你们会明白的。 各个平台收获了不少粉丝,有开心也有烦恼,很多东西我可能比大家接触多点,因为电商嘛场景本身就很丰富,但是大家也不要忘记我也没工作多久,我好多技术栈的深度也不够,所以很多人的问题其实我也不是很懂,那问题就来了,我怎么做到文章的技术栈都有深度呢? 臣妾做不到。 是的短期我想我做不到,没长时间的积累我想我还是不敢写很深的东西给大家看,只能把我已知的只是点展示给大家看,写知识扫盲,趣味学东西为主的文章,这也是为啥每期我会让阿里系或者身边的大佬朋友review一遍的原因。 所以文章里面那句我们一起进步,并不是我的自谦,是我的自我认知。 Tip:这篇文章啥干货都没,所以没前言,没正文,没求赞,甚至没排版。 接下去到年底的日子,会有双十二,双旦,年会Vlog视频等一大堆事情,我有拖更的预感了,别怪我没提醒你们哟。 最后也在这样的节日,感谢大家,谢谢你们看我的文章,夜深了,我们下篇文 ================================================ FILE: docs/coderLife/敖丙用20行代码拿了比赛冠军.md ================================================ > 你知道的越多,你不知道的越多 > 点赞再看,养成习惯 > [**GitHub**](https://github.com/AobingJava/JavaFamily)上已经开源[https://github.com/Java...](https://github.com/AobingJava/JavaFamily),有面试点思维导图,欢迎[**Star**](https://github.com/AobingJava/JavaFamily)和[**完善**](https://github.com/AobingJava/JavaFamily) ## 前言 这一期不算**《吊打面试官》**系列的,所有没前言我直接开始。 ## 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的**Vlog**,还要**写BUG**,超级忙的。 **Redis**的答案刚发,你怎么又发?这么高产?这么这么优秀! 其实这篇是我以前就写的,只是都没发出来过,而且作为**暖男**我就想着你们嘛,所以就从自己之前的文章里面水一篇给大家看一下,开始前我先回答点最近大家私聊问我的一些问题。 ###知乎 阿渣a: 你为啥突然开始写面试系列了? 这个问题就算不问我也准备在某一期写出来的,因为**Java3y**的作者**三歪**哈,这个号大家在各个博客平台应该都或多或少看过,是他给的建议。 他是我基友兼同事上班的时候我们面对面坐的(昨晚在我这促膝长谈哈哈),他是一个**应届生**,但是他现在已经有**200多篇原创文章**了,知识的广度深度都挺好的。 反正就是跟我说了很多东西,我一听诶觉得这个人**有点东西**,然后有一天他说我这样的性格应该去写文章,肯定有很多人喜欢看,关注人多了,可能有点也会有点工资外的**额外收入**。 (实话实说,我也不骗你们,像我工资这么高的人 ! 跟我谈钱?真香)。 不过现实总是这样残酷,至于现在收入多少嘛,我觉得我刚开始写,我们还是不提这个好吧,我怕我把自己写哭了**o(╥﹏╥)o**! ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8rq56p5hqj30ky05ydg5.jpg) ### 掘金 Skyline7:说! 你和3y是不是同事! 是的给个图片自己感受哈哈。(左三歪,右敖丙) ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8w6iulcdcj30n00zrq7k.jpg) ###写吊打系列之后的感受? 说实话挺爽的,很多**人才**喜欢看嘛,很多人私信鼓励我写下去,还有就是因为以前跟很多博主啥的,信息都是单方面的输入的关系,就都是别人写了我看。现在自己也输出了,也有自己喜欢的博主看了,还**点赞评论加关注**了,我觉得就很开心。 特别是**CSDN**的大佬 :**梦想橡皮檫** 掘金的 :**SnailClimb( JavaGuide)** **JavaGuide**跟**Java3y**一样都是应届生,我都是看着他们的文章长大的,这差距诶。 (不过私下确认了一下好像我和他还有三歪都是96年的哈哈) ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8rheajrtqj30cm03s0t3.jpg) ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8rivbtau3j30g2054mxn.jpg) 然后有时候消息可能回不及时,但是我能回的我其实都第一时间回了,但是平时工作嘛,基本上都是晚上回家,中午吃完饭啥的看消息,但是都是这样的↓↓↓ 我有点慌(其实很开心,谢谢各位的认可)! ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8rhj6861gj30ko07udg8.jpg) 我自己之前也面过大大小小的互联网公司,不乏阿里系腾讯系的公司,**失败过,成功过,哭过,爱过~~~~**,我知道面试的哪些点比较重要或者怎么组织话语比较重要,其实自己有在自己的本地写过一些东西。 但是都没发表过,而且本地很多好像也是我以前复制进去的,我都不知道哪些是自己写的哪些是复制的,肯定不能直接发的,所以以后应该都是自己写自己的内容,以后就**承蒙各位关注了**! ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8rhq8g5o9j31ia0u0e81.jpg) ###掘金 江飞杰 :你都是在环境下写文章的呀? 一般都是周末或者下班后,孤寡老人嘛在家就坐沙发上发呆,然后写点东西,喝点闷开水,年纪大了早上也睡不着,早起也会在那写到快上班去上班。 **但凡有个女朋友都不至于这样啊!!!** ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8rkghbdqdj30ja0po4ao.jpg) ## 正文 捞一下:前几期吊打系列我们提到了**Redis**的知识,还没看的小伙伴可以回顾一下 - **[《吊打面试官》系列-Redis基础](https://juejin.im/post/5db66ed9e51d452a2f15d833)** - **[《吊打面试官》系列-缓存雪崩、击穿、穿透](https://juejin.im/post/5dbef8306fb9a0203f6fa3e2)** - **[《吊打面试官》系列-Redis哨兵、持久化、主从、手撕LRU](https://juejin.im/post/5dc3a9fbf265da4d3c072eab)** - **[《吊打面试官》系列-Redis终章_凛冬将至、FPX_新王登基](https://juejin.im/post/5dc850b4e51d452c2308ee27)** - **[《吊打面试官》系列-Redis常见面试题(带答案)](https://juejin.im/post/5dcaebea518825571f5c4ab0)** **这期不算面试的知识点,来只看面试的小伙伴可以直接跳文末的面试技巧。** ## 公司活动 我们公司在1024当天有个活动↓ ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8rhym5gd0j31560qu1kx.jpg) **MOGU创意代码大赛** **参赛要求** 1.参赛作品主题鲜明,创意新颖,内容健康,适合观赏,以生活为主题; 2.充分发挥想象力和创造力,力求以独特的创意展现作品的趣味性和娱乐性。 我一看诶,我擦,这不是本渣我的强项嘛,用代码输出点啥,我第一时间就想到了用代码把一个完整的视频输出出来,我输出公司的广告不就跟公司就有强关联性了嘛。 **奖项设置** 一等奖 1名:Razer雷蛇电竞专用机械键盘 二等奖 2名:飞利浦机皇款电动牙刷 三等奖 3名:颈椎按摩器/电动理疗护颈仪 参与奖若干:国风超大电脑桌垫(哪吒闹海) **本渣我一看居然还有奖励,不过奖励不奖励的无所谓,我主要是喜欢写代码。** 既然脑子有了想法那我也不多BB直接开搞。 #我第一时间就想起了用字符把公司的广告,输出成动画 我们都知道其实最早的动画片都是画家手动一张一张的画出来然后连起来播放,然后才成动画片的,那么原理我们也知道了,就直接开搞吧。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8rrpkdacng30go09d7wh.gif) ##那首先要做的就是把公司广告按照动画抽帧出来 **tip:这里有个注意点就是没必要一帧一帧的抽,因为肉眼最高的是60fps,要一帧一帧抽那太多了,我按照每10帧抽了,这样工作了少很多,但还是好多啊,不说了直接搞** ###我抽帧的工具是Adobe Premiere Pro cc 2019 也有批量抽帧工具,mac上我没找到,就麻烦朋友在Windows电脑抽了一下 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8rrp2k72aj31gy0u0b29.jpg) ###接下来我们要做的就是把我们抽出来的每一帧都转换为ASCII字符,将1000多帧转换好后我们可以看到已经生成1000多个txt文件了。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8rrrh3y2hj30u0100x33.jpg) ###转换过程用相关软件做一下就好了,谷歌百度都能查到很多,我们打开其中一个看下效果 ![](https://upload-images.jianshu.io/upload_images/10550320-d5179884d6142087.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ###其实放大之后就是一个个的英文字母和数字,播放的时候我们可以把字体调小点,有点把像素调搞高点的意思。 ![](https://upload-images.jianshu.io/upload_images/10550320-9b1b11398be6360e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) **ps:这里有个坑,就是mac大部分的字体在txt文本中是不等宽的,就是说 i 和 o是不等宽的,你需要找到对应等宽的字体 我找了很久才找到,作为**暖男**,你不用找了我帮你找好了 !** - Mac: Andale Mono - Windows:宋体 我们可以看一下不等宽的样子,就会发现每一行字数一样,但是长宽不一样。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8rrqnxd3gj30tm0r4arm.jpg) ###如果你发现你还是没找到对应的字体,那么我教你两个方法: - 去txt里面找到字体设置一个一个试, - 用代码去拉出本地所有的字体,循环出来看效果 ### 下面分别是手动查找和程序查找的代码 ![mac字体](https://upload-images.jianshu.io/upload_images/10550320-f5576a90a702459a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8riopc9bkj30rh09pq4x.jpg) ###接下来的事情就很简单了,我们用代码每次读取每个画面的行数每次输出一屏(我这里一屏是160行,看个人视频实际大小决定,代码里面也给了调节参数)连续输出就有动画的效果了,注意控制输出的时间间隔,我也不多BB,直接贴关键代码 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8rip3brr0j30mr0v7wjp.jpg) ##最后我们看下成片 完整版太大了gif传上来展示不出,完整版可以看我公众号,就放个一两秒的demo。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8rrq3ij4cg30fy0oze81.gif) ##活动结束 像我这种**天才**型的选手,你们想都不用想,拿了第二o(╥﹏╥)o,下面是hr小姐姐发奖时候的照片,为啥没拍我领奖的照片,生气! ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8rkb869vsj30iu0h6k59.jpg) 只能感叹对手太强了,太强了。 不过还是忍不住给自己的聪明才智点个赞! **暗示点赞,每次都看了不点赞,你们想白嫖我么?你们好坏喲,不过我喜欢** ---- ## 总结 好了不逗比了,最后我来点**干货**吧,因为我发现好多读者都是**应届生**什么的,或者是明年就要出来**实习**的仔,那我给点我的建议: **准备自我介绍!!!** 自我介绍,这个必须要准备,面试90%的套路都是**“来你先做个自我介绍吧”** ,一般自我介绍1-3分钟左右,时长看你自己的经验和经历。 **作为在校生:** 因为大家还没啥社会经验,我觉得你突出你的**大学经历**、**个人成就奖项**、**证书**、**个人成绩**等就好了。 要让面试官知道你是个人才,你没有白白荒废你的大学生活,我招你进来你是个**靠谱**的人,**肯学肯沟通能吃苦耐劳**等等,对了有**实习经历**的一定要突出出来,毕竟这是你和社会接轨的证明, 最后给个**小技巧**,大家可以把自我介绍写下来,然后说出来并且自己用手机录音听一下,联系到自己满意为止,我刚毕业就是这么做的,(每次听自己的声音都忍不住爱上自己)我印象笔记里的版本,我改掉了公司信息和学校信息,可以给你们个DEMO可以参考下,觉得不错记得**点赞**!!! ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8rrg5epd2j31510u07wh.jpg) **作为已经工作的仔:** 我觉得大家,更要细心准备这1-3分钟的自我介绍。 因为这是这场面试的开始,也是面试官唯一能快速获取你经历信息的途径,多的就不说了,**公司**、**工作的内容**、**擅长的技术栈**,甚至是是否**单身**等等(有的加班严重的公司就是比较看重这个),我也准备了社招的面试Demo,你们加我公众号获取吧,算了不这么吸粉了,直接放吧(我还是心太软啊)!**点赞**!!! ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8rrlebu45j31700mee48.jpg) **上面的学校公司都是我瞎吹的,可不能给我清华抹黑啊!** 其实我这里都是比较简单的自我介绍了,真实大家的经历可能更丰富点,而且大家也可以多多润色一下,这只是自我介绍一个环节,后面在各个**《吊打面试官》**系列里面我都会提到一些小的**贴士**大家都注意下。 有啥疑问或者需要我给建议可以去**GitHub**https://github.com/AobingJava/JavaFamily或者我公众号都有我微信。 ## 下期投票!!! 下期准备了从下面两个题材中选一个写,根据你们这个篇文章的点赞是基数还是偶数决定 - 基数:Java基础 - 偶数:MQ - 不基不偶:MySQL ## END 好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是**人才**。 我后面会每周都更新几篇《**吊打面试官**》系列和**互联网常用技术栈**相关的文章。如果你有什么想知道的,也可以留言给我,我一有时间就会写出来,我们共同进步。 非常感谢**人才**们能看到这里,如果这个文章写得还不错,觉得**「敖丙」**我**有点东西**的话 **求点赞👍** **求关注❤️** **求分享👥** **求留言💬** 对暖男我来说 **非常有用**!!! 各位的支持和认可,就是我创作的最大动力,我们下篇文章见! 敖丙 | 文 【原创】【转载请联系本人】 ------ > **《吊打面试官》**系列每周持续更新,可以关注我的公众号**JavaFamily**第一时间阅读和催更(**公众号比博客早一到两天哟**),里面也有我个人微信有什么问题也可以直接滴滴我,我们一起进步。 ================================================ FILE: docs/coderLife/教你在服务器搭建个人面试项目.md ================================================ > 你知道的越多,你不知道的越多 > 点赞再看,养成习惯 > **GitHub** [https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily)上已经收录有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和指教 ## 前言 群里不知道多少次大家说自己的**项目没亮点**,在大学没项目出去后**怕找不到工作**,问敖丙我实习的时候是怎么拿的华为Offer。 其实大学的项目很简单不需要太大的难度,因为面试官知道你也没啥经验,不会很在意这个,但是你得有项目这是必要条件,再不济**增删改查你要比别人6**吧,不然找个0经验的人进去,不是给他自己挖坑? 而且如果你有个还不错的履历,或者你的项目还有一些**亮点**,那完美了,你的Offer率会拉开同行的仔一大截的。 丙帅我呢大学做过几个项目,前些天问了问学妹,还在学校稳定运行着,说实话我有点小骄傲了。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9jxc2d5p6j306y06y0ss.jpg) 但是说实话,我拿华为Offer跟这些项目关系不大,大学时候完成的项目完全是兴趣使然,想起当初自己一个人在室友还没起床的时候去图书馆,在室友都睡觉的时候还没回去的时光,我的眼角又湿了。 **Tip**:怎么拿的Offer我会在《程序人生》系列写,过年前或者后面出个我大学到现在的心路历程哈哈。 当时在电子阅览室当管理员,甚至多次为了赶进度,在图书馆通宵达旦,好在最后还是完成了那个项目,自己一个人从前端到服务端,从研发到部署上线。 大家都知道学校选课用选课系统的时候,很多学校给第三方公司做的系统都很卡,敖丙做的项目就不卡,因为那个时候我就用到Redis了,现在想想设计思想还算前卫。 好了吹了这么多,其实就是为了引出今天的主题,**如何从0到1搭建一个可以外网访问的项目**。 很多小伙伴看到最后要说了,丙丙我要学的是**分布式**,才不要学垃圾的单机系统。 分布式不就是一个单机的服务构成的,你多起几个进行RPC通信不就好了? ## 正文 双十二阿里服务器推广,不买的小伙伴直接跳过这段,不过用来学习真的香,**比学生的9.9每月还便宜**。 **[我帮阿里云推广服务器89/年,229/3年,买来送自己,送女朋友马上过年再合适不过了,买了搭建个项目给面试官看也香,还可以熟悉技术栈,我明天会出一个服务器搭建个人项目的教程(老用户用家人的购买,我用我妈的😂)。扫码或者点击购买](https://www.aliyun.com/minisite/goods?userCode=tybhsgp5&share_source=copy_link)** ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9jmxonfwfj302s02sgld.jpg) 我就用自己的服务器给大家举例,怎么从0到1搭建一个学生和新手可以用来面试的项目,老手也可以回忆一下自己逝去的青春。 可能有小伙伴疑惑,丙丙为啥要服务器,本地不行么? 可以,当然不是为了推广服务器哈,大家可以不买,我只是阐述一下自己的观点,因为大家以后出去难免遇到自己操作服务器的情况,有些公司没有集成发布系统,那就需要你亲自去机器上操作了。 然后你rm -rf ,好了去财务室领下工资吧,年底了,提前回家过年可还行? ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9jwfn0qucg308c056nix.gif) 开玩笑的哈,只是很多操作大家不经常熟悉其实会都不知道,真正去操作或者面试官问你,熟悉各种操作么,你说不熟悉,好的回去等消息。 作为面试官,面试没多少经验的你,他更看重你思考的思路,还有你有没有实操过,务实么? 帅丙我大学的项目就是经常操作,所以后面很长一段时间的服务器操作,还有Linux命令啥的都还是不错的,技术栈搭建起来也是很熟悉,不过最近都是用的公司的工具,命令忘了好多了,需要反省一下了。 服务器在激活的时候会让你选系统,这个时候敖丙我个人建议,**有点基础**已经**熟悉安装过程和环境配置**的同学可以直接选择镜像,镜像市场里面有很多很适合的镜像,我选的就是带JDK8,Tomcat8,MySQL的镜像。 没搞过的同学可以尝试着选个空白机,然后下好这些东西,一步步去尝试,我想收获还是会有的,**跟你在自己电脑搭建的区别你会马上体会到**,这就是为啥建议大家去服务器操作的原因之一。 ### 镜像选择 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9h35s5lulj30p10baq4b.jpg) 镜像**记得选不要钱的**,一般都是免费的。 ![镜像市场](https://tva1.sinaimg.cn/large/006tNbRwly1g9h3664wnqj30pi0h1426.jpg) 选完你在**实例**就可以看到自己的服务器了,下面就是帅丙的服务器,居然跟我一样帅,天呐。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9h37h8hrsj31hb0eidij.jpg) 上面都是新搭建的小伙伴,已经有服务器的小伙伴,但是又想换成镜像怎么办? 大家**先把服务停掉**然后点击右边的**更换操作系统**就好了,会让你去镜像市场选的,之前你选了什么系统都可以换。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9jqvjvpxrj30bp0c3wf8.jpg) ### 登录服务器 可以直接在管理界面网页登录服务器远程链接,也可以自己本地用对应的控制台工具连接。 个人推荐本地的控制台连接会好点,每次要登录服务器都要去网页很麻烦的。 ![网页端查看](https://tva1.sinaimg.cn/large/006tNbRwly1g9h38pgln7j31ha0co0tl.jpg) 远程链接的代码,记住是大家的公网ip,管理界面看得到的,要记得你购买的时候配置的密码,因为这个时候要输入。 > ssh root@123.14.123.8 -p 22 (后面的22是个端口,后面我介绍到) ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9jsgz4fy9j30m607p3zb.jpg) ![本地直连](https://tva1.sinaimg.cn/large/006tNbRwly1g9h39violrj30js04iaa3.jpg) 到这一步的时候,很多小伙伴直接登录成功,但是之前就已经有服务器的朋友是不发现,出现下面这个页面了? ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9h3aia50bj310w0dejtx.jpg) 会出现这些信息是因为,第一次SSH连接时,会生成一个认证,储存在客户端(也就是用SSH连线其他电脑的那个,自己操作的那个)中的known_hosts,但是如果服务器验证过了,认证资讯当然也会更改,服务器端与客户端不同时,就会跳出错误啦~因此,只要把电脑中的认证资讯删除,连线时重新生成,就一切完美啦~要删除很简单,只要在客户端输入一个指令 > ssh-keygen -R +输入服务器的IP 接下来再次连接一次,会出现 > Are you sure you want to continue connecting (yes/no)? 输入yes! 就完成连接啦!同时,新的认证也生成了。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9h3brnwi2j30ri07gdgl.jpg) 进去后如果是镜像的小伙伴会发现本身他准备好的东西都在了,环境都搭建起来了,大家只管直接使用就好了。 但是如果没有选择镜像的朋友,就需要自己搭建一个FTP或者使用传输命令去把你下载好的Tomcat、MySQL等传输进来安装好。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9h3cnassnj30v20m8mzp.jpg) 大家可以看到还**有一个默认密码文件夹**,里面就有MySQL和FTP的账号密码什么的,不同的镜像可能有差异。 这个在之后大家自己的服务写代码的时候,配置连接本地的MySQL就是需要这个的。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9h3oaeztjj30og0dkjsq.jpg) ### 博客网站 这次教大家搭建的项目说大不大,说小吧他啥都有,反正小白和学生肯定很适合,是个个人博客网站。 我们先看看博客的效果,看看大家作为大学的项目到底合格么? 我大学做的那个项目比起这个就差点意思了,当时要是有这么好的UI就很香了! ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9jrwgmxxkj30n60cwmzj.jpg) ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9jrwoy9w2j30n40csgqo.jpg) ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9jrx2exzaj30mu0cr7ap.jpg) ### 项目代码 以我这种直男审美都觉得UI很不错,你以为只是UI可以?那我们看看项目! 项目的Git地址 https://github.com/halo-dev/halo.git 大家克隆一下就好了。 这个项目本身是**Gradle**的,很多小伙伴就要说了,啊帅丙我不要,我就要**Maven**项目的。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9jxqgsd1tj306y04xa9x.jpg) 我只想告诉大家,**技多不压身**,目前很多大厂都是Maven项目Gradle项目都占有很高的比重,你怎么知道你去的公司会用啥? 你会用进去**减少多少学习的成本**啊,Leader在旁边暗自给你比一个大拇指,暗自感叹:**帅丙的读者,有点东西**。 Mac很多小伙伴安装的时候发现没有**Homebrew** 就没办法用很方便的命令行去下载安装Gradle,那简单我们安装一下,用下面的命令。(Windows的朋友直接官网下载一个就好了 [https://gradle.org/install](https://gradle.org/install/)) ```java /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" ``` ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9js171tr5j30uy0h00w9.jpg) 这个安装好了,我们再用下面的命令就可以就把Gradle安装好了,是不是比你去下载方便很多? ```java $ brew install gradle ``` ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9js3ouolkj30v0062q43.jpg) 接下来去项目中设置下Gradle地址,这里介绍的是IDEA的设置 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9js7gqmmwj319w0bmtal.jpg) ### 为啥推荐个人博客项目? 很多人问我为啥推荐这个项目,这个项目看过次代码了,**没有啥语法错误**,**项目结构**完全**标准**的项目,**注释也很齐全**,**代码的风格挺不错**的,还是 **用了很多新语法和注解**。 而且他也**不难理解**,**结构很简单**,前端后端都很简单,大家看看代码,看看前后的接口,很快就能适应这个项目了。 ![后端](https://tva1.sinaimg.cn/large/006tNbRwly1g9js917q9kj31c00u0dw6.jpg) ![前端](https://tva1.sinaimg.cn/large/006tNbRwly1g9jsajq5ilj31c00u07j6.jpg) 接下来我们可以用项目去打个包,或者直接下载敖丙打包好的。(jar包还有war包随意) ### 用命令行下载最新的 Halo 安装包 ``` curl -L https://github.com/halo-dev/halo/releases/download/v1.1.1/halo-1.1.1.jar --output halo-latest.jar ``` 或者 ``` wget https://github.com/halo-dev/halo/releases/download/v1.1.1/halo-1.1.1.jar -O halo-latest.jar ``` ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9hab3je2aj31580u047k.jpg) 文件传输呢,帅丙我习惯命令行了,FTP这样的工具还是不适应,我就发下命令行是怎么把jar包从本地传输到服务器的。 ``` scp -P 22 /Java/program.war root@123.456.789.987:/usr/server/tomcat7/webapps/ ``` ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9hciidvt6j30w007o755.jpg) 我们进入机器去看一下,文件已经传输进来了。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9hbw2lkelj30p203smye.jpg) 因为是一个SpringBoot项目,你只要有JDK直接就能跑起来了。 ```bash java -jar halo-latest.jar ``` ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9hbxrpa1bj322m0u0k5x.jpg) 然后大家访问下自己的 ip+端口(8090)就能看到项目了 然后很多小伙伴说,渣男,我的怎么不行? 稍等稍等,敖丙啊还正准备说呢,大家的端口默认就开通了 22 、-1、3389 22是不是很熟悉,就是开头我们链接的端口号→ ssh root@123.14.123.8 -p **22** 也是因为厂商默认给我们开通了,我们才可以直接链接的。 但是我们要访问别的端口,那就去开通嘛,**记得入口出口一样都要开通哟**! ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9jshoa2lvj305t07s74e.jpg) ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9jsi75jjpj31ao0bi413.jpg) ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9jsieug2rj305501lt8k.jpg) 然后重启下机器,重新启动项目,是不是!!!可以访问了???我们先注册一下 ![注册](https://tva1.sinaimg.cn/large/006tNbRwly1g9hcmha8v9j312c0nign3.jpg) 然后再登录进去。 ![登录](https://tva1.sinaimg.cn/large/006tNbRwly1g9hcm3scw2j30yt0kxgms.jpg)可以看到校验的异常什么的都直接日志抛出的,项目我觉得对于学生和新手来说很香,里面的代码风格大家也多适应一下。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9hco94fd6j31sc0men5k.jpg) 登录进去我们可以发现,功能很全,博客网站基本的结构都在了。 有个不成熟的猜想,还没毕业设计的朋友。。。。😂 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9hdfdpmcyj31g30orjtr.jpg) ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9hdi14hb9j31b30oldi8.jpg) ## 絮叨 看到这里很多小伙伴可能会说你就是为了推广服务器才写的吧,我说实话有一定的成分,但是更多是因为我自己的群里,经常有很多小伙伴对**项目的整个搭建流程不是很熟悉**,所以才出这样的一篇文章的。 这里只是一个单机的项目,大家真正部署的时候要体验别的技术栈可以去Git上下载下来部署上去,体验他整个部署流程,**中间肯定很多不顺利的地方**相信我,100000%不会一次成功,但是你慢慢摸索的过程就是你学习的收获的过程。 大家经常问我那些大佬怎么成长上去的,**踩坑和付出大量实践上去的**,别无他法。 我老东家的Leader 95年的,是我们之前公司前端后端的Leader,技术深度广度,业务深度都领人发指,怎么做到的? 简单,**不断踩坑学习**咯,每天都是凌晨回去,白天开会,晚上写代码,甚至还要挤出时间学习新的业务,技术栈也是不断自己去摸索。 之前他一手带的我,我跟他太熟悉了,买了早餐刚坐下就去开会讨论业务,晚上6点回来就说:诶鸡蛋豆浆都冷了啊,然后丢垃圾桶。 学习是一条令人时而喜极若狂、时而郁郁寡欢的道路。 成长路上我们一起共勉。 ## 日常求赞 好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是**人才**。 我后面会每周都更新几篇一线互联网大厂面试和常用技术栈相关的文章,非常感谢**人才**们能看到这里,如果这个文章写得还不错,觉得「敖丙」我**有点东西**的话 **求点赞👍** **求关注❤️** **求分享👥** 对暖男我来说真的 **非常有用**!!! 创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见! 敖丙 | 文 【原创】【转载请联系本人】 如果本篇博客有任何错误,请批评指教,不胜感激 ! ------ > 文章每周持续更新,可以关注我的公众号「 **JavaFamily** 」第一时间阅读和催更(公众号比博客早一到两篇哟),本文**GitHub** [https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily) 上已经收录,有一线大厂面试点思维导图,欢迎Star和完善,里面也有我个人联系方式有什么问题也可以直接找我,也有**技术交流群**,我们一起有点东西。 ================================================ FILE: docs/coderLife/记一次差点害敖丙丢工作的的线上P0事故.md ================================================ > 你知道的越多,你不知道的越多 > 点赞再看,养成习惯 > **GitHub** [https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily)上已经收录有一线大厂面试点脑图、个人联系方式和技术交流群,欢迎Star和指教 ## 前言 这是帅丙真实事件,大家都知道很多公司都是有故障等级这么一说的,这就是敖丙在公司背的P0级故障,敖丙差点因此**被解雇**,事情经过**十分惊心动魄**,我的**心脏病都差点复发**。 > 事故等级主要针对生产环境,划分依据类似于bug等级。 > > P0属于最高级别事故,比如崩溃,页面无法访问,主流程不通,主功能未实现,或者在影响面上影响很大(即使bug本身不严重)。 > > P1事故属于高级别事故,一般属于主功能上的分支,支线流程,核心次功能等,后面还有P2,P3等,主要根据企业实际情况划分。 ### 正文 敖丙之前也负责公司的商品搜索业务,因为业务体量增速太快了,商品表中的商品数据也很快跃入千万级别,查询的RT(response time 响应时间)也越来越高了,而且产品说需要根据**更多维度去查询商品**。 因为之前我们都是根据商品的名称去查询的,但是电商其实都会根据很多个维度去查询商品。 就比如大家去淘宝的查询的时候就会发现,你搜商品名称、颜色、标签等等多个维度都可以找到这个商品,就比如下图的搜索,我只是搜了【**帅丙**】你会发现,名字里面也没有连续的帅丙两个字,有帅和丙的出来了 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9ksvacqjpj30jg0hv12w.jpg) 大家知道的传统的关系型数据库都是用什么 name like %帅丙% 这样的方式查询的,而且查询出来的结果肯定只能是name里面带帅丙的对吧。 那你还想搜别的字段比如什么尺寸、关键词、价格等等,都能搜到帅丙,这相当于是多个维度的了,传统的关系型数据库做不到呀。 做技术选型的时候,帅丙第一时间想到了搜索引擎。 当时市面是比较流行的有:**Apache Lucene**、**Elasticsearch**、**Solr** 搜索引擎我后面会讲**ELK(Elasticsearch、Logstash、Kibana)**和**Canal**,我呀真的是太宠你们了,这样会不会把你们惯坏了。 帅丙我呀,噼里啪啦一顿操作,最后得出结论: > 相对来讲,如果考虑静态搜索,Sorl相对更合适。 > > 如果考虑实时,涉及到分布式,Elasticsearch相对合适。 那我们商品还是要实时的呀,你后台改了价格啥的,是不是都要实时同步出去,不然不是炸了嘛。 看到这,我想**可爱的你**和帅丙心中都有了答案:Elasticsearch这是个神一样的引擎。 我这里就做一个简单的介绍就好了,细节的点我们后面去他的章节讲,啥都写了,敖丙哪里有这么多素材写文章? > ElasticSearch是一个基于Lucene的搜索服务器。 > > 它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。 > > Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。 > > ElasticSearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。 > > 根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。 看过敖丙之前文章的朋友都知道,我们做技术选型之前,要做什么呀,**设计**! 我们要去了解这玩意的**好处**、**坏处**、**常见的坑**、**出了问题的应急预案**等等,还有他的**数据同步机制**啊,**持久化机制啥**的,就是高可用嘛。 同样的我不大篇幅介绍了,以后都会写的嘛,我就给大家看看我当时做的设计吧。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9kxzcemyyj31170u0qbo.jpg) ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9lix2yggbj30dw0mvaig.jpg) **这个只是最初的demo,详细的终稿我就不给大家看了,因为有很多公司内部的逻辑。** **不过大家还是可以看到敖丙真的考虑了很多,还是那句话,不打没把握的仗!** 设计做好敖丙就**卡卡卡**的用起来了。 说实话,**真香**,这玩意真的好用,学习成本也很低,查询语句分分钟掌握了,官网文档把功能介绍得清晰无比。 > https://www.elastic.co/cn/ 用着用着重头戏来了,你们都知道敖丙我是做电商活动的,都是什么很高的流量打进来这样,还是如往常一样上线了一个活动。 **这是一个月飞风高的夜晚,丝丝凉风迎面吹来,敖丙悠闲的坐在椅子上,手里拿着破旧的茶杯,喝着外婆炒的苦荆茶,享受着这惬意的时光。** 突然,说时迟那时快,运维打来了紧急电话ES集群CPU打到了99%要挂了,**我的心蓦然一痛**,心里还在庆幸还是集群没崩。 然后他接着说了一句,不好集群挂了! 敖丙卒,本篇完.... ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9ky95a8s2g308c08c3ze.gif) 开玩笑的哈,不过当时敖丙真的**要死的心真的都要有了**,就在崩掉的1分钟内,就有用户反馈搜索未响应,我第一时间想到的就是重启,于是我一个健步冲出去,开启电脑,进机器,输入了重启命令。 好了,是的好了,还好有惊无险,不过只过了10秒,集群又99%了,呐呢? ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9kycthq28j30la0aa0xc.jpg) 我又只能重启了,这次没挂,过了很久很久,直到活动结束,还是没挂。 ### 查找问题 但是这次影响到线上,3分钟的搜索未响应,我想我估计明天是要去财务领工资,提前回家过年了。 **还好Leader说没事**,先找到问题,把他修复掉。 你们都知道敖丙天才来的,我第一时间想到的就是看日志,我登上去看es没报错,再看本身的服务,除了超时的错误啥都没有,卧槽,是的当时我脑袋嗡嗡响。 不过我继续想为啥是我的搜索挂了,**会不会是有人搜了什么奇怪的东西?** 我打开了我的搜索日志!!! 卧槽这不是吧,哪个坑爹玩意搜这么长的一串中文,差不多250个字吧。 但是我一想,搜这么长也不应该打挂服务啊,**会不会是我写了bug**! 我脸颊流下一滴汗水💦,我看了看周围,发现没人注意到我的紧张,我**故作镇定**的把它擦掉。 我仔细一想,别人查询虽然长,就算查数据库也没事啊,为啥es就报错了?会不会? ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9kysgpgumj308c06mt8s.jpg) **Es有Bug!没错肯定是Es的锅。** 那为啥会这样呢,我直接跟老大这样解释也好像不行啊,**还是要被开除的吧!** 于是我去看看看代码,我在关键词使用了通配符,我当时是为了匹配更多内容才这么做的,类似数据库的like,Es的通配符就是: * 帅丙 * 这样**在关键词前后加“*”号去查询**。 后面我发现就是通配符的锅,那**柯南丙**就说一下为啥会这样的问题出现。 许多有RDBMS/SQL背景的开发者,在初次踏入ElasticSearch世界的时候,很容易就想到使用通配符(Wildcard Query)来实现模糊查询(比如用户输入补全),因为这是和SQL里like操作最相似的查询方式,用起来感觉非常舒适。 然而帅丙的故障就揭示了,**滥用Wildcard query可能带来灾难性的后果**。 我当时首先复现了问题 ### 复现方法 1. 创建一个只有一条文档的索引 > POST test_index/type1/?refresh=true > > { > > "foo": "bar" > > } 2.使用wildcard query执行一个首尾带有通配符*的长字符串查询 > POST /test_index/_search > > { > > "query": { > > "wildcard": { > > "foo": { > > ​ "value": "轻轻的我走了,正如我轻轻的来;我轻轻的招手,作别西天的云彩。那河畔的金柳,是夕阳中的新娘;波光里的艳影,在我的心头荡漾。软泥上的青荇,油油的在水底招摇;在康河的柔波里,我甘心做一条水草!那榆荫下的一潭,不是清泉,是天上虹;揉碎在浮藻间,沉淀着彩虹似的梦。寻梦?撑一支长篙,向青草更青处漫溯;满载一船星辉,在星辉斑斓里放歌。但我不能放歌,悄悄是别离的笙箫;夏虫也为我沉默,沉默是今晚的康桥!悄悄的我走了,正如我悄悄的来;我挥一挥衣袖,不带走一片云彩。" > > } > > } > > } > > } 3. 查看结果 > { > > "took": 3445, > > "timed_out": false, > > "_shards": { > > "total": 5, > > "successful": 5, > > "failed": 0 > > }, > > "hits": { > > "total": 0, > > "max_score": null, > > "hits": > > } > > } ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9lio9m1vcj31eg0lmh57.jpg) **即使no hits**,耗时却是惊人的3.4秒 (测试机是macbook pro, i7 CPU),并且执行过程中,CPU有一个很高的尖峰。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9lipoweu5j31e80guwod.jpg) **线上的查询比我这个范例要复杂得多**,会同时查几个字段,实际测试下来,一个查询可能会执行十几秒钟。 再有比较多长字符串查询的时候,集群可能就DOS了。 ### 探查深层次根源 为什么对只有一条数据的索引做这个查询开销这么高? 直觉上应该是瞬间返回结果才对! 回答这个问题前,可以再做个测试,如果继续加大查询字符串的长度,到了一定长度后,ES直接抛异常了,服务器ES里异常给出的cause如下: > Caused by: org.apache.lucene.util.automaton.TooComplexToDeterminizeException: Determinizing automaton with 22082 states and 34182 transitions would result in more than 10000 states. at org.apache.lucene.util.automaton.Operations.determinize(Operations.java:741) ~[lucene-core-6.4.1.jar:6.4.1 解释:该异常来自org.apache.lucene.util.automaton这个包,异常原因的字面含义是说“**自动机过于复杂而无法确定状态: 由于状态和转换太多,确定一个自动机需要生成的状态超过10000个上限**" **柯南丙**网上查找了大量资料后,终于搞清楚了问题的来龙去脉。 为了加速通配符和正则表达式的匹配速度,Lucene4.0开始会将输入的字符串模式构建成一个DFA (Deterministic Finite Automaton),带有通配符的pattern构造出来的DFA可能会很复杂,**开销很大**。 比如a*bc构造出来的DFA就像下面这个图一样: ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9kzf4mkxmj30em08474m.jpg) ### Lucene构造DFA的实现 看了一下Lucene的里相关的代码,构建过程大致如下: 1. org.apache.lucene.search.WildcardQuery里的toAutomaton方法,遍历输入的通配符pattern,将每个字符变成一个自动机(automaton),然后将每个字符的自动机链接起来生成一个新的自动机。 ```java public static Automaton toAutomaton(Term wildcardquery) { List automata = new ArrayList<>(); String wildcardText = wildcardquery.text(); for (int i = 0; i < wildcardText.length();) { final int c = wildcardText.codePointAt(i); int length = Character.charCount(c); switch(c) { case WILDCARD_STRING: automata.add(Automata.makeAnyString()); break; case WILDCARD_CHAR: automata.add(Automata.makeAnyChar()); break; case WILDCARD_ESCAPE: // add the next codepoint instead, if it exists if (i + length < wildcardText.length()) { final int nextChar = wildcardText.codePointAt(i + length); length += Character.charCount(nextChar); automata.add(Automata.makeChar(nextChar)); break; } // else fallthru, lenient parsing with a trailing \ default: automata.add(Automata.makeChar(c)); } i += length; } return Operations.concatenate(automata); } ``` 2. 此时生成的状态机是不确定状态机,也就是Non-deterministic Finite Automaton(NFA)。 3. org.apache.lucene.util.automaton.Operations类里的determinize方法则会将NFA转换为DFA ```java /** \* Determinizes the given automaton. \*

\* Worst case complexity: exponential in number of states. \* @param maxDeterminizedStates Maximum number of states created when \* determinizing. Higher numbers allow this operation to consume more \* memory but allow more complex automatons. Use \* DEFAULT_MAX_DETERMINIZED_STATES as a decent default if you don't know \* how many to allow. \* @throws TooComplexToDeterminizeException if determinizing a creates an \* automaton with more than maxDeterminizedStates */ ``` 代码注释里说这个过程的时间复杂度最差情况下是状态数量的指数级别! 为防止产生的状态过多,消耗过多的内存和CPU,类里面对最大状态数量做了限制 ```java /** * Default maximum number of states that {@link Operations#determinize} should create. */ public static final int DEFAULT_MAX_DETERMINIZED_STATES = 10000; ``` 在有首尾通配符,并且字符串很长的情况下,这个determinize过程会产生大量的state,甚至会超过上限。 至于NFA和DFA的区别是什么? 如何相互转换? 网上有很多数学层面的资料和论文,限于帅丙算法方面有限的知识,无精力去深入探究。 但是一个粗浅的理解是: NFA在输入一个条件的情况下,可以从一个状态转移到多种状态,而DFA只会有一个确定的状态可以转移,因此DFA在字符串匹配时速度更快。 **DFA虽然搜索的时候快,但是构造方面的时间复杂度可能比较高,特别是带有首部通配符+长字符串的时候。** 回想Elasticsearch官方文档里对于Wildcard query有特别说明,**要避免使用通配符开头的term**。 > " Note that this query can be slow, as it needs to iterate over many terms. In order to prevent extremely slow wildcard queries, a wildcard term should not start with one of the wildcards * or ?." 结合对上面Wildcard query底层实现的探究,也就不难理解这句话的含义了! **小结: Wildcard query应杜绝使用通配符打头,实在不得已要这么做,就一定需要限制用户输入的字符串长度。** 最好换一种实现方式,通过在index time做文章,选用合适的分词器,比如nGram tokenizer预处理数据,然后使用更廉价的term query来实现同等的模糊搜索功能。 对于部分输入即提示的应用场景,可以考虑优先使用completion suggester, phrase/term suggeter一类性能更好,模糊程度略差的方式查询,待suggester没有匹配结果的时候,再fall back到更模糊但性能较差的wildcard, regex, fuzzy一类的查询。 **补充**: 有同学问regex, fuzzy query是否有同样的问题,答案是有,原因在于他们底层和wildcard一样,都是通过将pattern构造成DFA来加速字符串匹配速度的。 **回忆**:为啥之前挂了一次重启恢复了,马上又挂了?用户搜了两次。。。 ### 解决方案 其实解决这种问题很简单,既然知道关键词长了会有问题,我就**做限制**嘛,大家可以去看看搜索引擎某度、某宝啥的,是不是都做了长度限制? 我复制了很长的一段汉字进去百度就是这个结果咯,某宝过长都返回**默认页面**了。 ![image-20191204205715057](https://tva1.sinaimg.cn/large/006tNbRwly1g9kzk65eauj30fw04o3z3.jpg) ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9kzmp624jj30su06ftah.jpg) 如果你的产品一定要给用户一点东西,简单,找出一些热词分析出来就好了,或者给点热搜商品**兜底**。 我怎么做的呢?判断字符串长度大于50我就直接返回空数组了,这样对用户体验好点,你返回个参数错误或者默认错误别人还**以为你有Bug**呢对吧。 ### 总结 其实敖丙我啥事故等级都没背哈哈,这个算是事故,但是敖丙我这么可爱,领导也心疼我啊,肯定不会怪我的拉,主要是我设计都考虑了很多方案和场景了,没想到有这个坑。(yy:敖丙你个渣男,又是标题党,人家还以为你没工作了要养你呢!) 大家也可以通过这次事故体会到,技术选型的时候,**方案的重要性**了吧,就算你考虑不全,但是不至于真正的问题来了手足无措啊,并不是所有的事故都可以像这次这样重启就搞定了,**不要存有侥幸心理,心存敬畏**。 ### 絮叨 敖丙啊,又有牌面了,得到**阿里云消息中间件团队**小伙伴的认可,并且发现居然是我学姐-**风云**(花名)!!! 她是个好学的小姐姐,大家多多像优秀的仔学习,学姐不是做技术的,但是都在不断学习,说实话我的眼角又湿了。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9l48ouvc1j30jg0idacq.jpg) ### 别跑,投票!!! 我准备把我的公众号**JavaFamily** 这个名字改了,这个名字还是差点意思,但是又不能叫敖丙了,被注册商标了,我就问了下群里的人才,目前有两个我比较喜欢的 - **帅丙** - **三太子敖丙** - 其他给我留言 因为这个可能会陪伴我很久,甚至直到死去,希望大家都给点建议哈哈。 别问我为啥要跟敖丙这个名字相关,**再问自杀**! 我花名就叫这个,所以😂 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9l023nupwj306y099mxr.jpg) ## 日常求赞 好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是**人才**。 我后面会每周都更新几篇一线互联网大厂面试和常用技术栈相关的文章,非常感谢**人才**们能看到这里,如果这个文章写得还不错,觉得「敖丙」我**有点东西**的话 **求点赞👍** **求关注❤️** **求分享👥** 对暖男我来说真的 **非常有用**!!! 创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见! 敖丙 | 文 【原创】【转载请联系本人】 如果本篇博客有任何错误,请批评指教,不胜感激 ! ------ > 文章每周持续更新,可以关注我的公众号「 **JavaFamily** 」第一时间阅读和催更(公众号比博客早一到两篇哟),本文**GitHub** [https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily) 上已经收录,有一线大厂面试点思维导图,欢迎Star和完善,里面也有我个人联系方式有什么问题也可以直接找我,也有**技术交流群**,我们一起有点东西。 书三千,吾全取。 人千万,独暖你。 ---暖男敖丙 ================================================ FILE: docs/creative/《吐血整理》十年风雨技术人的书单整理.md ================================================ ## 《程序人生》十年风雨技术人的书单整理 > 你知道的越多,你不知道的越多 > 点赞再看,养成习惯 > 给岁月以文明,而不是给文明以岁月 > 本文 **GitHub** [https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily) 上已经收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西。 ### 前言 王潇:格局决定了一个人的梦想,梦想反过来决定行为。 那格局是什么呢? **格局是你能够看见的深度、广度和密度。** 王潇认为,格局是一本本书搭建起来的,正如她所言:“**读书让我知道世界很大,然后才知道推开门去看看这个世界。**” 之前有一篇文章我写到了几乎是一个技术人从0到1的整个生涯了,其实大家发现根本就没有终点。 [《程序人生》风雨十年-从大学到技术专家我做了啥?](https://juejin.im/post/5ded1639e51d455830350da5) 我们的一生其实也基本上都在学习,那提到学习,我第一时间想到的就是读书了。 记得帅丙在自己21岁的那个夏天,当时拿到了自己的第一笔实习工资1400块,因为是110块一天嘛,而且入职的第一个月也没上满,但是还是很开心,第一个月师傅就给了一个建议,买本书吧。 就这样我买了出社会之后的第一本技术书籍《Java核心卷一》,也是师傅推荐的,如获至宝。 到现在我的书架都茫茫当当了,但是这本书还是一直陪伴我左右,也是我印象最深刻的技术书籍,因为那感觉就像是**初恋的味道**,甜甜的。 为啥推荐大家读书呢,**书籍的作者都是几年甚至几十年的经验,最后总结为一本书,**那就算里面有错误的点,我想你花几十块,只用几个礼拜甚至几天就可以拜读人家十几年的经验,我觉得怎么算都是血赚? ## 正文 好了扯了这么多只是想要引出今天的主题,我会按照不同的类型把我知道的一些书籍,包括身边朋友推荐的书籍,都在这里列给大家,大家按需自取。 我还推荐了很多非技术的书籍,人文地理悬疑情感都会涉及,反正很多书我是真的很喜欢。 我上一篇提到的我亦师亦友的阿里技术专家朋友,他就是个很喜欢读书的人,说实话他的**学校背景不好**,刚开始出来也是在外包干活的,但是他有个习惯,就是看书,基本上闲暇时候,都能看到他看书的身影。 看他的动态也都是分享各类书籍,**口吐芬芳**,我要是个女人,估计他跑不掉了。 反正经常读书的人,你跟他说话,看他谈吐,自然就知道了,我经常说的那句:**腹有诗书气自华** 希望你能懂,不看真像网上的段子那样,看到美好的景色只能:卧* 下面是我截图的他的几条动态,这种谈吐我爱了❤ ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9ngogekz6j30mq0b4adx.jpg) ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9ngob9s4nj30jw0b441o.jpg) ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9ngo5a0u1j30h90b4div.jpg) ### Java #### Java核心技术·卷 I(原书第10版)| Core Java Volume > 讲的很全面,书中的代码示例都很好,很适合Java入门。 > > 但是作者不太厚道的是把现在没人用的GUI编程放在了第一卷,基本上10~13章是可以不用读的。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9hbdoqljkj309p0dvdl9.jpg) #### Java性能权威指南|Java Performance: The Definitive Guide > 市面上介绍Java的书有很多,但专注于Java性能的并不多,能游刃有余地展示Java性能优化难点的更是凤毛麟角,本书即是其中之一。 > > 通过使用JVM和Java平台,以及Java语言和应用程序接口,本书详尽讲解了Java性能调优的相关知识,帮助读者深入理解Java平台性能的各个方面,最终使程序如虎添翼。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9hbm4gqmnj309p0d3776.jpg) #### 实战Java高并发程序设计|葛一鸣 > 由部分段落的行文来看,搬了官方文档。 > > 也有一些第一人称的叙述和思考,也能看出作者也是花了一点心思的。胜在比较基础,涉及到的知识点也还很全面(讲到了流水线计算和并发模型这些边边角角的),但是由于是编著,全书整体上不够统一和深入,适合作为学习高并发的第一本工具书。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9pawpmidhj307d0a4tbj.jpg) #### Java 8实战 > 对Java8的新特性讲解的十分到位,尤其是lamdba表达式和流的操作。 > > 再者对于Java8并发处理很有独到见解。对于并行数据处理和组合式异步编程还需要更深的思考才能更加掌握。 > > 推荐给再用java8但没有去真正了解的人看,有很多你不知道的细节、原理和类库设计者的用心良苦在里面、内容没有很难,抽出几个小时就能看完,花费的时间和收获相比,性价比很高。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p7u5iudbj305h06ztah.jpg) #### Java并发编程实战 > 先不谈本书的内容如何,光书名就足够吸引不少目光。“并发”这个词在Java世界里往往和“高级、核心”等字眼相联系起来,就冲着这两个字,都将勾起软件工程师们埋藏在心底那种对技术的探索欲和对高级API的驾驭感。 > > 程序员嘛,多少都有点职业病。其实Java对“并发”优化从未停止过,从5.0到7.0,几乎每个版本的新特性里,都会针对前一版本在“并发”上有所改进。这种改进包括提供更丰富的API接口、JVM底层性能优化等诸多方面。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9hkzebashj30d30h3ai8.jpg) #### Thinking in Java > 很美味的一本书,不仅有icecreamm,sundae,sandwich,还有burrito!真是越看越饿啊~ ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p80v6ph4j305406vn00.jpg) #### Effective Java中文版(第3版)|Effective Java Third Edition > Java 高阶书籍,小白劝退。介绍了关于Java 编程的90个经验技巧。 > > 作者功力非常强悍,导致这本书有时知识面迁移很广。总之,非常适合有一定Java开发经验的人阅读提升。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9o0pa3nvrj309z0d0tfd.jpg) #### 深入理解Java虚拟机(第3版)| 周志明 > 浅显易懂。最重要的是开启一扇理解虚拟机的大门。 > > 内存管理机制与Java内存模型、高效并发这三章是特别实用的。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9o0wpiwwtj308d0b3dil.jpg) #### Java虚拟机规范(Java SE 8版)|爱飞翔、周志明 > 整本书就觉得第二章的方法字节码执行流程,第四章的前8节和第五章能看懂一些。其他的过于细致和琐碎了。 > > 把Java字节码讲的很清楚了,本质上Java虚拟机就是通过字节码来构建的一套体系罢了。所以字节码说的非常细致深入。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9o11harv8j305807mgn5.jpg) ### 数据&大数据 #### 数据结构与算法分析|Data Structures and Algorithm Analysis in Java > 数据结构是计算机的核心,这部书以java语言为基础,详细的介绍了基本数据结构、图、以及相关的排序、最短路径、最小生成树等问题。 > > 但是有一些高级的数据结构并没有介绍,可以通过《数据结构与算法分析——C语言描述》来增加对这方面的了解。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9hbgso21qj30960dldo5.jpg) #### MySQL必知必会 > 《MySQL必知必会》MySQL是世界上最受欢迎的数据库管理系统之一。 > > 书中从介绍简单的数据检索开始,逐步深入一些复杂的内容,包括联结的使用、子查询、正则表达式和基于全文本的搜索、存储过程、游标、触发器、表约束,等等。通过重点突出的章节,条理清晰、系统而扼要地讲述了读者应该掌握的知识,使他们不经意间立刻功力大增。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9hl0x53imj30940cr43s.jpg) #### 数据库系统概念|Datebase System Concepts(Fifth Edition) > 从大学读到现在,每次拿起都有新的收获。而且这本书还是对各个数据相关领域的概览,不仅仅是数据库本身。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9hl29c07cj307o0b50yt.jpg) #### 高性能MySQL > 对于想要了解MySQL性能提升的人来说,这是一本不可多得的书。 > > 书中没有各种提升性能的秘籍,而是深入问题的核心,详细的解释了每种提升性能的原理,从而可以使你四两拨千斤。授之于鱼不如授之于渔,这本书做到了。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9o16axv7cj305l06z400.jpg) #### 高可用MySQL > 很实用的书籍,只可惜公司现有的业务和数据量还没有达到需要实践书中知识的地步。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9o18npb1oj305906xt9q.jpg) #### 利用Python进行数据分析|唐学韬 > 内容还是跟不上库的发展速度,建议结合里面讲的库的文档来看。 > > 内容安排上我觉得还不错,作者是pandas的作者,所以对pandas的讲解和设计思路都讲得很清楚。除此以外,作者也是干过金融数据分析的,所以后面专门讲了时间序列和金融数据的分析。 ![image-20191207121445898](https://tva1.sinaimg.cn/large/006tNbRwly1g9o1bg9xujj305606x0u4.jpg) #### HBase > 看完影印版第一遍,开始以为会是大量讲API,实际上除了没有将HBase源代码,该讲的都讲了,CH8,9章留到最后看的,确实有点顿悟的感觉,接下来需要系统的看一遍Client API,然后深入代码,Come ON! ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p7byg8jtj306q090760.jpg) #### Programming Hive > Hive工具书,Hive高级特性。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p7cxhoe8j305406wzl4.jpg) #### Hadoop in Practice| Alex Holmes > 感觉比action那本要强 像是cookbook类型的 整个过完以后hadoop生态圈的各种都接触到了 这本书适合当参考手册用。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p7e3axckj305g06pq3z.jpg) #### Hadoop技术内幕|董西成 > 其实国人能写这样的书,感觉还是不错的,不过感觉很多东西不太深入,感觉在深入之前,和先有整体,带着整体做深入会更好一点, jobclient,jobtracer,tasktracer之间的关系最好能系统化 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p7rcs59oj305c064q3s.jpg) #### Learning Spark > 很不错,core的原理部分和api用途解释得很清楚,以前看文档和代码理解不了的地方豁然开朗。 > > 不足的地方是后几章比较弱,mllib方面没有深入讲实现原理。graphx也没有涉及 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p7g4tl5pj3057070wfv.jpg) #### ODPS权威指南 > 基本上还算一本不错的入门,虽然细节方面谈的不多,底层也不够深入,但毕竟是少有的ODPS书籍,且覆盖面很全,例子也还行。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p7in91wfj30a20crjtl.jpg) #### 数据之巅|徐子沛 > 从一个新的视角(数据)切入,写美国历史,统计学的发展贯穿其中,草蛇灰线,伏脉千里,读起来波澜壮阔。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9o1e6dkcaj305706xwh2.jpg) ### 消息队列&Redis #### RabbitMQ实战 > 很多年前的书了,书中的例子现在已经不适用了,推荐官方教程。 > > 一些基础还是适用,网上也没有太多讲rab的书籍,将就看下也行,我没用过所以.... ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p62utv9aj305s07l0v6.jpg) #### Apache Kafka源码剖析|徐郡明 > 虽然还没看,但知道应该不差。我是看了作者的mybatis源码分析,再来看这本的,相信作者。 > > 作者怎么有这么多时间,把框架研究的这么透彻,佩服,佩服。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p640006rj308a0ax407.jpg) #### 深入理解Kafka:核心设计与实践原理|朱忠华 > 通俗易懂,图文并茂,用了很多图和示例讲解kafka的架构,从宏观入手,再讲到细节,比较好,值得推荐。 > > 深入理解Kafka是市面上讲解Kafka核心原理最透彻的,全书都是挑了kafka最核心的细节在讲比如分区副本选举、分区从分配、kafka数据存储结构、时间轮、我认为是目前kafka相关书籍里最好的一本。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p7pk3qbyj30ag0cvju8.jpg) #### Kafka > 认真刷了 kafka internal 那章,看了个talk,算是入了个门。 > > 系统设计真是门艺术。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p65doei8j306007ztaa.jpg) #### RocketMQ实战与原理解析|杨开元 > 对RocketMQ的脉络做了一个大概的说明吧,深入细节的东西还是需要自己看代码 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p6723irlj309x0citaz.jpg) #### Redis设计与实现|黄健宏 > 部分内容写得比较啰嗦,当然往好了说是对新手友好,不厌其烦地分析细节,但也让整本书变厚了😂,个人以为精炼语言可以减少20%的内容。 > > 对于有心一窥redis实现原理的读者来说,本书展露了足够丰富的内容和细节,却不至于让冗长的实现代码吓跑读者——伪代码的意义在此。下一步是真正读源码了。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p7jmsinsj309f0d5acg.jpg) #### Redis 深度历险:核心原理与应用实践|钱文品 > 真心不错,数据结构原理+实际应用+单线程模型+集群(sentinel, codis, redis cluster), 分布式锁等等讲的都十分透彻。 > > 一本书的作用不就是系统性梳理,为读者打开一扇窗,读者想了解更多,可以自己通过这扇窗去Google。这本书的一个瑕疵是最后一章吧,写的仓促了。不过瑕不掩瑜。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p7n1yg9qj30860aoace.jpg) ### 技术综合 #### TCP/IP详解 卷1:协议 > 读专业性书籍是一件很枯燥的事,我的建议就是把它作为一本手册,先浏览一遍,遇到问题再去详细查,高效。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p75y7qd2j306408kgof.jpg) #### Netty in Action > 涉及到很多专业名词新概念看英文原版顺畅得多,第十五章 Choosing the right thread model 真是写得太好了。另外结合Ron Hitchens 写的《JAVA NIO》一起看对理解JAVA NIO和Netty还是很有帮助的 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p795bqicj305c06r0ue.jpg) #### ZooKeeper > 值得使用zookeeper的人员阅读, 对于zookeeper的内部机制及api进行了很详细的讲解, 后半部分深入地讲解了zookeeper中ensemble互相协作的流程, 及group等高级配置, 对zookeeper的高级应用及其它类似系统的设计都很有借鉴意义. ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p7a3ko6uj306d08dgn8.jpg) #### 从Paxos到Zookeeper|倪超 > 分布式入门鼻祖,开始部分深入阐述cap和base理论,所有的分布式框架都是围绕这个理论的做平衡和取舍,中间 zk的原理、特性、实战也讲的非常清晰,同时讲cap理论在zk中是如何体现,更加深你对cap的理解. ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p7w6kz33j304n06x411.jpg) #### 深入理解Nginx(第2版)|陶辉 > 云里雾里的快速读了一遍,主要是读不懂,读完后的感受是设计的真好。 > > 原本是抱着了解原理进而优化性能的想法来读的,却发现书中的内容都是讲源码,作者对源码的注释超级详细,非常适合开发者,但不适合使用者,给个五星好评是因为不想因为我这种菜鸡而埋没了高质量内容。 > > 另外别人的代码写的真好看,即便是过程式语言程序也吊打我写的面向对象语言程序。 > > > 作者是zookeeper的活跃贡献者,而且是很资深的研究员,内容比较严谨而且较好的把握住了zk的精髓。书很薄,但是没有废话,选题是经过深思熟虑的。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9hl5674ysj30940cndi1.jpg) #### 深入剖析Tomcat > 本书深入剖析Tomcat 4和Tomcat 5中的每个组件,并揭示其内部工作原理。通过学习本书,你将可以自行开发Tomcat组件,或者扩展已有的组件。 Tomcat是目前比较流行的Web服务器之一。作为一个开源和小型的轻量级应用服务器,Tomcat 易于使用,便于部署,但Tomcat本身是一个非常复杂的系统,包含了很多功能模块。这些功能模块构成了Tomcat的核心结构。本书从最基本的HTTP请求开始,直至使用JMX技术管理Tomcat中的应用程序,逐一剖析Tomcat的基本功能模块,并配以示例代码,使读者可以逐步实现自己的Web服务器。 ![image-20191201222250542](https://tva1.sinaimg.cn/large/006tNbRwly1g9hl6blywnj30a60d5aec.jpg) #### 深入理解计算机系统 | 布莱恩特 > 无论是内容还是纸张印刷,都是满分。计算机学科的集大成之作。引导你如何练内功的,算是高配版本的计算机导论,目的是釜底抽薪引出来操作系统、组成原理这些专业核心的课程。帮助我们按图索骥,点亮一个一个技能树。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p5go30knj305t07k41h.jpg) #### 架构探险分布式服务框架 | 李业兵 > 刚看前几章的时候,心里满脑子想得都是这特么贴一整页pom文件代码上来干鸡毛,又是骗稿费的,买亏了买亏了,后来到序列化那章开始,诶?还有那么点意思啊。 > > 到服务注册中心和服务通讯,60块钱的书钱已经赚回来了。 > > 知识是无价的,如果能花几十块钱帮你扫了几个盲区,那就是赚了。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p5465ts4j30820axmzd.jpg) #### 深入分析JavaWeb技术内幕 | 许令波 > 与这本书相识大概是四年前是在老家的北方图书城里,当时看到目录的感觉是真的惊艳,对当时刚入行的自己来说,这简直就是为我量身定做的扫盲科普集啊。 > > 但是可惜的是,这本书在后来却一直没机会读上。然后经过四年的打怪升级之后,这次的阅读体验依旧很好。 > > 其中,java编译原理、 Servlet工作原理、 Tomcat、spring和iBatis这几章的收获很大。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p58vmtbgj305a06xq4a.jpg) ### 前端 #### jQuery 技术内幕| 高云 > 非常棒的一本书,大大降低了阅读jquery源码的难度(虽然还是非常难)。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p7t0px2oj305507kgn6.jpg) #### Head First HTML与CSS(第2版) > 翻了非常久的时间 断断续续 其实从头翻到尾 才发现一点都不难。 > > 可我被自己的懒惰和畏难情绪给拖累了 简单说 我成了自己往前探索的负担。网页基础的语法基本都涵盖了 限于文本形态 知识点都没法像做题一样被反复地运用和复习到。通俗易懂 这不知算是多高的评价? > > 作为入门真心算不错了 如果更有耐心 在翻完 HTML 后 对 CSS 部分最好是可以迅速过一遍 找案例练习估计更好 纸上得来终觉浅 总是这样。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p82yw9h2j306206umza.jpg) #### JavaScript高级程序设计(第3版) > JavaScript最基础的书籍,要看认真,慢慢地看,累计接近1000小时吧。而且对象与继承,性能优化,HTML5 api由于没有实践或缺乏代码阅读量导致看的很糊涂,不过以后可以遇到时再翻翻,或者看更专业的书。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p84bb5nzj30a30d1475.jpg) #### 深入理解ES6 > Zakas的又一部杰作,他的作品最优秀的地方在于只是阐述,很少评价,这在帮助我们夯实基础时十分有意义,我也喜欢这种风格。 > > 我是中英文参照阅读的,译本后半部分有一些文字上的纰漏,但是总体来说忠实原文,水平还是相当不错,希望再版时可以修复这些文字问题。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p85sjtt2j305a06sgnh.jpg) #### 高性能JavaScript > 还是挺不错的。尤其是对初学者。总结了好多程序方面的好习惯。 > > 不过对于老手来说,这些常识已经深入骨髓了。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p87g3d26j306706ymy8.jpg) #### 深入浅出Node.js|朴灵 > 本书是我看到现在对Node.JS技术原理和应用实践阐述的最深入,也最全面的一本书。鉴于作者也是淘宝的一位工程师,在技术总是国外好的大环境下,没有理由不给本书五颗星。 > > 作者秉着授人于鱼不如授人于渔的精神,细致入微的从V8虚拟机,内存管理,字符串与Buffer的应用,异步编程的思路和原理这些基础的角度来解释Node.JS是如何工作的,比起市面上众多教你如何安装node,用几个包编写一些示例来比,本书绝对让人受益匪浅。 > > 认真看完本书,几乎可以让你从一个Node的外行进阶到专家的水平。赞! ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p8cjo7t8j30a50cy0wx.jpg) #### Vue跟React的技术栈的书不多,很多也是官方文档的照搬照抄,我觉得看官网吧哈哈。 ### 非技术类 #### 失踪的孩子 > 整本书的能量太密集了,像一个源源不断喷发的火山,读完怅然若失。最后几页,莱农从时间中回望,生命的真相被自己毫不留情的剖白,而即使是这样的时刻,她依然能再次在对莉拉的爱和嫉妒中被激发开始进行她最为重要、最可能留在时间之中的作品的创作,如此的勇气,诚实和坚韧……反正我已经喜欢她了。 > > 而莉拉依然是个迷。她和莱农是相反的人,莱农会攫住一切填充自己,去成为,但莉拉对任何事情的投入都不会滋养自身,而是燃烧掉自己的一部分。 > > 她的激情,超越一切的理解和视野与她的情绪化,她的恐惧,都让人困惑。莉拉是所有人的镜子,任何人在她面前都不得不面对自己;同时,是不是没有人,或者说莉拉没有允许任何人了解她?因为她在与外界和自己的对抗中也未能真正看见自己? ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9hb6zxcnrj309a0dvdmf.jpg) #### 人生|路遥 > 想着和平凡的世界一个调子,都是乡村,都是文革的尾巴,都是那点家长里短绝对真实。 > > 我总觉得那是作者的真实写照,一切都是从自己的记忆中提炼出来的故事。 > > 只不过根据高加林我总在思考劳动人民是否应该有文化,有文化了以后就开始痛苦,开始怀春悲秋,开始事逼,开始怨天尤人。 > > 知识分子那些臭毛病显露无疑。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p4zwk1hkj304r06o74x.jpg) #### 丝绸之路 | 彼得·弗兰科潘 > 书的颜值很高,厚厚的大开本,包装和纸张都不枉自己百元大洋。书名虽叫【丝绸之路】,但是读后发现其实是以中东为针,一路串起亚欧大陆各个文明两千多年间所发生的故事。 > > 从史实、文化、宗教、政治、权力、金钱等多方面论述了以中亚和欧洲为主的发展史,信息量非常的大。每个章节的标题都用四个字直接道出当前世界的核心驱动,比如基督之路、铁蹄之路、西欧之路、纳粹之路、争霸之路。 > > 视野广阔,大开大合,时间跨度可算是穿越千年中东。美中不足的是,中国作为丝绸之路东段上最为重要的国家,描述的篇幅却很少。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p523axbhj308w0d3gxt.jpg) #### 我的天才女友 | 埃莱娜·费兰特 > 来自意大利作家的小说,“那不勒斯”四部曲的第1部,讲述了两个女主人公莉拉和埃莱娜的少女时代。 > > 相比七月与安生,跨度更大,情节也要丰富很多,但是作为一个男性阅读角度似乎get不到小说所评价那样优秀的点,代入感很好,时间已经过去好久,现在留在记忆中的还是如西西里的美丽传说般暖色调的意大利小镇上有两个小女生在平淡的生活。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p52yzal1j308i0cujvr.jpg) #### 长安十二时辰 | 马伯庸 > 开年第一单,阅读体验非常的好,完全是美国个人主义英雄大片的大唐版,而主人公张小敬身上却有着更多的坚忍和矛盾,中间有个片段,讲檀棋在元宵灯会的街上跟着张小敬,在万千盏灯笼一齐高高烛起,光彩明耀,火树银花中,看张小敬的背影显得很是落寞。 > > 读完之后,这一幕仍然记忆犹新,靠整个故事的支撑,这一幕真的完全可以体会到落寞二字。 > > 书中很认真的说了一些长安的城建和大唐的民俗,管制,可以看出来为了写出这本书,亲王的确是花费了不少心思的,很佩服。 > > 一本非常非常适合改编成电影的小说(事实上也的确正在拍摄),值得推荐。 > > ps:2019年同名电视剧已经上线了… ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p55k5ae1j305x088tbb.jpg) #### 布谷鸟的呼唤 | J·K·罗琳 > 大概三年前买的,今年回家整理新书架的时候发现了它,就带回杭州了。 > > 故事情节比不上哈利波特,但是文笔是真的没得说,毕竟是能写出来哈利波特的人。 > > 作为推理小说,怕是不及格,但是把它作为犯罪小说之类的非类型小说来看的话,其实阅读体验还是可以的。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p570nyqlj304906c0ut.jpg) #### 欧洲:1453年以来的争霸之路 | 布伦丹·西姆斯 > 自文艺复兴之后,欧洲开始渐渐的走进地球文明的舞台正中心。 > > 读到中间德意志民族的内政被周边国家的各种干涉,感觉德国和我们的兔子一样,是个多难的民族,所以统一之后思想家才会这么多,一战二战的德国,如果用兔子的一句话概括,我们走了一些弯路。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p57r7m8bj305106vab6.jpg) #### 房思琪的初恋乐园 | 林奕含 > 正如文前李银河所说,林奕含属于老天爷赏口饭的那种人,非常有才华的、有灵气的一位年轻作者。我们应当感激,不用亲身经历,就可以看到世界的背面,难以想象出林每次去回忆,然后再去一步一步的描述出当时的心理活动,此间的痛苦。 > > 最后,书中的话:忍耐不是美德,把忍耐当成美德是这个伪善的世界维持它扭曲的秩序的方式,生气才是美德。 ![image-20191208111703561](https://tva1.sinaimg.cn/large/006tNbRwly1g9p59q27ptj308v0d1goe.jpg) #### 毛泽东传 | 迪克·威尔逊 > 来自英国人的传记,可以当做记事表,而且就算有一些主观评价在里面,作为外国人难免有偏差,也不可信,毛公当称之为我等民族力挽狂澜第一人。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p5a4lrkoj30930cvq6k.jpg) #### 半小时漫画世界史 | 陈磊 > 和上一本中国史一样,阅读体验很轻松,如果是对这段历史毫无概念的话,真的砸墙推荐。但是如果是要有了一定的知识储备的话,那就没啥意思了,半小时也别指望能讲多深了。 > > 巴黎和罗马真的是太值得去一次的了。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p5akzxwcj305q080ju1.jpg) #### 欧洲现代史:从文艺复兴到现在 | 约翰·梅里曼 > 耶鲁大学历史教授的课堂讲义,采用的是国别和编年混合风格,顺着历史发展的脉络逐一展开,又不失相互关联性,而不是简简单单的说几几年发生了什么,几月几日谁谁谁死了这些。 > > 5个世纪中葡萄牙西班牙瑞典荷兰法国轮流崛起,俄国西化,德国统一,英国宗教改革,奥地利波兰土耳其相继衰落,文艺复兴,启蒙运动,航海时代,工业革命,世界大战,美苏冷战。 > > 维多利亚女王拿破仑一世路易十四彼得大帝叶卡捷琳娜俾斯麦希特勒丘吉尔,当称人类群星闪耀时。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p8gzwznxj308k0cxgur.jpg) #### 爱德华•巴纳德的堕落:毛姆短篇小说集1 | 毛姆 > 屯了毛姆这么多书,这次才是第一次看。 > > 书的纸张倒是很有意思,600多页,却很轻。故事读起来倒像是个老朋友再和你讲故事,叨叨叨的从夏威夷讲到南美洲,又从西海岸讲到东南亚,讲故事的水平非常的高,几乎都是几段字下来,就把人带到了故事场景中。最喜欢的两篇是爱德华•巴纳德的堕落,赴宴之前,和最后的译后记。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p8hfbpmwj30910d3q62.jpg) #### 一句顶一万句 | 刘震云 > 第八届茅盾文学奖获奖作品,叙事架构犹如一生二二生三三生万物绵绵不绝扩散开来,薄薄三百页,前后一百年,初看时以为《平凡的世界》,结局才发现是《百年孤独》,“生活是过以后,而不是过从前”。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p5f2o019j30880c977w.jpg) #### 生活的艺术家 | 李小龙 > 来自李小龙的一本散文集,是的,就是那个李小龙。 > > 很难想到那个在电影里面喊着啊哒~的他,大学是专修哲学的。书中的文章大都是对于生活和哲学的思考,可以看到那个在大荧幕前面一秒五踢啊哒啊哒的背后,是一个冷静、理性、智慧、通达的李小龙。“我无法教你什么,只能帮助你探求你自己。除此之外,别无他法。” ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p5fhyndzj30960d0jv0.jpg) #### 穷查理宝典 | 查理芒格 > 查理芒格的思想集和演讲稿编,知识面跨学科,洞察力才能足够深,包括数学、物理、生物、历史、经济等这些硬学科,从而形成一个多学科的思维框架。 > > 致富也不只是赚了多少钱那么简单,而是在道德品质、阅读能力和个人生活上全面提升的过程。应该专注于正在做的事情,多阅读,特别是传记,来和“伟人”交朋友,减少物欲,满足自己已经拥有的,不嫉妒别人。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p5g0q0xrj308x0cu790.jpg) #### 汉密尔顿传 | 罗恩·切诺 > 我只能说汉密尔顿,这个被印在美元上的人,人生只能用精彩至极来形容了。 > > 书中详细介绍了汉密尔顿在独立战争、费城制宪、宪法批准、首届国会以及建国初期等不同历史阶段中发挥的巨大作用,尤其是建国之初,在一切都没有先例的情况下,汉密尔顿为奠定美国联邦的政治体制、经济秩序和金融体系做出了巨大的贡献——建立美国信用体系,建立联邦银行,建立联邦税收体系,建立海关,建立海岸警卫队,以及促进制造业发展等。 > > 在这本波澜壮阔的自传的最后,本以为能写上一大段对他的盖棺定论,然而却很平淡随意的用他写给艾丽萨的一封信作为了结尾,可能是不再需要作者去告诉书前的人他该如何评价,历史已经给出了答案。 > > “艾丽萨,你治愈了我此生因爱而生的伤痛。” ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p5h41987j308r0d4jxn.jpg) #### 百年孤独|加西亚·马尔克斯 > 久负盛名的大作,读完只能说,果然只有这种书才配得上诺奖。 > > 先前看《霍乱时期的爱情》,印象最深的就是华丽魔幻文笔和细腻的心理活动描写,到这本《百年孤独》,震撼的目瞪口呆,怎么能有人写得出这样的小说。 > > 只能说,无论怎么列必读书籍,都绕不开此书。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9payh7k2gj304w06zjtm.jpg) #### 月亮与六便士 > 毛大爷名气最具盛名的一本书,很易读的文学作品。 > > 全篇小说都是从第一人称“我”的角度,对斯特里克兰德进行了主观的描写,从斯特里克兰德开始离家出走开始渐入佳境,毛姆在环球旅行中写作,以至于场景地点的代入感都非常强,带着读者登上塔希提岛上,在酒馆里和众人逐个聊起斯特里克兰德,“我”和读者一起,在一来一去的谈话中,了解到了这个天才最后的经历。后半生穷困潦倒的他在死的时候,肯定不会知道自己在死后的一个世纪,被称之为天才,画作也被收藏在美术馆作为镇馆之宝,流传百年。但他是自由的,没有遗憾的。 > > 最后引用一段话,“只要在我的生活中能有变迁——变迁和无法预见的刺激,**我是准备踏上怪石嶙峋的山崖,奔赴暗礁遍布的海滩的**。” ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9pazz9ps7j305d08fabf.jpg) #### 股票作手回忆录|杰西·利弗莫尔 > 被誉为百年美股第一人,杰西·利弗莫尔的自传,五美元起家,到日赚一亿美金的投机之路,可以看到利弗莫尔在小的时候就对数字有着非常人的敏感和对波动线的记忆力,十多岁只身一人远走纽约,更见其杀伐果断之气。全书并没有讲操作细节,但是传主的做事风格很值得研究,时机、独立思考、判断、知错能改、以及鳄鱼般的耐心。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9pb22853bj307h0avjw3.jpg) #### 万历十五年 | 黄仁宇 > 一本表面上写历史,却涵盖当时的政治、经济、社会民俗、当世思想的大作,对中国历史上诸多王朝暗流下那道潜规则的分析和批判。格局之大,立意之高,实属罕见。 > > 读罢全书,我们明白明王朝的覆灭是必然的,而后的满清,只不过是改朝换代,骨子里与前朝无异,灭亡也是迟早的。 > > 我们的身上被锁住了一个牢固的枷锁,丢在泥坑,都在挣扎,越来越烂。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p5hlkzacj306q0a678y.jpg) #### 第五项修炼| 彼得·圣吉 > 前半部分理论,后半部分讲实战。捞干的来说,大局观的系统思考能力、增长极限和转移负担的自我超越能力、正向暗示的心智能力,拓展认知边界建立跨学科的思维架构能力。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9paqbo315j307o0aegq9.jpg) #### 海边的卡夫卡|村上春树 > 卡夫卡,舒伯特,艾希曼,琼尼沃克,乌鸦少年,短毛猫语,竹筴鱼雨,肠子迷宫,夏目漱石,雨月物语,俄狄浦斯。在这个世界上,不单调的东西让人很快厌倦,不让人厌倦的大多是单调的东西。 > > 我的人生可以有把玩单调的时间,但没有忍受厌倦的余地,而大部分人分不出二者的差别。 > > 孤独因你本身而千变万化。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p8j94vu8j305l080tau.jpg) #### 白夜行|东野圭吾 > 把小说写成这样绝对是开挂了吧,除了连番登场的几十号人物,随处雕琢的大时代的背景也让人叹为观止。对人性的挖掘比起吉田修一还是弱一些,就是纯好看,从第一句开始吸住你逐渐往往里掉。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p8lcl2kjj308v0cjta5.jpg) #### 嫌疑人X的献身|东野圭吾 > 这个社会 每一个人都是时钟上的齿轮,为了自己的意愿,也不该牺牲掉他人,哪怕那是出于爱,一个错误尚且为错,付出更大的努力用更大错误也扭转不了的, > > 这毕竟不是数学的负负得正,逻辑之所以没法解决罪恶的问题,只因为最初就规避了人性。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p8mu1j9ij303v05wq3o.jpg) #### 追风筝的人|卡勒德·胡赛尼 > 为什么忠诚善良的人反而遭到这样的结局,面对阿米尔的污蔑,他和阿里选择离去。 > > 当房屋需要他时,他又毅然决然的选择坚守,为了阿米尔能够得到父亲的赞许,哈桑却受到那样的凌辱,换来的却是懦弱的阿米尔的回避,身份,阶级,好可笑的头衔,生命与忠诚在那些虚无的名誉不值一提。 > > 犹如草芥浮萍.... ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p8pkbzjzj30890ba449.jpg) #### 恋情的终结 | 格雷厄姆 > 现在看的小说都不多了,而爱情小说更是少之又少,但幸运的是,这本和上一本霍乱时期的爱情一样,都是不可多得的大师之作。 > > 小说情节简单来说就是爱上了个有妇之夫,然后阴差阳错私奔失败,接着分道扬镳直到多年之后的偶遇,最后女主患病而亡。 > > 但文笔是真的细腻到不敢相信是个男人写的,书里穷尽了爱情中所有狂热的情感,狂热的爱,狂热的恨,狂热的猜疑,狂热的嫉妒,狂热的占有。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p5i3ws6rj308w0cx433.jpg) #### 龙族I-IV|江南 > 我十六岁的时候,看《缥缈录》,心中念着那个拿着虎牙枪的少年。 > > 如今我二十三岁了,看《龙族》,面对一堆白烂中二的吐槽不知所措。 > > 就像拿枪的少年穿起了风衣,救美的英雄接受了金币。我看着商业化写作对一个作者的侵蚀和改变,这让我觉得难过极了。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p8rgagdzj307g0afwjl.jpg) #### 三体I-Ⅲ|刘慈欣 > 《三体》就是那种让你在读完三部之后掩卷抬头,感觉眼中的世界都从此不一样了的书。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p8vyqi5aj306t09s0xq.jpg) #### 流浪地球|刘慈欣 >觉得文笔胜于三体,且惊觉是三体之前的作品。 > >对于其中地球变轨后的生态变化仍存在疑惑,那段地球与木星擦肩表现力强,不错的作品。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p8x4x6grj306o09tn1b.jpg) #### 全球通史 > 这种时间跨度如此之长的,有之前的《丝绸之路》和《人类简史》,但是无论是整体行文的架构、视野的宽度、以及分析思考的深度上来说,此书都要比这两本要优秀得多,尤其是到一战之前的部分。 > > 幸亏之前大量零碎的知识点做背书,再遇此书建立整体体系,穿针引线,才有所体会到书前序中的"思接千载,视通万里"之感。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p5ikz4iqj305d06emyk.jpg) #### 程序员的自我修养|俞甲子 / 石凡 / 潘爱民 > 讲的不错,将硬件与系统、机器层与实现层整合了起来,有了一个很清晰的视角。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p5yfbt7nj3062081q5e.jpg) #### 颈椎病康复指南|董晓俊 > 出来打工不容易,大家照顾好自己。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p9d2xa3fj304v06pwgh.jpg) #### 活着|余华 > 为啥安利这个,大家懂就好了 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p5vdln2rj306a09h0u9.jpg) #### 我们一无所有|安东尼·马拉 > 艺术让我们不因真实而亡故,结构相当特别,像是在看电影。 > > 讲述从苏联联邦到新俄罗斯近80年历史车轮下一些动人心魄的小人物微尘。 > > 语言克制、平静,读来却十分疼痛,或是戏谑嘲讽像是苦中求乐,非常喜欢。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p92czed3j30930cxtdg.jpg) ### 总结 其实我觉得在我们现在这个浮躁的社会,大家闲暇时间都是刷抖音,逛淘宝,微博......他们都在一点点吞噬你的碎片时间,如果你尝试着去用碎片的时间看看书,我想时间久了你自然能体会这样的好处。 美团技术团队甚至会奖励读完一些书本的人,很多公司都有自己的小图书馆,我觉得挺好的。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p9ws50vbj309w02smx9.jpg) 我现在也认识很多作者,像程序员小灰,老钱这样的作者,都很不错,如果未来自己能达到写作的条件的话我也想写哈哈。 至于我为啥不敢懈怠......三歪(java3y作者)在我对面我真的不敢有丝毫放松,每次闲暇之余我准备拿起手机玩耍的时候,看到他在看书,我默默的放下手机,就是这样的人在不断鞭笞着我。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9p9inda6cj30ci0bk3zp.jpg) ### 鸣谢 自己技术群的小伙伴:很多书籍我没写进去,主要是记录被刷走太多了,我让大家私聊,结果都发群里了,我就懒得整理了,主要是没书评我没看过也不敢写。 豆瓣小伙伴:很多我没有的书籍我都是找的豆瓣书评。 阿里技术团队的小伙伴:文章有很多书评都是来自他。 博文视点:对文末抽奖的赞助 **其实很多好书我都没写到,一时想不到,大家有喜欢的也留言让更多朋友看到嘛,我有空会修改文章。** **还有就是本文主要的目的不是安利多少书,主要是想大家放下手机翻开你在角落积灰的书籍,你会发现里面有光的。** 这周双十二有点小忙,年会的事情也紧锣密鼓的筹备着,我下周要是鸽了那...... ### 抽书!!! #### 书名:Java系统性能优化实战 ![](https://tva1.sinaimg.cn/large/006tNbRwly1g9rvg6ddgyj30b20ey76x.jpg) 个人推荐理由: - 20多个优化技巧:说明Java性能优化的各种方法。 - 30多个具有“坏味道”的代码片段:实战演练优化技巧。 - 常用的高性能工具:以Caffeine、Jackson、HikariCP为例进行讲解,并对其高性能的原因做一定的源码解析。 - 容易阅读的代码:从代码注释、代码分解和面向对象三方面讲解如何编写容易阅读的代码。 #### 规则: 抽两本,公众号「**三太子敖丙**」这个文章下面留言点赞排名前两位送两本,截止本周我发周报之前,公众号和掘金周六我会写周报。 觉得概率不大? **月底会有一个文章抽30本书**,至于送啥书,贫穷的我得好好想想。 ## 点关注,不迷路 好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是**人才**。 我后面会每周都更新几篇一线互联网大厂面试和常用技术栈相关的文章,非常感谢**人才**们能看到这里,如果这个文章写得还不错,觉得「敖丙」我**有点东西**的话 **求点赞👍** **求关注❤️** **求分享👥** 对暖男我来说真的 **非常有用**!!! 创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见! 敖丙 | 文 【原创】 如果本篇博客有任何错误,请批评指教,不胜感激 ! ------ > 文章每周持续更新,可以微信搜索「 **三太子敖丙** 」第一时间阅读和催更(比博客早一到两篇哟),本文 **GitHub** [https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily) 已经收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西。 ================================================ FILE: docs/creative/彩蛋.md ================================================ ### 我定期收集一些话放在这里,大家一起共勉. - 无论面对怎么样的失败,我决定再来一次。 - 最高级的自律,享受孤独。 - 你要悄悄拔尖,然后惊艳所有人。 - 如果父母还那么辛苦,那我们长大有什么用? ================================================ FILE: docs/creative/顶级程序员的百宝箱.md ================================================ > > > 你知道的越多,你不知道的越多 > 点赞再看,养成习惯 > **GitHub**上已经开源 [https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily) 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和指教 ## 前言 这期是被人才群交流里,还有很多之前网友评论强行顶出来的一期,就是让我介绍自己常用的一些工具给他们安利一下,我一听很高兴呀,帅丙我这么乐于奉献的人是吧。 主要是能水一篇文章就很开心,不过写下来发现花的时间完全不比写技术少,**点赞**!!! 千万不要白嫖,**真香警告**⚠️。 但是我在构思这篇文章的时候发现我贴个标题,然后发下软件信息会不会太乏味了,于是创作鬼才我呀,准备用一个产品的研发流程,是的就是**用这样的一个思路**去写这个工具集的介绍文章。 因为读者很多还是学生,还有很多应届生,对一个需求的研发流程都不是很熟悉,还有可能对于以后自己需要使用到的工具都不是很熟悉,那我就一一罗列一下,帅丙我作为一个还算有点小经验的程序员都使用哪些工具呢? 那下面就跟随**暖男**的脚步,走进**顶级程序员的百宝箱**吧(我所有的标题都是噱头就为了夸大其词,我是低级程序员,大家看了也不能吊打面试官,笑笑就好了)。 **注意**:下面的软件我都是简单的介绍下是干啥的,因为太多了,真正的功能需要大家深挖的,能力允许的朋友下载正版,破解方法去Github [https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily) 加我回复【**软件**】就好了。 ## 正文 既然都说了**帅丙**是要用一个产品的研发流程角度去介绍软件,那我们先看看一个产品有哪些研发流程,帅丙就用自己接触的阿里系的研发流程举例了,这也基本上是互联网大厂的研发流程了,可能细节有出入,但是绝对大同小异。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g99d853pj1j30qj0bxq32.jpg) **Tip**:我从开发的视角去介绍的话我就会**跳过一些**软件,比如提出需求这个其实一般都是文档类的,**wiki**呀这样的形式。 我就不介绍那种流程工具了,公司很多自研的,大家工作了再去熟悉也很快的。 ### 概要设计: **概要设计**,这个是大厂程序员需求下来之后基本上都会做的一步,不过看需求大小,可能很多小需求直接就**详细设计了**。 很多不了解的同学可能会问,需要设计什么呢?为什么要设计呢? 问得好,经常看我文章的都知道,**技术是把双刃剑**,你用了技术之后你是不是需要**列出他的优点缺点**,出问题之后的**解决方案**,还有**可能出现的问题**,**注意点**等等。 这么是为了让你能有把控力,比如你用了个**Es**(**Elasticsearch**)你什么都不管你就是要接入它,你把他开发好了上线了,但是有啥坑你知道么?上线崩了怎么办? 帅丙我做**Es**设计的时候设计被老大打回N次,不过成长真心大,对**Es**的了解也飞速进步。 其实远远不止这些问题,这就是我们做设计的主要原因,也是大家工作里面能成长的途径之一,你以为大佬们的经验是怎么来的? ##### 工具:Xmind/ProcessOn - Xmind官网地址: [https://www.xmind.cn](https://www.xmind.cn/) - ProcessOn**在线作图**地址:[https://www.processon.com](https://www.processon.com/i/5c349823e4b0db2e592c4847) > 我这里列举了两个工具,他们两个都可以做概要设计的脑图,我给大家看看我设计过的一些脑图,都是出自这两个软件。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g99emaijzoj30hr0zhgnq.jpg) 大家在学习,看书等等的时候做个脑图,我告诉你后面你复习还是干啥都**思路贼清晰**,而且**效率**瞬间**高**很多。 ### 详细设计 小伙伴又要问了啥是详细设计呀**帅丙**? 诶呀简单,见名知意嘛,概要设计是大概的设计,详细设计是详细的设计。 我们研发的时候整个流程往往很复杂,如果你理解不对直接就写代码,最后容易造成返工,延期,加班,被骂,心情差,回家吵架,离家出走。。。 **看到不做详细设计的后果了吧**,其实大家花点时间做详细设计很有必要,你思路完全清晰了,写代码那就是分分钟的事情,不是嘛? 那再看看帅丙的一个小设计吧,之前文章中大量的流程图,时序图都来自它,**主要是这玩意还是在线的,都不用下载很方便啊。** 详细设计的工具我用的就是**在线**作图神器:**ProcessOn** - 在线画图地址:[https://www.processon.com](https://www.processon.com/i/5c349823e4b0db2e592c4847) > 总之一句话很香,流程图、思维导图、原型图、UML、网络拓扑图、组织结构图、BPMN等等一应俱全 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g9agh6woxsj31h90pfn6k.jpg) ### Ascilflow - 官网地址: [http://asciiflow.com](http://asciiflow.com/) > 进入网站后直接开画!网页上端是菜单,自行操作! ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g9b8zxdu58j31h70pjmy9.jpg) ### 研发 这个关键了:**工欲善其事,必先利其器** 想必大家都知道这个谚语吧,我就说一下我写代码要用到的软件吧。 #### Intellij IDEA - 官网地址 : [http://www.jetbrains.com/idea](http://www.jetbrains.com/idea/) > 这个我想都不用我介绍了吧,Java的同学都耳熟能详了,有同学问为啥不用eclipse呀,我不作回答,但是我只能告诉你IDEA肯定是效率还有很多方面都要香的。 > > 不过看个人习惯的哈,新同学还是推荐IDEA!!! ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g9als0bk5ej30pe0hsdr7.jpg) #### WebStorm - 官网地址 : [http://www.jetbrains.com/webstorm](http://www.jetbrains.com/webstorm/) > 有知道同学要问了,帅丙这不是前端的开发工具么,为啥你要用,帅丙我呀全才来的呀,前端偶尔也写点的嘛,主要是js,vue,jq,还有丢丢React,不过最近帮三歪改前端居然是jsx有没有大佬救救我啊。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g9alu9ppltj318c0qmk61.jpg) ### Visual Studio Code - 官网地址:[https://code.visualstudio.com](https://code.visualstudio.com/) > Visual Studio Code是一个**轻量且强大的跨平台开源**代码编辑器(IDE),支持Windows,OS X和Linux。内置JavaScript、TypeScript和Node.js支持,而且拥有丰富的插件生态系统,可通过安装插件来支持C++、C#、Python、PHP等其他语言。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g9b8ss7mr4j30jl0cc0xi.jpg) #### PyCharm - 官网地址 :[http://www.jetbrains.com/pycharm](http://www.jetbrains.com/pycharm/) > 这个是python之前那次还记得我写代码大赛那期嘛,最开始就是用这个写的,平时学的时候也用用。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g99j15dhq6j31c00u0gta.jpg) #### Navicat Premium - 官网地址 :[https://www.navicat.com.cn](https://www.navicat.com.cn/) > 这个呀是数据库的可视化工具很香很好用,不过我们线上的表都是网页操作的,这个只能用来看看本地的开发表了,不过也是很有必要的,你SQL怎么都得本地跑一下没问题,才向DBA申请的嘛。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g99j2ghjzsj31i00u0ttm.jpg) #### Postman - 官网地址 :[https://www.getpostman.com](https://www.getpostman.com/) > 这个是接口调试的神器,单测比较繁琐的你可以试试这个嘛,不过很多接口还是只能写写单测,反正很香。 > > 不过这个名字一看就是男生用的,那我们女生用啥呢?往下看 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g99j4v0e29j31gy0u0n4k.jpg) #### Postwoman - 官网地址 :[https://postwoman.io](https://postwoman.io/) > PostMan一听就是男生用的,咋妹子们肯定要用最近开源的Postwoman啊,它是一款开源的 Postman 替代品 > > > > 开源没多久优点如下: > > - 轻盈,可直接在线访问; > - 简约,采用简约的 UI 设计精心打造; > - 支持 GET, HEAD, POST, PUT, DELETE, OPTIONS, PATCH 方法; > - 支持验证; > - 实时,发送请求即可获取响应。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g9ahb0a8p6j31h90q440x.jpg) #### GIt - 官网地址 :[https://git-scm.com](https://git-scm.com/) > 代码文档管理工具,版本控制工具,大家之后的代码基本上都是使用git做版本管理 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g9afd6lxdvj30w30u0qbk.jpg) #### Maven - 官网地址 :[http://maven.apache.org](http://maven.apache.org/) > 目前帅丙用到Maven的主要功能是:项目构建、项目构建、项目依赖管理、软件项目持续集成、版本管理、项目的站点描述信息管理 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g9afdu2hd0j31i40u0tg8.jpg) #### Gradle - 官网地址 :[https://gradle.org](https://gradle.org/) > Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。 > > 它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,目前也增加了基于Kotlin语言的kotlin-based DSL,抛弃了基于XML的各种繁琐配置。 > > 这个跟Maven功能是一样的,但是两者语法不一样,而且我觉得版本控制的时候没Maven好使,有小坑,胜在语法简洁。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g9afep032lj31i40u0wkt.jpg) #### Charles - 官网地址 :[https://www.charlesproxy.com](https://www.charlesproxy.com/) > 这玩意是个HTTP代理服务器,我用它的主要用法就是抓包! > > 都知道我是做电商的嘛,很多线上接口线上问题怎么排查呢,抓包看看数据呗。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g9afgt3cc9j31fo0u0n68.jpg) #### JMeter - 官网地址 :[https://jmeter.apache.org](https://jmeter.apache.org/) > Apache JMeter是Apache组织开发的基于Java的压力测试工具 > > 是的就是用来压测的,你怎么模拟很多请求呀,就用它就对了。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g9afla5m32j31400my41b.jpg) #### Dash - 官网地址 :[https://kapeli.com/dash](https://kapeli.com/dash) > Dash for mac是使用与Mac OS平台的软件编程文档管理工具,可以浏览API文档,以及管理代码片段工具。Dash自带了丰富的API文档,涉及各种主流的编程语言和框架。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g9aflq534fj310a0j4dig.jpg) #### Devdocs - 官网地址:[https://devdocs.io](https://devdocs.io) > 上面那个的兄弟,但是这个不用下载,在线的 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g9b9h6a1pwj31660q6jvu.jpg) #### DataGrip - 官网地址 :[http://www.jetbrains.com/datagrip](http://www.jetbrains.com/datagrip/) > DataGrip是JetBrains公司推出的管理数据库的产品,对于JetBrains公司,开发者肯定都不陌生,IDEA和ReSharper都是这个公司的产品,用户体验非常不错。 > > 最开始我用它就单纯看同事在用很酷的界面,后面发现功能也香,高亮文本啥的,很多功能大家可以去挖。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g9alsqphykj316k0u04in.jpg) #### JVisualVM - 官网地址 :[http://visualvm.github.io](http://visualvm.github.io/) > VisualVM 是Netbeans的profile子项目,已在JDK6.0 update 7 中自带,能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的)。 > > VisualVM可以根据需要安装不同的插件,每个插件的关注点都不同,有的主要监控GC,有的主要监控内存,有的监控线程等。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g9afw3e9wzj31hc0tdaeo.jpg) #### Iterm2 - 官网地址 :https://www.iterm2.com/ > 这个是我做日志排查的客户端工具,也是支持很多配置,直接ssh上跳板机查看线上机器的状态等等,线上问题排查还是很有必要的。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g9ahq66wfhj30ou0fjwk0.jpg) #### 网*有道词典 - 官网地址 :[http://www.youdao.com](http://www.youdao.com/) > 有朋友要疑问了帅丙这是什么情况,鬼畜乱入么? > > 不是的,我们研发的时候很多单词不认识,或者命名的时候这个词汇的英文不知道还是很有必要查一下的,规范的命名是你成为顶级大牛的第一步,你命名都是A,B,C你代码review的时候,你的Leader会叫hr让你提交前回家过年的,马上过年了大家不要轻易尝试。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g99j6i4dsuj312o0u0aq2.jpg) #### Sublime Text - 官网地址 :[http://www.sublimetext.com](http://www.sublimetext.com/) > 这是个文本记录的工具,也可以用于写代码,但是我们有IDE了那就用来当日常琐事记录的工具,临时文档处理的工具也是可以的,反正还是很好用的。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g9agwetpxvj30x30gkq7p.jpg) ### 刚好最近呀人才群里的人才们都叫我安利一下我做笔记还有写博客的工具,说我排版好看。(我飘了) 安排! #### 印象笔记 - 官网地址 :[https://www.yinxiang.com](https://www.yinxiang.com/) > 这个可以说是陪伴我大学到现在的一个工具了吧,我数了下,上千文件了,我的生活琐事的记录,还有学编程之后的很多东西,我都是收录在里面的。 > > 这个东西我就不和别的笔记比较了,因为我最开始就用的这个一直没换过,好不好用我说了不算的,大家下一个看看就知道了。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g99j876vuvj31ia0u0kjl.jpg) #### Typora - 官网地址 :[https://www.typora.io](https://www.typora.io/) > Typora是我一直写Markdown的工具,好用到不行,还可以切换模式你敢信?打字机模式,专注模式,源码模式总有一个你的菜. ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g99j8ii9obj31gy0u0tyo.jpg) #### Ipic - 官网地址 :[https://ipic.ca](https://ipic.ca/) > 图床我是配合Typora一起使用的大家Markdown是不是复制图片进来都是本地的地址,发到网上就会失效的,但是跟Typora搞基的这个工具他可以在你复制进来的时候直接传到网上了,你再去任何平台发表都可以随心所欲了。 ![](https://ps.toolinbox.net/trluz.png) #### Md2All - 官网地址 :[http://md.aclickall.com](http://md.aclickall.com/) > 大家好奇我的markdown怎么这么好看呀,其实我写了markdown之后还转成了html的,用的也就是上面这个工具。 > > 我写完也是在这里面进行排版然后发出去的,排版要花好久,忍不住给帅丙**点赞**。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g99ja7zzqrj31s10u0tor.jpg) ### 图像处理 #### Adobe Photoshop CC 2019 - 官网地址 :[https://www.adobe.com/cn/products/photoshop](https://www.adobe.com/cn/products/photoshop.html?promoid=PC1PQQ5T&mv=other) > Ps嘛大家都知道的,正常的图片处理啊用这个香,没事帮美女P下图,搞不好能找个女朋友(我又开始YY了) ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g9aellqehdj31gy0u07dw.jpg) #### Adobe Premiere Pro CC 2019 - 官网地址 :[https://www.adobe.com/products/premiere](https://www.adobe.com/products/premiere.html?promoid=PQ7SQBYQ&mv=other) > 这个可能是大家使用得最多的视频处理软件了吧,很好用!!! > > 功能全到无法令人呼吸,缺点就是学习成本有点大,入门很快,想成为大神需要大量时间积累。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g8rrp2k72aj31gy0u0b29.jpg) #### Adobe After Effects CC 2019 - 官网地址 :[https://www.adobe.com/cn/products/aftereffects](https://www.adobe.com/cn/products/aftereffects/free-trial-download.html) > 不知道大家视频看得多么,很多视频的特效开场都是这个做的,下面也有一个我的demo。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g9aep93470j31gy0u0tqx.jpg) ## ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g9alplvitqg30mq0ci1ky.gif) #### GIPHY CAPTURE - 官网地址 :[https://giphy.com/apps/giphycapture](https://giphy.com/apps/giphycapture) > 有时候大家文章不想用静态的图画去表达,想录制写代码的Gif动图,那这个软件是真的好使。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g9af4nrtraj312v0u0e81.jpg) #### 视频播放 KMPlayer - 官网地址 :[http://www.kmplayer.com](http://www.kmplayer.com/) > 其实帅丙我心中有个播放神器的,快播。 > > 可惜了还没用多久,播播就夭折了,我会使用下面这个播放软件去播放我自己的视频。 > > 因为很多格式电脑自带的可能不支持,我又喜欢剪辑视频,所以一直用它了。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g9af6ekmrzj31940pen0r.jpg) #### Iina - 官网地址:[https://www.iina.io](https://www.iina.io/) > 视频播放 同上 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g9bacpyr2aj30j80aujxe.jpg) #### DouTu - 官网地址 : [https://www.52doutu.cn/maker/1/?order=timedown](https://www.52doutu.cn/maker/1/?order=timedown) >大家是不是发现我之前的文章很多表情包,其实都是在线制作的。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g9akz3fsduj30ze0qe4qp.jpg) #### Carbon - 官网地址 :[https://carbon.now.sh/](https://carbon.now.sh/) > 帅丙之前的文章里面很多代码的图片都是这个网站生成的,很多样式可以选择,就很好看。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g9akzyz0lbj30ss0nm41u.jpg) #### CodeLF - 官网地址 :[https://unbug.github.io/codelf](https://unbug.github.io/codelf/#帅丙) > 这个网站有意思了,写代码不知道单词怎么命名就去这里查,他是GItHub的一个爬虫工具吧,看看大神的命名总是会有思路的吧。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g9al2vyo5nj30lv0bydgx.jpg) **注意**:上面的软件我都是简单的介绍下是干啥的,因为太多了,真正的功能需要大家深挖的,能力允许的朋友下载正版,破解方法去Github [https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily) 加我回复【**软件**】就好了。 ## 总结 其实比较香的工具还有太多了,我这里就不一一介绍了,其实有个很简单的办法,就是**问**,**学习**,**借鉴**。 我就是这样的,我看Leader用的什么工具我就问他这是啥,好用不?怎么用? 包括我写博客吧,其实才写了20多天,第一天准备写的时候我就直接问**三歪(Java3y)**,你用的什么开发工具呀,怎么用的呀,包括他主要发布的哪些平台呀,发布的时间段呀,我都直接问。 他坐我对面,**迫于我的淫威**不得不和盘托出,主要是最近有个需求需要我帮他写代码哈哈。 别人都这么多的经验下来了,软件**能差嘛**?而且使用过程中不会的**还可以问一下对方**,不香嘛。 ## 絮叨 先看**人才交流群**的某个人才提的问题: ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g99infjha1j30go0bh0v0.jpg) **Tip**: **GItHub** [https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily) 上有进群方式和个人联系方式,说实话在这个群,哪怕您不说话,光看聊天记录,都能学到东西(美团王炸,三歪(Java3y),并夕夕等的大佬都在)。 不知道大家是否还记得我之前写的幂等这样的情况? 就是下图这样的情况,我下单增减GMV先去看看这个流水有么,有就证明加过了,就直接返回,没有才继续下面的流程。 ![](https://tva1.sinaimg.cn/large/006y8mN6ly1g9831ucfapj309e0j5dgs.jpg) 他其实提的问题很好,因为我们日常开发都是**主从同步,读写分**离的,就是说我们可能加GMV加了但是我们操作的是主库,他需要将数据同步到从库,但是这个过程中他发生了延迟。 那这个时候如果别的系统这个**订单号消息重试**了,你是不是又进来了,你去查询流水你发现没流水你以为没加,你执行加钱的操作,结果那条延迟的也好了,是不是就加了两次。 正常开发中确实会有,但是主从延迟这个应该让**DBA**(**数据库管理员 Database Administrator**)去考虑的,但是呢我说过不能写有逻辑漏洞的代码嘛,其实很简单,把他放Redis嘛,设置一个30分钟左右的时间,这期间的重复消费都可以避免,要是延迟超过30分钟了那其实问题已经很大了,DBA会知道的。 **这篇是吐血整理,大家好好食用,记得点个赞!👍** ## 日常求赞 好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是**人才**。 我后面会每周都更新几篇《吊打面试官》系列和互联网常用技术栈相关的文章,非常感谢**人才**们能看到这里,如果这个文章写得还不错,觉得「敖丙」我**有点东西**的话 **求点赞👍** **求关注❤️** **求分享👥** 对暖男我来说真的 **非常有用**!!! 创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见! 敖丙 | 文 【原创】【转载请联系本人】 如果本篇博客有任何错误,请批评指教,不胜感激 ! ------ > 《吊打面试官》系列每周持续更新,可以关注我的公众号「 **JavaFamily** 」第一时间阅读和催更(公众号比博客早一到两篇哟),本文**GitHub**上已经收录[https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily),有一线大厂面试点思维导图,欢迎Star和完善,里面也有我个人联系方式有什么问题也可以直接找我,也有人才交流群,我们一起有点东西。 ================================================ FILE: docs/idea/idea.md ================================================ > 点赞再看,养成习惯,微信搜索【**三太子敖丙**】我所有文章都在这里,本文 **GitHub** [https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily) 已收录,有一线大厂面试完整考点。 昨天群里被的人文怎么破解,晚上洗完澡睡觉正准备睡觉的时候,米豆吵醒了我,说他的idea炸了。 ![](https://tva1.sinaimg.cn/large/0082zybply1gbrmpzffcrj30xc0cktc0.jpg) 于是我让他搜我在公司写的破解文档,这个文档已经造福了很多同事了,我痛定思痛,觉得造福一下你们,但是我先说明,大家有能力的还是支持下正版,我只是觉得这个钱拿去洗脚香一点。 ## 开始破解 今天破解的方法很简单,jar包破解的,先下载Jar包。 ![](https://tva1.sinaimg.cn/large/006tNbRwly1gb36h9dmpfj30ys0emwi2.jpg) 破解包使用方法: 0. 先下载压缩包解压后得到jetbrains-agent.jar,把它放到你认为合适的文件夹内。 公众号回复【**idea**】获取网盘链接。 1. 启动你的IDE,如果上来就需要注册,选择:试用(Evaluate for free)进入IDE 2. 点击你要注册的IDE菜单:"Configure" 或 "Help" -> "Edit Custom VM Options ..." 如果提示是否要创建文件,请点"Yes"。 3. 在打开的vmoptions编辑窗口末行添加:-javaagent:/absolute/path/to/jetbrains-agent.jar 一定要自己确认好路径(不要使用中文路径),**填错会导致IDE打不开**!!!最好使用绝对路径。 一个vmoptions内只能有一个-javaagent参数。 4. ![](https://tva1.sinaimg.cn/large/006tNbRwly1gb36vup3pcj318i08eaax.jpg)示例: mac: -javaagent:/Users/neo/jetbrains-agent.jar linux: -javaagent:/home/neo/jetbrains-agent.jar windows: -javaagent:C:\Users\neo\jetbrains-agent.jar **注**:如果还是填错了,我帮你找到了目录: ### Windows All the files are located under this directory by default: - **Windows Vista, 7, 8, 10:** ``` \Users\\. ``` - **Windows XP:** ``` \Documents and Settings\\. ``` ### Mac OS X - **Configuration (idea.config.path):** ``` ~/Library/Preferences/ ``` - **Caches (idea.system.path):** ``` ~/Library/Caches/ ``` - **Plugins (idea.plugins.path):** ``` ~/Library/Application Support/ ``` - **Logs (idea.log.path):** ``` ~/Library/Logs/ ``` 找到对应的系统idea安装目录,我的是mac,直接去这个目录 ~/Library/Preferences/ ![](https://tva1.sinaimg.cn/large/006tNbRwly1gb36so0twvj30kg084jsa.jpg) 进去就能直接看到那个idea.vmoptions然后简单,vim打开输入正确的地址就好了 **暖男提示**:一定要写对,有的路径你看着是对的,有的有空格啥的,三歪就是这样,告诉我路径没错,结果有空格,写错是启动不了的。 5. 重启你的IDE。 6. 点击IDE菜单 "Help" -> "Register..." 或 "Configure" -> "Manage License..." 支持两种注册方式:License server 和 Activation code: 1). 选择License server方式,地址填入:http://jetbrains-license-server (应该会自动填上) 或者点击按钮:"Discover Server"来自动填充地址。 2). 选择**Activation code**方式**离线**激活,请使用:ACTIVATION_CODE.txt 内的注册码激活 如果激活窗口一直弹出(error 1653219),请去hosts文件里移除jetbrains相关的项目 如果你需要自定义License name,请访问:https://zhile.io/custom-license.html **注意**:第一种方法偶尔会失效,你用第二种一样的,记得一定要**离线** 本项目在最新2019.3上测试通过。 IDE升级会从旧版本导入以上设置,导入配置后可能提示未注册(因为刚导入的vmoptions未生效),直接重启IDE即可,无需其他操作。 ## 知识产权说明 中美达成初步“经贸协定”,我国将对知识产权立法更加的严格。 在民事诉讼中,知识产权侵权将由原先的“谁主张谁举证”改为“举证责任倒置”,由被告提供自己不构成侵权的证据。 在刑事责任中,原先知识产权犯罪为结果犯,造成损失才够罪,经贸协定会让知识产权犯罪变为行为犯,只要有违法行为就可能够罪。 行政上,对于销售假冒商品和盗版商品的电子平台,会被吊销经营许可证。 ## 警告 本项目只做学习研究之用,不得用于商业用途! 若资金允许,请点击 [https://www.jetbrains.com/idea/buy/] 购买正版,谢谢合作! 学生凭学生证可免费申请 [https://sales.jetbrains.com/hc/zh-cn/articles/207154369-学生授权申请方式] 正版授权! 创业公司可5折购买 [https://www.jetbrains.com/shop/eform/startup] 正版授权! 开源项目也可以去官网申请一年的免费使用,到期续费就好了,我就是用的这个: ![](https://tva1.sinaimg.cn/large/0082zybply1gbrn1n0mi0j31cq0lkth8.jpg) 暖不暖你说了算,我们下篇文章见:目测是索引,我还用了新的GIF动图方式,以后可能搭配视频。 放个图预告下: ![](https://tva1.sinaimg.cn/large/0082zybply1gbrn3gpcfwg309m04i43b.gif) 持续更新,未完待续...... **白嫖不好,创作不易,**各位的支持和认可(**求点赞**),就是我创作的最大动力,我们下篇文章见! 敖丙 | 文 【原创】 如果本篇博客有任何错误,请批评指教,不胜感激 ! ------ > 文章每周持续更新,可以微信搜索「 **三太子敖丙** 」第一时间阅读和催更(比博客早一到两篇哟),本文 **GitHub** [https://github.com/JavaFamily](https://github.com/AobingJava/JavaFamily) 已经收录,有一线大厂面试完整考点,欢迎Star和完善,我们一起有点东西。 ![](https://tva1.sinaimg.cn/large/0082zybply1gbs8wjbex8j30m80rkgpi.jpg) 你知道的越多,你不知道的越多 ================================================ FILE: docs/idea/电子书.md ================================================ 计算机类的书籍那么贵,作为一个几个小时看完一本书且机不离身的程序员,天天买纸质书是不可能的了,所以对电子书的需求量还是挺多的。为了方便广大的小伙伴也能方便找到对应的电子书,我花费洪荒之力收集了几百本常用的电子书,并且为了解决百度云链接容易失效的问题,我把电子书全部下载打包上传,都有哪些电子书呢?请往下看。 > **重要说明**:**如果目录无法跳转的话,直接拉下去就可以了**,这些书籍都是在同一个页面的,我只是方便大家找到对应的,弄了一个**页内目录**,不过有部分读者反馈他跳转不了(手机是绝对跳转不了的了)。 - [数据结构与算法相关书籍](#数据结构与算法相关书籍) - [计算机基础](#计算机基础) - [操作系统](#操作系统) - [汇编语言](#汇编语言) - [计算机网络](#计算机网络) - [计算机组成原理](#计算机组成原理) - [Python](#python) - [1、Python基础](#1python基础) - [2、数据分析与爬虫](#2数据分析与爬虫) - [Linux](#linux) - [C语言](#c语言) - [C ](#c) - [前端](#前端) - [人工智能](#人工智能) - [设计模式](#设计模式) - [Java](#java) - [Java 基础](#java-基础) - [Java进阶](#java进阶) - [JavaWeb](#javaweb) - [数据库](#数据库) - [Go](#go) - [中间件](#中间件) - [面试相关](#面试相关) - [未分类书籍](#未分类书籍) - [Git](#git) - [没找到请看这里](#没找到请看这里) - [免责声明](#免责声明) # 数据结构与算法相关书籍 - 挑战程序设计竞赛 [百度云下载链接](https://pan.baidu.com/s/1diObrFpHKm4r-XyTp4cGAQ) 密码:mxn7 - Java数据结构和算法 [百度云下载链接](https://pan.baidu.com/s/1vD9CQVwnWMfqSaEmn8Dudw ) 密码:lpym - 算法图解 [百度云下载链接](https://pan.baidu.com/s/1NFiwO-_Kzt-VxXxxteRCTA) 密码:7osf - 算法导论 [百度云下载链接](https://pan.baidu.com/s/1WHmnchIdy0FvMWLImPoIhQ) 密码:p2tp - 算法第四版 [百度云下载链接](https://pan.baidu.com/s/1WEliUJ_hQhl-OzWPtXcFdQ) 密码:rixw - 数据结构与算法分析C语言描述版 [百度云下载链接](https://pan.baidu.com/s/1v4OsTTCd5SyC4WGarHZdcA) 密码:mn10 - 数据结构与算法分析Java语言描述版 [百度云下载链接](https://pan.baidu.com/s/1hZGhkErn9Bc17ZnN_ilgAw) 密码:917n - 数据结构与算法 Python语言描述_裘宗燕 [百度云下载链接](https://pan.baidu.com/s/1VjlQugLPIiN91bmISkJ3xg) 密码:96gw - 剑指offer [百度云下载链接](https://pan.baidu.com/s/1lUs2fVqxNMK8OOUrVSBCmw) 密码:a4rt - 计算机程序设计艺术1-3卷 [百度云下载链接](https://pan.baidu.com/s/1rxEqkKAogFpy1aNQnXUyBw) 密码:i3nh - 大话数据结构 [百度云下载链接](https://pan.baidu.com/s/1fTxelwIZa8pBmdnMW8PFYg) 密码:np2o - 程序员代码面试指南:IT 名企算法与数据结构题目最优解 [百度云下载链接](https://pan.baidu.com/s/1DhjBLEiORLRTiffpJnJq_g) 密码:20oh - 编程珠玑 [百度云下载链接](https://pan.baidu.com/s/1ix17W5-CG4r5Wn8bF3erVQ) 密码:4oow - 编程之美 [百度云下载链接](https://pan.baidu.com/s/1y8SWiLipsKEzCulyxdbgGQ) 密码:4zme - 啊哈算法 [百度云下载链接](https://pan.baidu.com/s/1S6OTJlQtywaRvu4IA_ogCw) 密码:h4id - 程序员的算法趣题 [百度云下载链接](https://pan.baidu.com/s/1iIHm0kRlfwck3IQn-BUZZA) 密码:kk84 # 计算机基础 ### 操作系统 - 30天填自制操作系统 [百度云下载链接](https://pan.baidu.com/s/1QSIUlat1HpllNFMWY9WBzw) 密码:pxxr - 操作系统之哲学原理 [百度云下载链接](https://pan.baidu.com/s/1GEfALJhtJ2IJtjtKcLneKg) 密码:hua7 - 程序是怎样跑起来的 [百度云下载链接](https://pan.baidu.com/s/1i_xDxT8QgA_x4kRHXEmPqg) 密码:pbvh - 深入理解计算机操作系统 [百度云下载链接](https://pan.baidu.com/s/1xrDC6wGAH7Yv3uuXzVUWxg) 密码:2toh - 现代操作系统 [百度云下载链接](https://pan.baidu.com/s/1QA0VZ20pA8giW6ax7AHQBA) 密码:huk2 ### 汇编语言 - 汇编语言(注:这边是王爽写的,我觉得写的很好,适合入门) [百度云下载链接](https://pan.baidu.com/s/1kZLH0dW6Y37S-WCLNV309A) 密码:qea3 ### 计算机网络 - 计算机网络:自顶向下 [百度云下载链接](https://pan.baidu.com/s/18X_L2RINmtLK9g0Ki2GiFw) 密码:l77d - 图解HTTP [百度云下载链接](https://pan.baidu.com/s/1NEAK2PH_4JzPY454QvmmsQ) 密码:b42z - 图解TC/IP [百度云下载链接](https://pan.baidu.com/s/1FJru4ppyxBhx_J3pk8rpvA) 密码:5k3x - 网络是怎样连接的 [百度云下载链接](https://pan.baidu.com/s/1HhE9MoC4rp5NSvyWOtk_hw) 密码:g983 - HTTP权威指南 [百度云下载链接](https://pan.baidu.com/s/1b2fIsmdt9ANVMcqU97t6kw) 密码:tqj8 - UNIX网络编程 [百度云下载链接](https://pan.baidu.com/s/1vXbj7OLsouVFH4DCIMqF3w) 密码:4buy ### 计算机组成原理 - 隐匿在计算机软硬件背后的语言 [百度云下载链接](https://pan.baidu.com/s/1gJCnChBTCZD07mm3IqCRwQ) 密码:6jiq - 大话计算机 [百度云下载链接](https://pan.baidu.com/s/1AakpZmD8hziokFnV0VSGFA) 密码:6j1o - 计算机是怎样跑起来的 [百度云下载链接](https://pan.baidu.com/s/1JIq3U8kNYohz0C3xnCk6EA) 密码:er12 # Python ### 1、Python基础 - 编程小白的第一本Python入门书 [百度云下载链接](https://pan.baidu.com/s/128kxkHLrEAidlMt0E80SUg) 密码:s76b - Python编程初学者指南 [百度云下载链接](https://pan.baidu.com/s/1ytNZt1VMlbyREyc1L7ShYA) 密码:g696 - Python高级编程 [百度云下载链接](https://pan.baidu.com/s/1-ItrNDj2R9Z-S1ZuEMlf1Q) 密码:qnuf - Python高性能编程 [百度云下载链接](https://pan.baidu.com/s/10wPoXPM83so2WvdlVnPZTw) 密码:d8s5 - Python灰帽子 [百度云下载链接](https://pan.baidu.com/s/17hvNff7O5OsdRAB3_mBBcg) 密码:nfkt - Python开发技术详解 [百度云下载链接](https://pan.baidu.com/s/1cTVhr9BEmy79GbKq41qQ5A) 密码:z0av - Python开发实战 [百度云下载链接](https://pan.baidu.com/s/1AFgXTjEQyBf6SP2CCniA1A) 密码:ee5x - Python网络编程基础 [百度云下载链接](https://pan.baidu.com/s/1qBpXTD3Ll6p2KAv0RAkKHQ) 密码:m15q - Python学习手册 [百度云下载链接](https://pan.baidu.com/s/18DsRhIawELjVGGDSTRvhYA) 密码:0yqf - 精通Scrapy网络爬虫 ### 2、数据分析与爬虫 - 数据科学入门 [百度云下载链接](https://pan.baidu.com/s/1LBUGeGdjUNhCUUOZRpgbrg) 密码:1hz8 - 用Python写网络爬虫 [百度云下载链接](https://pan.baidu.com/s/1ENi8Y4vAMqSQviPYNRBMUA) 密码:nlpa - Python数据处理 [百度云下载链接](https://pan.baidu.com/s/1UOOC1APb6fueaxDyyshMuQ) 密码:8eom - Python数据分析实战 [百度云下载链接](https://pan.baidu.com/s/13yQ4hvUf4EzgGAuKQUM4ag) 密码:idn1 - Python数据科学手册 [百度云下载链接](https://pan.baidu.com/s/1Y1KnyILg-0ZWJbIKNzNsmw) 密码:16u0 - Python数据可视化编程实战 [百度云下载链接](https://pan.baidu.com/s/1BKIzCFI_5CzLXAQpRQCp8Q) 密码:i7hp - 精通Scrapy网络爬虫 [百度云下载链接](https://pan.baidu.com/s/1FuAE8Kq3YItoO4yNba5ckA) 密码:jb6u # Linux - 精通正则表达式 [百度云下载链接](https://pan.baidu.com/s/1tt-S2QEye0qZde_3SiG1Eg) 密码:vp94 - 鸟哥的Linux私房菜基础篇和服务器篇 [百度云下载链接](https://pan.baidu.com/s/1ZvTMk23dKPbQG7siYXyrbg) 密码:ubg2 - 深入Linux内核架构 [百度云下载链接](https://pan.baidu.com/s/15Vyl69xGDY_RkpQPk5qCCQ) 密码:fnh2 - Linux宝典 [百度云下载链接](https://pan.baidu.com/s/1cQX4jgG0-7fYFuR5F9G2_g) 密码:nxhe - Linux常用命令大全 [百度云下载链接](https://pan.baidu.com/s/1WH7DFOzL25mOHsp5orrWmQ) 密码:e0n2 - Linux防火墙 [百度云下载链接](https://pan.baidu.com/s/1NTMCysm_btHNpek38rBMfg) 密码:sc4u - Linux高级程序设计 [百度云下载链接](https://pan.baidu.com/s/11y7OBER2c9mcbsCtjTRsrA) 密码:d4wq - Linux环境编程 [百度云下载链接](https://pan.baidu.com/s/1sl-6GF3onLPRXeJDVedwqA) 密码:xudv - Linux命令详解词典 [百度云下载链接](https://pan.baidu.com/s/1CSlkxcBRBPsHHRYOrQpfSw) 密码:yxuz - 汇编语言基于linux环境第3版 [百度云下载链接](https://pan.baidu.com/s/13gwNQvvG5fRYxo83zMb2VA) 密码:yq75 # C语言 - 经典C程序100例 [百度云下载链接](https://pan.baidu.com/s/1fJnp014zqOCdO8O6gzcDUw) 密码:tls2 - C Primer Plus [百度云下载链接](https://pan.baidu.com/s/1SuVacfN0q-MGeKs6Z-O2LQ) 密码:5s85 - C程序设计语言(包括课后答案等) [百度云下载链接](https://pan.baidu.com/s/1ICTaU2avonev25DfykAr-w) 密码:cfj4 - C和指针 [百度云下载链接](https://pan.baidu.com/s/11zphu-XC2YS57BkkKjAtoQ) 密码:d8a0 - C语言编程精粹 [百度云下载链接](https://pan.baidu.com/s/1_GmhiP3jL0cQR36uAiZNNw) 密码:6mct - C语言参考手册 [百度云下载链接](https://pan.baidu.com/s/1hzINX8yDELZ4WF1ALwDsYg) 密码:4hnx - C语言函数大全 [百度云下载链接](https://pan.baidu.com/s/1_kM7pd1J6K65X6oC38AviA) 密码:xywt - C语言解析教程 [百度云下载链接](https://pan.baidu.com/s/1Sm-CRO8DzhT7gCgxNJkKfw) 密码:6luf - C语言深度剖析 [百度云下载链接](https://pan.baidu.com/s/1Dn4csGs7xEdZt9smdBcmbQ) 密码:yu63 - C专家编程 [百度云下载链接](https://pan.baidu.com/s/1y_Uz1SWi1NikG0D0URqv0w) 密码:xlfm # C++ - C++ Primer [百度云下载链接](https://pan.baidu.com/s/1OvJd3JfxujySAs6Tqugl9g) 密码:js1a - C++编程思想 [百度云下载链接](https://pan.baidu.com/s/1p98_fU039F6Er3_CtnmIfQ) 密码:vi02 - C++对象模型 [百度云下载链接](https://pan.baidu.com/s/1JVnJwxbTXe6HIMDFXlYnbQ) 密码:v90k - 深入探索C++对象模型 [百度云下载链接](https://pan.baidu.com/s/1NxvGvIBYpKNunjnu5ev_vw) 密码:3xuv - C++ Templates [百度云下载链接](https://pan.baidu.com/s/1bkQ-aPpFDc_osxqFC9I1Jw) 密码:4rvw - C++编程规范-101条规则准则与最佳实践 [百度云下载链接](https://pan.baidu.com/s/1PAfapM3g1YDNB2qpZlJnpg) 密码:t43e - C++沉思录中文第2版 [百度云下载链接](https://pan.baidu.com/s/1ckINRCEKKt3DJ9eg412EtA) 密码:6emr - C++大学教程 [百度云下载链接](https://pan.baidu.com/s/1OS5iWmRib0QvFOFaRMSpMw) 密码:n6ph - C++设计新思维-泛型编程与设计之应用 [百度云下载链接](https://pan.baidu.com/s/1zKojQCCfs0NPH_9ORpiBvA) 密码:0el5 - Effective STL 中文版 [百度云下载链接](https://pan.baidu.com/s/1btF8iWfAXoEUo5A18SYaLw) 密码:u7s1 - More Effective C++中文版 [百度云下载链接](https://pan.baidu.com/s/1I3uRE2s8n5OZRm_76a1Lag) 密码:xbxv - STL源码剖析 [百度云下载链接](https://pan.baidu.com/s/1DbnRAJgeAtmXo5tpuhc-rg) 密码:mxsh # 前端 - 疯狂aJax讲义 [百度云下载链接](https://pan.baidu.com/s/1C1NdOCrYD6LULgbGtRp_Vw) 密码:pce0 - Bootstrap实战 [百度云下载链接](https://pan.baidu.com/s/1ty1U6-XUDFqnjVS57IrZSA) 密码:rzhm - HTML5揭秘 [百度云下载链接](https://pan.baidu.com/s/138vuPiKZFIU0Zza80eui_g) 密码:vaam - HTML5与CSS3基础教程 [百度云下载链接](https://pan.baidu.com/s/1ddq73aQviPIM9ci6xhAt_g) 密码:2wxm - HTML与CSS入门经典 [百度云下载链接](https://pan.baidu.com/s/1fJaT9zqQOWxIB8Mkn_vQqQ) 密码:tsgm - JavaScript DOM编程艺术 [百度云下载链接](https://pan.baidu.com/s/1Dx3z3D9DYbWyebr3V86cLA) 密码:gsbt - JavaScript高级程序设计 [百度云下载链接](https://pan.baidu.com/s/1NYkMExeBSG1SBVfT7nUkWQ) 密码:wbw0 - JavaScript高效图形编程 [百度云下载链接](https://pan.baidu.com/s/1jLPlJ1tpnF6LOkhhUgcF6w) 密码:tab1 - jQuery高级编程 [百度云下载链接](https://pan.baidu.com/s/1XSvgFixfnm_9YxytuuSvLA) 密码:qwtr - jQuery技术内幕 [百度云下载链接](https://pan.baidu.com/s/11sUqBmGJWlHOB29WtZjf2A) 密码:pglf - jQuery权威指南 [百度云下载链接](https://pan.baidu.com/s/14Iu2h8BQ4oHXsyuKG9k-Qw) 密码:4vrw - Node.js开发指南 [百度云下载链接](https://pan.baidu.com/s/1cSoqtNHTrmoovTNy7VonqA) 密码:voze # 人工智能 - 贝叶斯思维统计建模的Python学习法 [百度云下载链接](https://pan.baidu.com/s/1GX6Uqzh8-AzMv0UjO2Ed2A) 密码:ztbe - 机器学习实战 [百度云下载链接](https://pan.baidu.com/s/1ZDcgp1ht4XZPYH5Wy3I1KQ) 密码:cfqc - Python机器学习及实践 [百度云下载链接](https://pan.baidu.com/s/1IIUCLptUPsQvLRbUEqJaTA) 密码:qq3q - Tensorflow实战Google深度学习框架 [百度云下载链接](https://pan.baidu.com/s/1CJIJmNvZHx2rtkUDH-zrIg) 密码:12kj - TensorFlow实践与智能系统 [百度云下载链接](https://pan.baidu.com/s/1EYFAmV8z9hvTX06Hwf1MsA) 密码:e668 - 深度学习_中文版 [百度云下载链接](https://pan.baidu.com/s/1FH9vlBBBb-yvB26eFmKjQw) 密码:01xp # 设计模式 - 图解设计模式 [百度云下载链接](https://pan.baidu.com/s/16Lss7o-zu0_HNio6od4c0Q) 密码:g50a - 研磨设计模式 [百度云下载链接](https://pan.baidu.com/s/1a5EPImWzDfPGg1DQ4F7EkA) 密码:h5fb - Head First设计模式 [百度云下载链接](https://pan.baidu.com/s/1-rMyG6AuRHrzFF-dOiaBDw) 密码:pxpq # Java ### Java 基础 - 阿里巴巴Java开发手册 [百度云下载链接](https://pan.baidu.com/s/1SoqPq0-x9aZPEaCiggVtUA) 密码:g6lv - 码出高效 [百度云下载链接](https://pan.baidu.com/s/1ejmKaxyd2ACKbV3lj9Vyvg) 密码:mbt9 - Head First Java [百度云下载链接](https://pan.baidu.com/s/1AhFSveV6DE3nWMpBUhFcMw) 密码:d5ll - Java8实战 [百度云下载链接](https://pan.baidu.com/s/1ni-dF2XqmMFwI5pBPo3P2A) 密码:lvmb - Java编程思想 [百度云下载链接](https://pan.baidu.com/s/1cqF8lcDdMoV3g2OLxQCUKg) 密码:0add - Java并发编程的艺术 [百度云下载链接](https://pan.baidu.com/s/1N3aSnY8rZxQLTbnUwIk5yQ) 密码:vn74 - Java并发编程实践 [百度云下载链接](https://pan.baidu.com/s/1Bk47A0tLXUv1wVQjJlxd6Q) 密码:i6w9 - Java从小白到大牛 [百度云下载链接](https://pan.baidu.com/s/1qDLSzWrkSVu91KcrBN5fKQ) 密码:9auc - Java核心技术1-2卷 [百度云下载链接](https://pan.baidu.com/s/1t9YFSagCpVC7N4pK6aNuGQ) 密码:tr3s - 深入理解Java虚拟机 [百度云下载链接](https://pan.baidu.com/s/1qyRd-YANK1Czs51k1tWYWQ) 密码:b6op ### Java进阶 - 代码大全 [百度云下载链接](https://pan.baidu.com/s/1ehGZsgt-Rl47pVnNGUKWWw) 密码:juhq - 代码整洁之道 [百度云下载链接](https://pan.baidu.com/s/1fQf91LpvIWeJ-HH2QWKVog) 密码:hzn2 - 敏捷软件开发 [百度云下载链接](https://pan.baidu.com/s/1HveePOP4fOynad9yrHKS_A) 密码:mmi4 - Effective Java(中文) [百度云下载链接](https://pan.baidu.com/s/1jvaEtd4H-ELdjY-I2uV76A) 密码:4dcx - Effective Java(英文) [百度云下载链接](https://pan.baidu.com/s/1FOVL661If9yaJSjTpMw22g) 密码:bhu4 - Java性能优化权威指南 [百度云下载链接](https://pan.baidu.com/s/1XCOWv6W5_rsCUM6Q4YIU9Q) 密码:054x ### JavaWeb - 轻量级JavaEE企业应用实战 [百度云下载链接](https://pan.baidu.com/s/1EjBGj1z6sJ4kDokUZRG2IA) 密码:8j3c - 深入分析JavaWeb技术内幕 [百度云下载链接](https://pan.baidu.com/s/15Q_ZJZyOtm5gYhhp_D0OFA) 密码:31uu - 深入剖析Tomcat [百度云下载链接](https://pan.baidu.com/s/1YQXpaveUeRXxid1BdU-nUw) 密码:y1yt - Head First Servlet and JSP [百度云下载链接](https://pan.baidu.com/s/1036AnuSKhckNC_vqa5qjPw) 密码:v8b8 - Maven实战 [百度云下载链接](https://pan.baidu.com/s/15DddRDQpR_KAOzg-HuuDvw) 密码:s0q9 - Spring实战 [百度云下载链接](https://pan.baidu.com/s/1Y9J20oR38qVyQ4Z7Kh9KQw) 密码:40fb - Camel in Action [百度云下载链接](https://pan.baidu.com/s/1300e_-sgpqAzl_2H1EPlJA) 密码:plyn # 数据库 - 高性能MySQL [百度云下载链接](https://pan.baidu.com/s/1_vXaan9KbIWAHEnyQnQFlg) 密码:gh5t - 深入浅出MySQL [百度云下载链接](https://pan.baidu.com/s/1gWJcwszv3CnjIRMzy--_rw) 密码:ju0h - MongoDB权威指南 [百度云下载链接](https://pan.baidu.com/s/1LO1ACpRDi7n0i9Q7nLooqg) 密码:llvx - MySQL必知必会 [百度云下载链接](https://pan.baidu.com/s/1IWeqx7IQGc0sY5bJ9WtyMA) 密码:f1v9 - MySQL技术内幕InnoDB存储引擎 [百度云下载链接](https://pan.baidu.com/s/1fLL3GXn_Hp6DdEnHXcBFJQ) 密码:6g04) - SQL查询的艺术 [百度云下载链接](https://pan.baidu.com/s/1PfE3oLfmQN8Xtdj-08L--A) 密码:ndcv - SQLite 权威指南 [百度云下载链接](https://pan.baidu.com/s/1BqFp4W_I0Wwn87fKrCpB8A) 密码:ex3h # Go - 学习Go语言 [百度云下载链接](https://pan.baidu.com/s/1tNJJ-UNBk7nsZuxILFAy7w) 密码:5tri - Go语言实战 [百度云下载链接](https://pan.baidu.com/s/1BIGNOG3AfFAVrBnHeemPlQ) 密码:q0x3 - Go web编程 [百度云下载链接](https://pan.baidu.com/s/1UQU7uWFSZb3ILob6b64ZeA) 密码:pyw3 - C 程序设计语言第2版 [百度云下载链接](https://pan.baidu.com/s/14NmKpWeBQ-vg6XzyvXTaeg) 密码:3yza # 中间件 * redis实战 [百度云下载链接](https://pan.baidu.com/s/13Y-Uk2HmV1Y5TLec4J20aQ) 密码:ro48 # 面试相关 - 阿里巴巴Java面试问题大全 [百度云下载链接](https://pan.baidu.com/s/1tbd8N88ae-O0xsm6RTJIag) 密码:8xzm - 程序员面试宝典 [百度云下载链接](https://pan.baidu.com/s/1LilCd-QIcVgZ1uQyFWMaWw) 密码:ko62 - 大厂面试真题 [百度云下载链接](https://pan.baidu.com/s/1631WVa3Fhf2wOpdZX_ou2g) 密码:gu92 - Java面试突击 [百度云下载链接](https://pan.baidu.com/s/1bAZS8KiUNF0lOt-R0UBOyg) 密码:h44t # 未分类书籍 - 黑客与画家 [百度云下载链接](https://pan.baidu.com/s/1lEyXNK8W4a0vStIPHOihiA) 密码:uux2 - 浪潮之巅 [百度云下载链接](https://pan.baidu.com/s/1NIeoGRy6s1lYB3WdlhA8lQ) 密码:xr66 - 码农翻身 [百度云下载链接](https://pan.baidu.com/s/1zEmECfVe4rFRsQL8goN4nA) 密码:x0ik - 奔跑吧,程序员:从零开始打造产品、技术和团队 [百度云下载链接](https://pan.baidu.com/s/1O0QkDLuJMasimr9XZsNSmA) 密码:jxvj # Git - 快速入门Git [百度云下载链接](https://pan.baidu.com/s/1ka8s2-1h24LLX5ebeeU6WA) 密码:ofdd - 专业git中文 [百度云下载链接](https://pan.baidu.com/s/1pvgoGleexrvdMhnTgd0VYw) 密码:b3kx - Git参考手册 [百度云下载链接](https://pan.baidu.com/s/1DC8S-wnLrpanW2HRROizMQ) 密码:axou - 《Pro Git》中文版 [百度云下载链接](https://pan.baidu.com/s/1TLHL03vKY5gLs1tOjN5KeA) 密码:l05a # 没找到请看这里 别急,我会慢慢更新完善的,可能只是暂时没有而已,,,欢迎持续关注哦 # 免责声明 书籍全部来源于网络其他人的整理,我这里只是收集整理了他们的链接,如有侵权,马上联系我,我立马删除对应链接。我的邮箱:aobing@mogu.com ================================================ FILE: docs/idea/知识星球.md ================================================ 我现在微信群已经超过15个了,我开始上班了,平时太忙了大家@我我基本上会选择忽略,因此我建立了知识星球,我会在里面个人经历、分享经验、技术理财,职业规划都会涉及。 有问题也可以在里面问,不敢保证及时回,但是周末或者晚上10点以后看到都会回(**大概率周末**)。 建知识星球的目的主要是做知识沉淀,和问题解答,我经常在知乎上看到私我的,有时候实在会疏忽。 为此,丙丙创建了这个收费最低的知识星球。 先给大家看看长啥样: 昨天创建的,已经加入了快1400个小伙伴了,也有小伙伴已经开始提问了。 ![](https://tva1.sinaimg.cn/large/0082zybply1gc21t45skmj30n01dsdxa.jpg) 可能大家也觉得我自己这个星球没啥说服力,所以我邀请了不少重量级别的嘉宾。 ![](https://tva1.sinaimg.cn/large/0082zybply1gc21uv9w19j30lk0kaaf3.jpg) 总的来说,加入到这个星球,你将获得: - 面试以及核心知识分享; - 学习/工作的常见问题回答和整理,问题答疑,职场问题答疑。 - 分享各种不错的开源项目和工具; - 简历指导,以及大厂内推机会; - 个人经历分享; - .......... 我希望所有人都像南橘一样,面进阿里,也可以主动问我很多问题: ![](https://tva1.sinaimg.cn/large/0082zybply1gc21ywtgj7j30ye0eajuz.jpg) 因为这是一个互补的过程,问到我不会的也给我扫盲了,或者像我另外一个读者一样,进蘑菇街跟我做同事。 说真的,我这个人技术不咋样,面试还是有一套的哈哈,能帮大家就帮大家一下, ![](https://tva1.sinaimg.cn/large/0082zybply1gc222jy431j30w80t8ahe.jpg) 这是优惠码,-32,还是比较便宜的,办的好,以后可是要涨价的哈哈,有问题随时提,大家有空的可以回答,我看到基本上都会解答一下。 ![](https://tva1.sinaimg.cn/large/0082zybply1gc1z2djbejj30g40o9785.jpg) ================================================ FILE: docs/idea/资料.md ================================================ ## 这是我准备的一些面试资料(也欢迎大家贡献) #### 我会定期更新 星球提供模拟面试和简历修改服务 **[【点击了解详细 领取减32的优惠券】](https://github.com/AobingJava/JavaFamily/blob/master/docs/idea/%E7%9F%A5%E8%AF%86%E6%98%9F%E7%90%83.md)** 学习路线对应文章: https://www.bilibili.com/read/cv5006822 简历模板 链接: https://pan.baidu.com/s/1n-K9CKs_MAlfIIyIFyu7ng 密码:moxs 概要设计模板: https://pan.baidu.com/s/1X7QUT9c7bHMEgQ4vjI9O8A 密码:3fli 电子书 : 链接:https://pan.baidu.com/s/1PKO0LDspwJPNqT6qwqNorQ 密码:f654 Java高级架构体系资料: https://pan.baidu.com/s/1B83Kvb9n2LTgKSmSvbt_Aw 提取码: msba 天猫购物车商场项目:https://pan.baidu.com/s/1YAE6rkDw2GCXucEiAXCedw 密码:fpda Java8新特性:https://pan.baidu.com/s/1pmiGW5KcuZnzh7DuUpwPzg 密码:5mz4 MySQL:链接:https://pan.baidu.com/s/1GvvsGzB1grjzpM9NQFZ9FQ 密码:aftw 2019牛客网上面试题库java篇(附带解析与答案):https://pan.baidu.com/s/1HBRXiVl0w97EOr_WpRrd-w 密码:71hn 面试知识点Xmind: 链接:https://pan.baidu.com/s/13g1_P9t-SWZtsbtYDiubGQ 密码:0j2g 毕向东Java基础教程(适合初学者入门的Java基础视频)http://pan.baidu.com/s/1nvODtSP 密码:h52i Java快速入门教程(Java基础班全套教程)链接:https://pan.baidu.com/s/1o9yLBsu 密码:wwd0 JavaWeb教程_JavaWeb入门教程 资料:http://pan.baidu.com/s/1bp02SFX 密码:2xfl Java教程|Mybatis由浅入深教程 资料:https://pan.baidu.com/s/1pKFaqTH 密码:w00x Maven教程_Maven视频教程 资料资料:http://pan.baidu.com/s/1kVsl04v 密码:j5h0 大数据hadoop教程入门 资料链接:https://pan.baidu.com/s/1smCTwRj 密码:vp5v 学习路线 ![](https://tva1.sinaimg.cn/large/00831rSTly1gcbee53k7gj30u0149dov.jpg)