技术拾荒者之路 · 启程

技术拾荒者之路·启程——后端技术精选与解读

背景

五月份的时候, 突然心血来潮想整理一下自己之前收藏的文章.
可能心血来潮四个字用的不太准确,但主要原因是遭受到某笔记的背刺…
本人大概是从19年左右(图1)开始使用印象笔记的, 用到今年也算五年老用户了.
期间也开过会员(专业版,99/year), 但随后会员体系膨胀(图2), 以及前几年预售10年的会员.
让我逐渐的放弃了会员续费, 原因无他, 吃相太难堪, 而且总感觉它要捞一笔跑路!
虽然没有续费会员, 但是也在继续使用, 因为全文搜索功能实在太好用了.

直到去年, 空间里的笔记开始消失(图3), 粗略统计了一下, 空间内总共有20篇左右的笔记, 消失了约四分之三,
找回路径十分复杂且繁琐, 客服都是人机, 我也尝试着去找回并提交了找回信息, 但最终还是找回失败.
可能是我没充钱吧? 最终我只能接受现实, 放弃丢失的笔记

此后我开始逐渐将笔记转到语雀, 钉钉个人版或者是csdn上.
从去年开始一直想重新梳理下, 知道上个月才下定决心开始搞.
这就是我写这篇文章的目的吧, 只希望c站不会成为下一个"某笔记"…

图1
在这里插入图片描述

图2
在这里插入图片描述

图3
在这里插入图片描述

前言

这个系列与其说是文章, 不如说是一个markdown的书签.
记录了我自开始收藏记录的所有好的文章(微信推文占比较多, 不喜勿入).
但又不是简单的书签, 几乎每篇文章, 我都会加入一点自己的理解在下面, 方便后续快速回顾和理解.
当然这篇文章因为涉及到很多外链也可能通过不了, 对此我也只能希望审核大大手下留情.

因此我打算此内容打算分成上下两个部分, 分两篇文章输出:
上半部分就是纯技术的, 涵盖后端开发的各种技术文分享; 下半部分为程序人生, 适合所有开发人员的阅读分享;
今后也会持续更新, 当然这次绝不口嗨, 这次一定~


正文

开发规范

这是一堆有味道的代码……

对编码过程中, 过长函数, 过大的类, 重复的类, 过长的参数, 散弹式修改, 注释过多等坏毛病进行总结和展示

公司用的 MySQL 团队开发规范,太详细了,建议收藏!

mybaties编写规范+SQL规范

公司用的 Java 团队开发规范,太详细了,建议收藏!

详细介绍开发中的各种命名规范

22 条 API 设计技巧,总结的很好!

可以使用get,put, delete代表请求接口的行为
JSON使用驼峰, 始终对api 进行版本控制

Java之道:14个写Java 的好习惯

  1. @ConfigurationProperties 代替@Value
  2. 抛异常而不是返回
  3. 进行删除时, 可以对删除返回的布尔值进行判断, 并对为false的情况抛出异常
  4. 减少controller业务代码

为什么要谨慎使用Arrays.asList、ArrayList的subList?

阿里java开发手册中两个结论的解读

  1. 使用aslist将数组转换成集合后, 不能再进行集合操作, 会报错
  2. 使用sublist(包前不包后)截取集合时, 不能再对子集合或者原集合做非结构性修改, 会报错
  3. ArrayList使用sublist之后不可强转成aslist, 会报错

还在用 list.contain 做去重?该换换了!(list去重比较)

  1. 最快方式: 将list放入set
  2. 其次: distinct
  3. 遍历循环

牛逼!简单的代码提交能玩出这么多花样

在 Git 的基础上又逐渐出现了多种代码管理工作流:集中式工作流, 功能 分支工作流,Gitflow 工作流,Forking 工作流

为什么你的程序总是出现 bug?

从项目是否可信的十个角度与防御型编程十六个角度来看待编程, 具有一定的参考价值

MySQL 中,21 个写 SQL 的好习惯

在写sql时, 需要注意的一些问题, 很实用

程序开发必备的六个信条

程序开发, 灰度发布, 运维部署, 产品设计等设计最好要遵循的原则

编写 if 时不带 else,你的代码会更好

译文, 1. 建议写if单条件多条件的时候省略else, 2. 可以将 If-Else 重构为字典

如何生成一套标准的 Java API 文档?

本文主要对文档注释背景,文档注释格式总结,文档标签总结, java api 文档生成方式等进行介绍。

开发技巧

一次Maven依赖冲突踩坑,把依赖调解、类加载彻底整明白了

介绍了用于解决maven依赖的插件Maven Helper和排查在线问题的利器-Arthas

Java 是如何优雅地实现接口数据校验的?

利用hibernate-validator对接口进行校验的三种方式

Restful接口的版本控制

主要讲述项目在版本升级时,多版本并行使用所采取的可行性方案

Java必会的工具库,让你的代码量减少90%

对字符串, 对象, 集合等进行操作的工具类库, 极大方便我们的代码效率
另推荐阅读: 求你别自己瞎写工具类了,Spring自带的这些他不香麽?

Java Stream常见用法汇总,开发效率大幅提升

Stream流式编程使用技巧介绍(java8新特性)

干掉 “重复代码” 的 3 个绝招

第一种代码重复是,有多个并行的类实现相似的代码逻辑
第二种代码重复是,使用硬编码的方式重复实现相同的数据处理算法
第三种代码重复是,业务代码中常见的 DO、DTO、VO 转换时大量字段的手动赋值,遇到有上百个属性的复杂类型,非常非常容易出错。
利用多种设计模式来解决此类问题

从实现原理来讲,Nacos 为什么这么强

通过源码来分析nacos

如何优雅的写 Controller 层代码?

由参数接收时的统一状态码->数据参数校验->返回结果统一封装->非统一结果设置->统一异常处理->各返回的Vo的处理 非常棒的一篇文章, 建议写代码的时候遵循这个方式.

系统间的交互用接口还是用消息?

接口交互: 强一致, 高耦合, 高时效, 可拓展性低
消息中间件: 无交互. 低耦合, 流量缓冲, 拓展性高

【珍藏版】代码评审的18个规则!

详细介绍了代码开发的原则, 适合作为新员工的培训资料看!!!

Java封装OkHttp3工具类

利用OkHttp3 代替 httpclient 实现同步和异步请求

【终极版】Java8 新特性全面介绍,强烈建议收藏

Java8的特性有一个非常细致的讲解, 值得多多学习!

推荐阅读:
Java 8 开发的 4 大顶级技巧,你都知道吗 ?
关于 Java Lambda 表达式看这一篇就够了(强烈建议收藏)

面试难题:Lambda 中的 forEach 如何提前终止?

使用手动的foreach 或者在 list.forEach中抛出异常, 然后捕获异常但不处理即可

掌握这些操作Excel的神器,让你代码高出一个逼格

介绍了poi,easypoi,EasyExcel等方式通过java导出导入Excel表格, 并实现自定义数据的导入导出

if-else 判断语句过多该如何处理

编写一个抽象接口来实现所有操作, 然后编写该接口的实现类来具体实现每种类型判断, 再编写一个工厂类用于判断调用了那个工厂, 最后在需要使用的地方注入并调用即可!!!

学会这 10 种定时任务,我有点飘了

介绍了linux 自带的定时任务, jdk自带的定时任务, Spring自带的定时任务. 分布式定时任务等.

延迟任务的 11 种方案!

介绍基于延迟队列, 消息队列, 线程池, 工具类, redis监听过期key, 线程轮询实现延迟

Java 中的 BigDecimal ,80% 的人都用错了

介绍了创建BigDecimal 的注意事项, 常用api, 以及常出现的异常以及解决方案. 在使用时值得一看

推荐阅读: 告警:线上慎用 BigDecimal ,坑的差点被开了

接口调用神器RestTemplate,撸代码飞起来!

利用RestTemplate实现文件上传下载, 各种请求, 以及json请求等, 集成httpclient

Java 代码基于开源组件生成带头像的二维码,推荐收藏!

基于java方式生成带图片的二维码

接口请求重试的8种方法,你用哪种?

通过代码循环, 递归, 注解, 消息队列等方式实现接口重试

Google guava工具类的介绍和使用

Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 缓存 原生类型支持并
发库 通用注解 字符串处理 I/O 等等。

推荐阅读: 高性能限流器 Guava RateLimiter
假设我们有一个线程池,它每秒只能处理两个任务,如果提交的任务过快,可能导致系统不稳定,这个时候就需要用到限流, 而Guava 则为我们提供了一个工具类 RateLimiter

推荐阅读: Java开发利器之Guava Cache
利用Guava Cache 实现本地缓存

一个非常好用的Jar,可以帮你省去整合Utils的时间

Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”
官网介绍

项目中引进这玩意,排查日志又快又准!

TLog提供了一种最简单的方式来解决日志追踪问题,TLog会自动的对你的日志进行打标签,帮你自动生成traceId贯穿你微服务的一整条链路,在排查日志的时候,可以根据traceId来快速定位请求处理的链路。(后续项目中可以使用)

IDEA失效,一键解决,试用所有版本!

懂得都懂

30个IDEA插件总有一款适合你

idea插件应有尽有, 非常实用

面试官:如何快速排查OOM?内存溢出

利用eclipse MAT快速定位OOM内存溢出问题, 比较实用
步骤:

  1. jmap命令到处文件/使用指定参数在内存溢出时自动生成堆内存快照
  2. 使用Eclipse MAT工具定位问题代码

Spring

Spring 中的bean 是线程安全的吗?

默认情况下,scope值是单例-singleton的,也是线程不安全的。
定义静态变量之后, 无论是单例还是原先都是线程非安全的

Spring 为何需要三级缓存解决循环依赖,而不是二级缓存?

Spring循环依赖源码, 解释使用三级缓存的原因.

如何将 @Transactional 事务注解运用到炉火纯青?

方法必须是public修饰符。否则注解不会生效。
this.本方法的调用,被调用方法上注解是不生效的

什么是Spring的AOP特性?

OP 是一种编程思想——面向切面编程
AOP 实现原理——代理模式。代理模式分为动态代理和静态代理。

面试官:说一下Spring 中的 @Cacheable 缓存注解?

利用改注解实现本地缓存, 并且存储本地缓存, 但是如何获取没有说呢

一文彻底明白什么是Java注解!

介绍Java注解的概念、作用以及如何使用注解来提升代码的可读性和灵活性,并介绍如何通过注解来优化我们的Java代码。

SpringBoot

Spring Boot 面试杀手锏:自动配置原理

SpringBoot自动配置原理, 面试必问

推荐阅读:
Spring Boot 自动装配原理,图文并茂,万字长文!
从注解到run方法来解读SpringBoot自动配置原理

一个注解搞定 SpringBoot 接口防刷,还有谁不会?

利用拦截器+自定义注解并实现防刷

SpringBoot异步线程实现mqtt

利用异步线程实现mqtt

推荐阅读:
springboot 快速启动(八)——整合多线程开启异步任务

【真实生产案例】SpringBoot 整合 Kafka 实现数据高吞吐

本文主要以SpringBoot技术框架为背景,结合实际业务需求,采用 kafka 进行数据消费,实现数据量的高吞吐

SpringBoot 中发布ApplicationEventPublisher,监听ApplicationEvent 异步操作

有这么一个业务场景:当用户注册后,发送邮件到其邮箱提示用户进行账号激活,且注册成功的同时需要赠送新人用户体验卡券. 这时候就可以用上ApplicationEvent 了…

7 种提升 Spring Boot 吞吐量的神技!

主要是通过多种异步方式以及设置tomcat的最大连接数或者将服务器换成 Undertow

SpringBoot @Async的魔法和陷阱

@Async方法需要位于不同的类中;
@Async 和 @Transcational 配合不佳;
@Async 阻塞问题;
@Async 中的异常;

面试官:为什么 SpringBoot 的 jar 可以直接运行?

介绍Springboot打包后的fat jar结构, 介绍用于描述jar的MANIFEST.MF文件, 以及其参数MainCLass中用于启动jar的JarLauncher的main方法等

SpringBoot 的@Value注解太强大了,用了都说爽!

@Value配合配置文件获取其中的数组和list, 并且结合EL表达解析list和map

SpringBoot的条件装配,彻底爱了

通过@Conditional 等相关注解实现条件装配

6000 字 | 统一缓存帝国 - 实战 Spring Cache

介绍了又一个spring缓存管理工具, SpringCache

Spring Boot实现定时任务的动态增删启停

在@EnableScheduling注解和@Scheduled注解实现定时任务之外实现定时任务, 而没有集成Quartz框架

SpringBoot + Vue 智慧停车之消息队列 MQTT 使用

利用springBoot整合mqtt, 利用消息队列实现相关功能

40 个 SpringBoot 常用注解

把开发上可以用到的注解都用上了

SpringBoot+Kafka+ELK 完成海量日志收集(超详细)

SpringBoot整合elk

SpringBoot 2.x 开发案例之整合国产数据库 IoTDB

Apache IoTDB(物联网数据库)是一体化收集、存储、管理与分析物联网时序数据的软件系统。适用于物联网开发

Spring Boot 实现各种参数校验,写得太好了,建议收藏!

SpringBoot 实现参数校验, 分组校验, 自定义注解校验, 函数校验, 快速失败等功能实现

推荐阅读: SpringBoot 参数校验/参数验证,常用方法都给你总结好了!

SpringBoot+拦截器+自定义异常+自定义注解+全局异常处理简单实现接口权限管理

通过拦截器来实现权限管理, 简单方便

SpringBoot实现万能文件在线预览

基于Springboot 实现文本, 压缩包, 图片, pdf 等文件的预览

SpringBoot 启动时自动执行代码的几种方式,还有谁不会?

加载顺序为static>constructer>@PostConstruct>CommandLineRunner和ApplicationRunner

SpringBoot 监控神器——Actuator 保姆级教程

SpringBoot自带监控功能Actuator,可以帮助实现对程序内部运行情况监控,比如监控状况、Bean加载情况、环境变量、日志信息、线程信息等. 其中heapdump挺有用

Spring 多线程异步上传图片、处理水印、缩略图

利用Springboot异步线程注解+thumbnailator + fastDfs实现文件上传, 水印, 缩略图

数据库

什么是MySQL数据库?看这一篇干货文章就够了!

系统介绍了mysql体系的各种基础知识, 适合做知识回顾用.

什么是MySQL的执行计划(Explain关键字)?

搞懂 MySQL Explain 命令之前不要说自己会SQL优化
科普Explain关键字的使用, 较详细

21 图 | 硬核 拿捏「执行计划」

MySQL执行计划关键字后面个参数的介绍, 很详细

程序员必备:书写高质量SQL的30条建议

SQL书写建议. 尽量遵守

聊聊 sql 优化的 15 个小技巧

项目中实用的sql优化技巧

看一遍就理解:数据库group by详解

介绍了分组查询的执行流程以及如何进行相关SQL优化, 另推荐阅读: Group By 深度优化,真实绝了!

单库单表如何变更成多库多表

介绍单库单表到多库多表的过程, 以及历史数据平滑迁移的问题

数据库,逻辑删还是物理删?

根据项目体量和数据价值来评估是进行逻辑删除还是物理删除

京东一面:MySQL 中的 distinct 和 group by 哪个效率更高?太刁钻了吧!

  1. 在语义相同,有索引的情况下:效率相同。
  2. 在语义相同,无索引的情况下:distinct效率高于group by。原因是distinct 和 group by都会进行分组操作,但group by可能会进行排序,触发filesort,导致sql执行效率低下。

Mybaties / Mybatis-plus

MyBatis 超强大的动态 SQL 语句大全

介绍了mybaties中动态 语句的相关标签, set, where, choose, foreach等

用了这么久的Mybatis,结果面试官问的问题,我竟然还犹豫了

Mybatie和hibernate的优缺点, 以及Mybaties一级缓存和二级缓存的源码解读

Mybatis-plus常用API全套教程,看完没有不懂的

Mybatis-plus框架搭建以及相关api的使用

熟练掌握 MyBatis-Plus,一篇就够!

利用Mybaties Plus实现简单curd, 条件构造器, 等值匹配, 代码生成器. 逻辑删除, 自动填充, 各种插件配置, 多租户隔离, 动态表名SQL解析器等等.

Redis

那天,我被拉入一个Redis群聊···

以聊天的形式介绍了Redis 的主从, 集群, 哨兵

基于Redis实现延时队列服务

利用延时队列实现订单超时未支付取消订单, 超时未评论默认好评, 超时未配送取消订单等业务场景.
另推荐阅读: 利用 Redis 也能实现订单30分钟自动取消

Redis 日志篇:无畏宕机快速恢复的杀手锏

Redis两种持久化方式, 以及redis4.0带来的混合持久化方式的介绍, 很有用

Redis缓存预热,该如何实现?

跟着操作可以实现

真枪实弹!Redis 「冷备」让您睡个安稳觉zZ

实现冷备份, 以及备份adb和aof脚本编写和冷备份的操作方式

使用缓存,踩过的7个坑

对使用缓存出现的缓存穿透, 缓存击穿, 缓存雪崩, 数据不一致, 大key, 热key, 命中率产生的问题进行的介绍, 并提供相对应的解决方案, 浅显易懂

性能调优

聊聊接口性能优化的 11 个小技巧

接口优化/ 接口性能优化技巧/原则: 例如加索引, 串行转并行, 同步转异步, 加缓存, 等等.

推荐阅读:
聊聊接口性能优化的10个小技巧
西安一码通系统故障BUG分析思路及解决建议!
接口串行转并行+ 设计模式(工厂+策略)实现原理

一个扛住 100 亿次请求的红包系统,写得太好了!!

使用go语言和python 实现高并发 100w连接, 3-6w qps访问.
在成为大佬的过程中可以慢慢体会这种思想

接口性能提升10倍,原来这么简单

利用多线程通过并行方式来执行查询任务, 使原来接口来增查询效率提升n倍

SQL优化的魅力!从 30248s 到 0.001s

梳理了在SQL优化时的过程, 利用索引和内连接实现, 并且用联合索引进行优化, 这种优化流程值得一学!!!

推荐阅读:
2 小时的 SQL 操作,1 分钟就搞定?!

后端接口如何提高性能?

简单介绍了 ES 为啥快,和这个快能用在哪, 以及SQL优化的方法

我们为什么要分库分表?

介绍分库分表的背景, 数据库优化的方案, 分库分表详解, 以及分库分表所带来的问题的解决思路, 和对项目是否使用分库分表的考量

8个小妙招搞定数据库性能优化,yyds~

从存储结构、存储系统中间两层的角度出发. 从减少数据量、用空间换性能、选择合适的存储系统来优化数据库系统.

GC垃圾收集器&JVM调优汇总

方法六至九值得学习.
另推荐阅读: jvm调优科普

线上

一次订单号重复引起的事故,把我坑惨了!

电商项目线上订单重复问题的一个解决思路(慎用uuid)

推荐阅读:
使用uuid作为数据库主键,被技术总监怼了一顿!

突发流量引发的Dubbo拥堵,该怎么办?

详细介绍了Dubbo服务拥堵产生的原因以及如何定位错误

JVM GC耗时频频升高,这次排查完想说:还有谁?

主要介绍使用cms对内存进行GC的调优方式, 另外Full GC是针对整堆(包括新生代和老年代)做垃圾回收的。

一条垃圾SQL,把 64 核 CPU 快跑崩了!

SQL的字段的数据类型与查询字段数据类型不一致导致的全表扫描, 经典!

大意了,一次MySQL分页导致的线上事故…

MySQL偏移量过大导致查询缓慢的问题, 可以通过

  1. 索引+子查询
  2. 将上次索引位置作为起始位置
  3. 降级策略. 偏移量超过最大值直接报错

大半夜,这个超时问题把我干趴下了!

面试官:CPU狂飙900%,该怎么处理

核心是确认是哪个进程,mysql还是java, 然后看是哪个线程, 最后定位到具体的sql或者是代码段, sql加索引, 缓存, 代码段则进行优化

运维

JumpServer Docs

JumpServer 堡垒机官方中文文档

Linux常用监视和故障排查命令详解

linux运维常用命令介绍

没想到 Shell 命令竟然还能这么玩?

利用shell命令对JSON文本进行处理

教你 Linux 免密登录配置

Linux常用技术之免秘钥配置实现

springboot jar包的启动脚本

配置简易的SpringBoot jar启动脚本

Web项目部署到Tomcat服务上的三种方式

可以学习到通过外链式来启动web, 新姿势!

Linux nohup 命令

用于在关闭shell页面后也能够令项目正常运行的命令

监控系统选型,这篇不可不读!

介绍运维监控系统的概念以及市面上常见的开源运维监控系统

接口突然超时10宗罪

1.网络问题 2. 线程池满了 3. 数据库死锁 4. 请求体过大
5. 超时时间过短 6. 死循环(递归) 7.没走索引 8.服务oom 9. 远程调试debug

面试官:Redis用过是吧?那你讲讲Redis都有哪些监控指标?

介绍redis监控的五大指标: 性能指标, 内存指标, 基本活动指标, 持久性指标, 错误指标

Docker

Docker推送镜像至阿里云,很方便!

推送镜像到指定仓库(阿里镜像仓库)使用指南

你还在 Docker 中跑 MySQL?恭喜你,好下岗了

首先从性能, 状态, 资源隔离方面考虑可用性, 然后介绍几种适合的场景.

我最讨厌这样学 docker 和 k8s 的新手

正话反说, 通过反话来介绍利用OrbStack在mac系统(苹果电脑)上快速下载安装运行docker和k8s, 非常适合新手学习使用

ES

Elasticsearch 写入优化记录,从3000到8000/s

es调优, 方法包括但不限于精细设置全文与域, 副本数量设置为0, 使用es自动生成的id, 增大索引刷新的间隔, 异步刷盘日志文件等等

Elasticsearch 实现分页的 3 种方式,还有谁不会??

  1. from + size 浅分页(5000页以下)
  2. scroll 深分页(非实时, 导出数据)
  3. search_after 深分页(实时)

ElasticSearch 面试 4 连问,你顶得住吗?

ES读写流程以及搜索数据流程, 底层原理和倒排索引介绍

1W字|40 图|硬核 ES 实战

基于Spring模块搭建ES环境模块, 达到全文搜索的功能实现

请警惕 ES 的三大坑

多线程/高并发

到底多大并发才算高并发?一文带你全面认识高并发!

关于高并发的干货文章

聊聊高可用的 11 个关键技巧

要想要让系统高可用, 需要适当的对系统进行解耦, 拆分, 异步, 重试, 补偿, 备份, 多活, 隔离, 限流熔断, 降级等操作.

做一个不崩溃的核酸系统有多难?

每小时2000w->每秒1w并发, ->数据量为10亿->1G条记录->64位整数/8字节存放地区时间, 剩下8字节检测时间和结果->16G内存足以存储全国所有数据->按地区码(前3/6位)分配服务器->20 台服务器/每秒5556->每条数据2k, 共12M不到. 因此 20台16G内存的虚拟机实例,简单的在数组中访问下标(或者二分查找)、封装返回,以及100M对外服务总带宽,就足以支持10亿用户的每小时2000万次查询

进程、线程、进程池、进程三态、同步、异步、并发、并行、串行

多线程相关基础知识介绍

高并发下如何保证接口的幂等性?

从 插入前先查, 加乐观悲观锁, 加唯一索引, 建防重表(id+唯一索引), 根据状态机, 分布式锁., 获取token来防止高并发场景下接口幂等性

字节一面:MQ 幂等、去重,有哪些通用的解决方案?

消息中间件作用: 异步, 解耦, 削锋. 消息去重的方案有:
1.插入时查询
2. select for update语句,把记录进行锁定或者是乐观锁
3. ”Exactly Once”,即消息肯定会被成功消费,并且只会被消费一次
4. 基于关系数据库事务插入消息表(主键作为消息id, 分布式的场景下通用的方案)
5. 消息表+本地事务
6.基于消息幂等表的非事务方案

select for update加锁,懵逼了!(悲观锁)

for update关键字是加在select语句中的,它从查到那行数据开始,直到事务提交,整个过程中都会加锁。

高并发系统设计的15个锦囊

设计高并发系统所需要的15个 建议

数据库跟缓存的双写一致性

数据库的双写一致性是相对于写而不是读来说的

  1. 如果缓存数据不敏感,直接给缓存设置TTL即可。
  2. 先删缓存再更新数据库,此时需配合延时双删技术,但可能导致二次删除失败。
  3. 先更新数据库再删缓存,此时需配合binlog消费 + 消息队列来实现。

ES+Redis+MySQL,这个高可用架构设计太顶了!

介绍了由于调用方循环查询Es导致Es扛不住, 进而对ES进行调优,
并对ES更新Document一秒之后生效的问题加了分布式锁+缓存.
并且对主库以"全量同步、增量同步、实时流量灰度切换"进行平滑迁移.
并且异构数据源(MySQL+ES)通过MQ实现双写.
并对接口访问流量策略和降级策略进行优化. 很值得参考的一个文字

听说你想学Java并发编程?先把这个学了(1)(2)(3)

AQS三板斧,AQS独占锁的获取
听说你想学Java并发编程?先把这个学了(1)
听说你想学Java并发编程?先把这个学了(2)
听说你想学Java并发编程?先把这个学了(3)

了解这两个接口后,阿里多线程面试题秒AC

死锁的介绍以及针对synchronized内置锁无法解决死锁、只有一个条件变量等问题的解决方案

被阿里面试官吊打,搞不定的a++

在多线程的情况下,对一个值进行 a++ 操作引起的问题, AtomicInteger 源码分析, ABA问题解决方案

图解 | 你管这破玩意叫线程池?

介绍线程池的7个参数出现的原因, 并通过一个图来总结. 非常好

推荐阅读: 线程池参数详解, 以及应用以及常用阻塞队列, 饱和策略介绍和应用以及其他建议

没用线程池的我,被上司一jio!

线程池七参数以及执行过程, 常见的下次线程池介绍和线程池的拒绝策略

推荐阅读: 如何优雅的自定义 ThreadPoolExecutor 线程池

JUC 常用 4 大并发工具类是哪几个?(面试必问!)

Java并发类: CountDownLatch, CyclicBarrier, Semaphore, ExChanger

干掉Random:这个类已经成为获取随机数的王者

在并发环境下, 使用 ThreadLocalRandom 来代替 Random, 原因是: 在一个高并发的 web 服务内,使用同一个 Random 对象可能会导致线程阻塞.

作为 Unsafe 类内的方法,它也透露着一股 “Unsafe” 的气息,具体表现就是可以直接操作内存,而不做任何安全校验,如果有问题,则会在运行时抛出 Fatal Error,导致整个虚拟机的退出

这 8 种异步实现方式,性能炸裂!!

  1. 线程Thread
  2. Future
  3. 异步框架CompletableFuture
  4. Spring注解@Async
  5. Spring ApplicationEvent事件
  6. 消息队列
  7. 第三方异步框架,比如Hutool的ThreadUtil
  8. Guava异步

『图解Java并发』面试必问的CAS原理你会了吗?

介绍乐观锁, 悲观锁, cas应用, ABA问题

想避免重复请求/并发请求?这样处理才足够优雅

利用唯一请求编号去重; 业务参数去重; 请求去重工具类,Java实现.

分布式

想做分布式开发,需要懂哪些技术?

分布式需要了解的, 这里都介绍了, 比我写的还详细.
复习分布式时, 也可以按照此文介绍的技术进行复习.

分布式锁原来实现起来这么简单

分布式锁实现的参考, 最好配合数据库和缓存不一致的解决方案… 分布式系统: cap原理: 一致性, 可用性, 分区容错性

分布式锁中的王者方案 - Redisson

介绍了Redis 的替代方案 Redisson , 他提供了使用 Redis的最简单和最便捷的方法。
以及基于Redis的Redisson分布式可重入锁RLock介绍, 需要明确Redisson架构, 原理,
Rlock的使用方式和看门狗原理

推荐阅读: 最强分布式锁工具:Redisson

什么是 “分布式事务” ?

这里从事务的ACID开始,向大家先说了XA是分布式事务处理的规范,之后谈到2PC和3PC,之后说到TCC、SAGA、消息队列的最终一致性的方案

只会用 xxl-job?更强大的新一代分布式任务调度框架来了!

PowerJob可以被认为是第三代任务调度框架,在任务调度的基础上,还额外提供了分布式计算和工作流功能

3分钟带你彻底搞懂 Kafka

6000 字|20 图|Nacos 手摸手教程

利用nacos作为注册中心和配置中心的配置介绍

一文帮你了解MQ

常见mq的介绍, MQ的优势和劣势, 常见问题

挑战大型系统的缓存设计,应对一致性问题!

分布式锁比较重, 因此在一致性要求不强的情况下进行择优选择,

  • 针对大部分读多写少场景,建议选择更新数据库后删除缓存的策略。
  • 针对读写相当或者写多读少的场景,建议选择更新数据库后更新缓存的策略。

内功知识

面试一般不会直接问但需要了解的知识

Java中的四大引用

深入浅出介绍Java 的四种引用

Java的泛型

Java泛型以及泛型出现的原因, 泛型方法, 泛型类, 通配符, 泛型擦除

装逼利器,看完这篇,让只懂反射的同学仰视你

介绍另一种和反射机制类似的方法调用机制——MethodHandle。
其主要是为了JVM支持动态语言。

收藏 | 万字长文彻底搞懂 String

对String的源码特别是常量池进行解析, 这种知识多看可以加深知识深度.

深入剖析 Java 反序列化漏洞

解析jackson和fastjson曾经出现的关于序列化漏洞

2W 字详解Java异常,面试再也不怕被问到!

关于java异常机制详细的解答

口气说出 6 种实现延时消息的方案

本文汇总了目前业界常见的延时消息方案,并且讨论了各个方案的优缺点

没有二十年功力,写不出这一行“看似无用”的代码!

Thread.sleep(0) 是为了在这里放置一个 Safepoint ,以达到避免 GC 线程长时间等待,从而加长 stop the world 时间的目的. 另外也可以通过在循环内使用Long代替int 来将可数循环变成不可数循环, 使其循环不结束前就能进入safepoint( 让程序达到安全点之后才能进程GC )

如何去阅读源码,我总结了18条心法

在阅读官网文档时, 可以从demo开始读起…

Java 8 的Stream流那么强大,你知道它的原理吗?

Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。

Lombok经常用,但是你知道它的原理是什么吗?

通过对lombok 原理的探究, 去自定义和使用元注解来实现自定义注解, 并实现其基本功能

数据结构与算法

程序员必知必会的十大排序算法

干货满满, 比我的八大排序博文还多两大

索引为什么能提高查询性能…

介绍索引, B树, B+树, 平衡二叉树等

看完这篇,还不清楚时间复杂度的,请来怼我

介绍了时间复杂度该如何计算

MySQL索引底层:B+树详解

介绍树这个数据结构的种类, 特别是重点介绍b+树的增删改查以及相关的面试题

推荐阅读:
面试必问:InnoDB 中一棵 B+ 树能存多少行数据?

动图:什么是红黑树!

对各种树的概念都做介绍

设计模式

漫画:什么是 “代理模式” ?

图解代理模式, 以及代理模式与装饰模式的区别

代码越写越乱?那是因为你没用责任链

责任链模式是一种行为设计模式, 允许你将请求沿着处理者链进行发送。收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。本文介绍在项目中如何使用责任链模式.

开源框架

后端管理框架 - 若依

码云上面开源的脚手架项目-若依脚手架项目

再见 Shiro、Spring Security!权限认证我选择它

Sa-Token 是一个轻量级 Java 权限认证框架,旨在以简单、优雅的方式完成系统的权限认证部分,主要解决:登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。

大数据

Hadoop教程

和菜鸟教程相似排版的Hadoop教程

基于 Flink 实现的商品实时推荐系统(附源码)

基于Flink的商品实时推荐系统介绍以及相关软件Mysql、Redis、Hbase和Kafka等Docker安装流程

Linux

从 lsof 开始,深入理解 Linux 虚拟文件系统

lsof: 列出打开的文件列表
df -Th 查看磁盘使用情况
du -h : 查看各个目录磁盘占用情况

100 道 Linux 常见面试题

复习Linux 可参考

关于 Shell 脚本的经典十三问

shell 脚本的使用方式介绍

Linux系统如何在命令行创建以当前日期命名的目录或文件

mkdir “$(date +”%Y-%m-%d")"

Linux 命令 su 和 sudo 的区别

介绍了 su root, su -root, sudo su -的区别以及实现
su: 切换到root用户, 环境变量和系统设置是当前的
su -i : 切换到root用户, 环境变量和系统设置都是root
sudo su - : 提供当前用户的密码, 可以切换到root用户

Linux 操作必备 150 个命令,速度收藏~

介绍linux使用的各种命令

架构

聊聊订单系统的设计?

深入浅出介绍了订单设计的逻辑,值得一看

超卖 100 瓶茅台的事故分析

秒杀100台超卖100台背后的分布式锁所带来的隐患以及解决方案, 还有对分布式锁是否需要使用的一些思考

程序员常用的画图软件和小技巧

常用图, ER图, UML图. 可视化图表, Xmind等推荐网站/软件/画图方式

【超赞】技术架构的战略和战术原则

从架构的本质开始,分别对业务架构、产品架构、数据架构、应用架构、技术架构的设计提供了一些思路和原则

常见代码重构技巧(非常实用)

为什么要代码重构以及代码重构原则, 代码分层, 命名规范, 重构技巧, 分层测试等重构后一系列需要注意的点, 很实用

淘宝十年「架构变迁」,值得收藏

介绍了淘宝技术架构变迁史. 并且总结了架构设计以及相关原则

一文了解四种软件架构:Serverless架构、微服务架构、分布式架构、单体架构[添加链接描述

介绍上述四种架构的区别

十亿用户的系统,该如何设计?

根据合适的规则进行分库分表. 分库:应对高并发, 分表: 应对大量数据写入.

节后面试必备:Spring 面试63问

关于Spring的相关面试题, 建议查漏补缺

中台 | 什么到底是中台?

主要普及了什么是中台, 并介绍了阿里巴巴的中台模式

刚火了的中台转头就拆,一大波公司放不下又拿不起来!

企业架构 | 绕不开的微服务

笔者随着工作年限的增长, 对架构的理解, 对于想要从事架构方面的人来说值得一看

开发一个网站,用户密码你打算怎么存储?

介绍了当前最为安全的传输和保存密码的方式. 通过https进行传输, 通过非对称加密算法(如 RSA)来传输用户密码, 使用 BCrypt + 盐存储用户密码. 并通过其他方式抵御破解

JWT 实现登录认证 + Token 自动续期方案,这才是正确的使用姿势!

使用框架搭建用户登录方案

推荐阅读:
Shiro + JWT + Spring Boot Restful 简易教程
基于 token 的多平台身份认证架构设计!

这样设计订单系统,简直太厉害了

订单系统设计方案流程

8年开发,连登陆接口都写这么烂…

登录限制发展: 验证码->登陆次数限制->ip限制->手机验证->开启https访问->传输内容加密->(登录日志记录, 异常登录提醒, 拒绝弱密码等)

推荐阅读: 5分钟搞定验证码

基于Mybatis手撸一个分表插件

通过Spring自定义注解以及Mybatis拦截器实现分表的功能,满足基本的业务需求.

基于CAS实现SSO单点登录

领导:谁再用 Redis 过期监听实现关闭订单,立马滚蛋!

专业的人做专业的事, 优先选择带有定时任务功能的消息队列, 其次可以使用redisson delayqueue 等基于 redis 的延时队列方案,但要为 redis 崩溃等情况设计补偿保护机制, 最后在无法使用 redisson delayqueue 等方案时可以考虑使用时间轮但也要注意保护机制. 但一定不要基于redis过期监听来实现定时任务

图解用户登录验证流程,写得太好了

通过图示及代码的方式介绍用户登录流程及技术实现,内容包括用户登录,用户验证,如何获取操作用户的信息以及一些黑名单及匿名接口如何免验证相关的实现。

面试

类的加载过程

一个类从被加载到虚拟机内存中开始,到卸载出内存,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。类在被加载后会逐渐向上级查询, 从最上级的启动类加载器到拓展类加载器再到应用类加载器依次判断是否可以进行加载.

图解:数据结构中的各种「树」,你都心中有数吗?

介绍数据结构中的树, 以及相关的概念和衍生的知识

StringBuffer和StringBuilder的区别

介绍String, StringBuilder,Stringbuffer区别, 以及Stringbuffer的常用方法

面试官不讲武德,一上来就问我Chrome底层原理和HTTP协议(万字长文)

介绍了进程, 线程, http, tcp协议以及相关的面试题,值得一看

面试官:缓存一致性问题怎么解决?

删除缓存的两种方式, 以及每种方式的几种用法都做了探讨(对于redis的探讨)

面试官:怎么做JDK8的内存调优?

淘宝|蚂蚁|菜鸟|盒马|滴滴|饿了么面经(已拿多个offer)

前人的面经还是值得我们去学习的

66 个包过面试锦囊,拿走不谢!

在打算面试前多看看, 会有帮助的

还在分不清各种IO模型?

五种linux io模型+三种java io模型

万字攻略,详解腾讯面试

腾讯面经

为什么ConcurrentHashMap的读操作不需要加锁

ConcurrentHashMap全程get不需要加锁的原因是Node的成员val使用volatile修饰(可见性)的
和数组用volatile修饰没有关系

get操作可以无锁是由于该方法所使用的基本数据结构Node元素的val和指针next是用volatile修饰的,在多线程环境下线程A修改结点的val或者新增节点的时候是对线程B可见的。

面试官:说一下线程池内部工作原理?

4年工作经验,多线程间的5种通信方式都说不出来,你敢信?

介绍多线程通信的五种方式:
1.使用 volatile 关键字.
2.使用 Object 类的 wait()/notify().
3.使用JUC工具类 CountDownLatch
4.使用 ReentrantLock 结合 Condition.
5. 基本 LockSupport 实现线程间的阻塞和唤醒

万字攻略,详解腾讯面试

体会大厂面试流程细节以及面试点

面经分享 | 程序员面试技巧,据说看了的都进大厂了

熟悉简历, 自信目光坚定, 把控面试节奏, 把话题往你熟悉的地方引, 别太实在, 多学多练

从华为云计算岗跳槽到银行科技岗,好难!

作者面试一个华为的管理岗, 但是编程能力不够突出导致的面试未通过

频繁跳槽遭质疑,这样回答让HR点赞!

尽量突出技术深度, 慎用跳槽机会

如何介绍自己的项目经验?

提前准备+准备细节+无形装逼+展示优点+不要犯低级错误+引导

关于SQL优化,你不能只是说自己只会语句的优化了

避开sql语句优化, 从存储引擎角度进行优化, 值得借鉴

面试官问我:Object o = new Object() 占用了多少个字节?

在开启指针压缩的情况下, 占16个字节. 在不开启的情况下也占16个字节. 但是含义是不同的, 见文章末尾总结

半年招聘筛选了400+份简历,告诉你怎么写容易被撩!

1-3年面试考察的内容会比应届时候多一些,比如也会问到一些算法、源码、设计模式以及项目开发中的经验等等。

5年以上则考察技术的精湛和应用程度,能为公司带来什么,技术迁移、源码运用、解决方案、带头能力等

一个半月拿到阿里字节拼多多美团offer总结

对面试流程以及面试的技术和方向介绍的很详细, 面试的时候值得一看. 平时的时候也适合查漏补缺

阿里二面:什么是mmap?

平时在面试中,你肯定会经常碰见的问题就是:RocketMQ为什么快?Kafka为什么快?什么是mmap?这一类的问题都逃不过的一个点:零拷贝

手把手教你学会RabbitMQ

介绍消息队列RabbitMQ,RockertMQ,ActiveMQ,Kafka, 并手写RabbitMQ的代码
阅读推荐: 手把手教你学会RabbitMQ之SpringBoot的整合

懵了! 面试官问我:String 长度有限制吗?是多少?

  1. 首先字符串的内容是由一个字符数组 char[] 来存储的,且 String 类中返回字符串长度的方法 length() 的返回值也是 int ,Integer 的最大范围是 2^31 -1.【0~2^31】通过计算是大概 4GB。

  2. 通过翻阅 java 虚拟机手册对 class 文件格式的定义以及常量池中对 String 类型的结构体定义我们可以知道对于索引定义了 u2,就是无符号占 2 个字节,2 个字节可以表示的最大范围是 2^16 -1 = 65535。

  3. 由于 JVM 需要 1 个字节表示结束指令,所以这个范围就为 65534 了。超出这个范围在编译时期是会报错的,但是运行时拼接或者赋值的话范围是在整形的最大范围。

为什么数据库字段要使用NOT NULL?

  1. null容易造成空指针问题
  2. null会造函数算不正确以及=失效.!=失效等
  3. null值变多以后会使索引失效!
  4. 如果是null值会额外占用一个标志位空间.

一个HashMap跟面试官扯了半个小时

将面试中所有关于hashmap面试题都总结下来, 值得观看

推荐阅读:
HashMap 夺命连环 21 问(面试要看)
ConcurrentHashMap面试灵魂拷问,你能扛多久?

全网最硬核 Redis 高频面试题解析(2021年最新版)

redis常见面试题以及在文章前面关于Java其他面试题链接导航

不说了,我要去多多了

多多买菜面试题, 多线程, hashmap, 分布式锁

面试难缠的深拷贝浅拷贝,这次终于通透了

介绍了创建对象的五种方式, 浅拷贝深拷贝的区别以及实现方式

麻烦你说下输入百度网址过后整个过程是什么样子的?

域名解析->建立连接->发送请求->响应数据->渲染页面 值得一看!

应届生在各大银行薪水有多少?

介绍银行的面试流程, 面试题以及薪水等等

面试官问:生成订单30分钟未支付,则自动取消,该怎么实现?

利用quartz来实现数据库轮询, JDK的延迟队列, 时间轮算法, redis缓存, redis+分布式锁, 使用消息队列来实现延时任务

JAVA那点破事!并发、IO模型、集合、线程池、死锁、非阻塞、AQS…

上述概念常见面试题总结

找工作时,该不该对HR说出真实离职理由?看完这10条你就懂了

面试官:谈谈 Exception 和 Error 的区别及注意事项

区别, 联系

「面试」我最近面过的那些分析师

阿里大佬面试数据分析师的思路, 面试的时候可以站在面试官角度去准备问题, 具有参考作用

闲鱼面试:Thread.sleep(0) 到底有什么用?

Thread.Sleep(0)的作用,就是“触发操作系统立刻重新进行一次CPU竞争”。
Thread有个Resume函数,是用来唤醒挂起的线程的。

【建议收藏】Kafka 面试连环炮, 看看你能撑到哪一步?(中)

消息中间件 kafka 相关面试题

面试官:如何保证用户模块的数据安全?说说你的解决方案!

对密码采用对称加密和非对称加密, 防止中间人攻击

面试反馈 Spring Cloud 的25连环炮

Spring Cloud面试题-面试必看

支付宝一面:多线程事务怎么回滚?说用 @Transactional 可以回去等通知了!

在spring中可以使用@Transactional注解去控制事务,使出现异常时会进行回滚,
在多线程中,这个注解则不会生效,可以使用sqlSession控制手动提交事务

Java集合追魂30问,坚持住

Java集合面试题, 准备这一篇就够了!!!


内容持续更新中…

  • 27
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 拾荒者扫描器22.7z是一款用于扫描拾荒者的工具软件。拾荒者指的是那些在城市中寻找可回收物品或其他有价值物品的人。这个扫描器的目的是帮助拾荒者更加高效地寻找和收集这些有价值的物品。 拾荒者扫描器22.7z具备多种功能。首先,它可以用于扫描城市地图,标出可能存在可回收物品的地点。这可以让拾荒者在开始工作前就有一个清晰的计划,增加收集有价值物品的成功率。其次,该扫描器还能够检测出城市中是否存在重复的拾荒者,以避免竞争和冲突的发生。此外,它还可以提供有关当地规定和政策的信息,帮助拾荒者遵守相关法规。 拾荒者扫描器22.7z的操作简单便捷。用户只需将其安装在智能手机或其他便携设备上,通过GPS功能定位自身位置,即可开始扫描工作。同时,该扫描器还可以根据用户的需求进行自定义设置,以适应不同的拾荒者需求。 总体而言,拾荒者扫描器22.7z是一款有助于拾荒者工作的实用软件。它提供了地图扫描、竞争检测和法规指引等功能,帮助拾荒者更加高效和顺利地进行工作。希望这款软件能够为拾荒者们提供便利和帮助,让他们的劳动得到更好的回报。 ### 回答2: 拾荒者扫描器22.7z是一种用于拾荒者行业的扫描器工具。拾荒者指的是那些依靠回收废品、杂物为生的人群。这款扫描器利用了先进的技术,可以快速而高效地扫描出有价值的废品和杂物。 拾荒者扫描器22.7z的主要功能包括以下几个方面: 首先,它可以对废品和杂物进行快速定位和识别。通过内置的图像识别技术和智能算法,它能够识别出废品中有价值的物品,例如纸张、塑料瓶、金属等,从而帮助拾荒者更快地找到有价值的物品。 其次,它具备定量和定价功能。扫描器可以准确测量和计算出收集到的废品的数量和价值。这对于拾荒者来说非常重要,因为他们需要知道自己收集到的废品数量和它们的价值,以便正确地进行价格谈判和销售。 此外,扫描器还支持数据管理和报告生成。它能够将收集到的数据存储到一个数据库中,并生成详细的报告,展示拾荒者的收集情况和业绩。这对拾荒者来说非常有益,可以帮助他们更好地管理和分析自己的工作成果。 总的来说,拾荒者扫描器22.7z是一款帮助拾荒者提高工作效率和收入的工具。它利用先进的技术,可以快速识别有价值的废品和杂物,并提供定量和定价功能,同时还支持数据管理和报告生成。拾荒者可以借助这款扫描器更加科学、高效地进行工作,从而提升自己的收入和生活质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时间静止不是简史

感谢你的肯定, 我将继续努力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值