自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

javaTalk

越努力,越幸运!

  • 博客(163)
  • 收藏
  • 关注

原创 数据库迁移遇到的问题和解决方案

本文主要讲解数据从老库迁移到新库过程中遇到的问题,以及针对这些问题给出的解决方案,希望能给你一点点启发或者帮助。一 老库表为什么要写收口由于多个业务端的多个服务公用一个老库,且多个服务访问老库公用一套密码,这个时候如何确定只有我们在老库的表进行写入呢?为了排除还有其他业务端服务直连老库,写老库的表,我们给表添加了一个字段,比如是 A,来标识是我们端对表的写入。如果不是我们端对表的写入,该字段应该是空值。为什么一定需要确定写收口呢?假设有某个业务端的服务对老库的表进行写入,然后我们进行了数据迁

2021-01-06 09:10:59 6040 10

原创 记一次大量499http状态码问题出现与处理

目录问题描述问题分析问题解决总结思考问题描述1 19:38 DBA 发现加解密数据库 DTS 出现延迟,查看数据库监控,发现 ALI 机房出现大量写入。2 19:41 架构组研发查看 cat 监控,发现加解密服务、消息中心服务等一些其他的服务出现总共2万多的499状态码。3 19:43 加解密数据库 DTS 恢复正常,加解密数据库的 ALI 机房不再有大量写入。4 20:00 加解密服务研发发现流量主要来源是消息中心服务,马上联系消息中心服务的负责人,了解业务情况。.

2021-01-03 16:55:53 2075 1

原创 值得推荐的chrome插件

推荐8个好用的chrome插件。

2021-01-02 16:13:58 941 3

原创 JWT token 实践问题解决

JWT 实现 token 认证讲述了 JWT一些基本概念,使用JWT token 的优缺点以及使用需要注意的问题。本章主要讲述在使用 JWT token 过程中遇到的问题以及解决方案。token 是什么?token 是用户登录的时候颁发的。改造场景:内网有一些接口是通过token 来获取用户信息,这个是不合理的。我的理解: token 是用来认证用户的,应该在外网之间进行流转;内网之间流转的应该是各种业务 id。解决方案:获取用户信息应该使用 user_id。既然能拿到 token,...

2021-01-02 00:04:49 4051 9

转载 如何保证缓存与数据库的一致性?

目录先删缓存,再更新数据库解决方案延时双删先更新数据库,再删除缓存解决方案消息队列进阶版消息队列其他解决方案设置缓存过期时间为什么是删除,而不是更新缓存?总结对于缓存和数据库的操作,主要有以下两种方式。先删缓存,再更新数据库先删除缓存,数据库还没有更新成功,此时如果读取缓存,缓存不存在,去数据库中读取到的是旧值,缓存不一致发生。解决方案 延时双删延时双删的方案的思路是,为了避免更新数据库的时候,其他线程从缓存中读取不到数据,就在更新完数

2020-12-26 16:54:04 4247

原创 postman 测试 Array、List、Map 入参 API 正确姿势

一 Array1.1 spring 以 @RequestParam 解析简单数组@RequestMapping(value = "/getByIds" ,method = RequestMethod.POST)public RetDTO getByIds(@RequestParam(value = "ids") Long[] ids){ return RetDTO.getReturnJson(userService.getByIds(ids));}postman 请求方式一...

2020-12-20 17:27:36 3328 1

原创 Markdown 学习和实践

目录一 标题二 引用三 列表四 代码五 水平线六 超链接七 图片八 字体九 复选框十表格Markdown 致力于使阅读和创作文档变得容易。我们通过常用的标题、引用、列表、代码、水平线、超链接、图片、字体、复选框、表格来说明具体语法。一 标题Markdown 支持两种形式的标题,[Atx] 和 [Setext] 。Atx 样式的标题每行开头使用 1-6 井号, 对应 1-6 级标题。Setext 样式的标题使用的等号来表示一级标题,使用连..

2020-12-12 10:57:51 420

原创 mysql alter 最佳实践总结

目录字段索引在工作中经常会遇到给表添加字段、给字段添加索引等需求,而且经常忘记语法,以此篇文章来记录这些基本的操作。以 user 表为例,来说明添加字段、添加索引的语法和示例。CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID', `name` varchar(50) NOT NULL COMMENT '用户名', `create_datetime` datetime NOT NULL CO

2020-12-05 11:30:43 1416 1

原创 Incorrect string value: ‘\xF0\x9F\x92\x95\’

目录问题描述问题分析​问题解决问题扩展问题描述工作过程中,突然收到短信和邮件 5xx 报警。通过 5xx HTTP 状态码排查 Nginx 日志、业务日志发现报如下错误:问题分析1初步看,应该是说更新 name 写入 utf8编码的 “\xF0\x9F\x92\x95” 失败了。2 那utf8编码的字符串 “\xF0\x9F\x92\x95” 是什么呢?通过排查发现这个是字符串编码的是 emoji 符号,该 emoji 符号代表两颗心的意思。上面的 e...

2020-11-28 17:14:29 2867 3

原创 工作飞轮最佳实践

提高工作效率的原则原则一:事情优先级 对事情进行优先级排序、抓大放小。对具体事情进度把控、信息同步、风险评估、及时汇报。原则二:事情数据化 把大的目标化成小目标,进行任务拆解,设定每一个阶段的里程碑,达到里程碑进行庆祝。原则三:会议明确性晨会:范围为一个项目或者一个不超过 20 人的小部门,一般不超过 15 分钟,就是同步做了什么,要做什么,遇到了什么挑战。目的就是同步信息,不做深入的讨论。 周会:范围和晨会一样,一般是 1~2 个小时,这个目的就是围绕解决...

2020-11-08 20:06:54 714

转载 Full GC 和 Minor GC

目录Full GCFull GC的触发条件Minor GC触发条件Minor GC的过程Survivor区对象晋升位老年代对象的条件Minor GC的问题与卡表分析关于 Major GC的说明小结参考资料 & 鸣谢Full GCFull GC 就是收集整个堆,包括新生代,老年代,永久代(在JDK 1.8及以后,永久代会被移除,换为metasp...

2020-10-13 08:34:37 2088

原创 04-享元模式

一 什么是享元模式 享元模式是指共享的单元,享元模式的意图是复用对象,节省内存,前提是享元对象是不可变对象。二 享元模式与单例、缓存、对象池对比2.1 享元模式与单例 在单例模式中,一个类只能创建一个对象,而在享元模式中,一个类可以创建多个对象,每个对象被多处代码引用共享。实际上,享元模式有点类似于之前讲到的单例的变体:多例。 我们前面也多次提到,区别两种设计模式,不能光看代码实现,而是要看设计意图,也就是要解决的问题。尽管从代码实现上来看,享元模式和...

2020-09-30 15:20:40 324

原创 值得拥有的Java编程规范

一 命名与注释1.1 命名命名的关键是能准确的表达意思。在足够表达其含义的情况下,命名当然是越短越好。 方法内部的临时变量推荐短命名,类名建议长命名,大家耳熟能详的,命名用缩写。 命名要可读、可搜索,命名过程符合项目的统一规范,最好能做到见名知意。 接口命名方式一:接口加前缀“I”,比如 IUserService,对应的实现类命名为 UserService。 接口命名方式二:不加前缀,比如 UserService,对应的实现类加后缀“Impl”,比如 UserServiceImpl。 抽象

2020-08-29 14:11:40 366

原创 面向对象设计原则和思想

一 单一职责原则1.1 单一职责原则概念 单一职责原则的英文是 Single Responsibility Principle,缩写为 SRP。这个原则的英文描述是这样的:A class or module should have a single responsibility。如果我们把它翻译成中文,那就是:一个类或者模块只负责完成一个职责(或者功能)。 一个类只负责完成一个职责或者功能。也就是说,不要设计大而全的类,要设计粒度小、功能单一的类。换个角度来讲就是,一个类...

2020-08-08 15:54:57 1315

原创 SpringBoot 集成 Smart-Doc

一 什么是 Smart-Doc smart-doc 是一个 java restful api 文档生成工具,smart-doc 颠覆了传统类似 swagger 这种大量采用注解侵入来生成文档的实现方法。 smart-doc 完全基于接口源码分析来生成接口文档,完全做到零注解侵入,你只需要按照 java 标准注释的写,smart-doc就能帮你生成一个简易明了的 markdown 或是一个像 GitBook 样式的静态 html 文档。如果你已经厌倦了 swagger 等文档工具的无数注解和强...

2020-07-24 09:37:03 5170 3

原创 05-Redis 的穿透、雪崩、击穿

Redis 穿透、雪崩、击穿学习和解决。

2020-07-08 22:59:14 392

原创 08-BloomFilter 解决 Redis 缓存穿透问题

一 什么是 BloomFilter 布隆过滤器实际上是一个很长的二进制向量和一系列随机映射函数。 布隆过滤器用于检索一个元素是在集合中的状态可以得到下面两种情况:1一定不在集合中;2可能存在集合中。二BloomFilter 原理 布隆过滤器(Bloom Filter)的核心实现是一个超大的位数组和几个哈希函数。2.1 布隆过滤器添加元素 1 将要添加的元素通过 K 个散列函数进行映射,得到一个位数组中的 K 个点; ...

2020-07-05 13:28:35 1027

原创 07-Bitmap 原理和实现及其在 Redis 的应用

一 Bitmap原理 Bitmap 的基本原理就是用一个 bit 来标记某个元素对应的 Value,而 Key 即是该元素。由于采用一个bit 来存储一个数据,因此可以大大的节省空间。 比如我们需要将数据从 A 表迁移到 A1...A10 个表,我们可以使用Bitmap来表示 A 表中的数据标记数据迁移状态。现在我们将 2,7,12,15迁移到 A1...A10 表中,经过BitMaps 标记后如下图所示:二 Bitmap 代码实现public cla...

2020-07-04 20:16:47 2769

原创 04-Redis 过期策略、内存淘汰机制和 LRU 算法的实现

一 Redis 过期策略Redis 过期策略是:定期删除 + 惰性删除。定期删除 定期删除,指的是 Redis 默认是每隔 100ms 就随机抽取一些设置了过期时间的 key,检查其是否过期,如果过期就删除。假设 Redis 里放了 10w 个 key,都设置了过期时间,你每隔几百毫秒,就检查 10w 个 key,那 Redis 基本上就死了,cpu 负载会很高的,消耗在你的检查过期 key 上了。注意,这里可不是每隔 100ms 就遍历所有的设置过期时间的 key,那样就是一场性能上...

2020-07-02 21:13:22 645

原创 JMH 性能测试分析工具

一 什么是 JMH JMH 是在method层面上的 benchmark,精度可以精确到微秒级,是对热点函数进行优化时,对优化结果进行定量分析的工具。二 JMH 的应用场景典型场景:想定量地知道某个函数需要执行多长时间,以及执行时间和输入 n 的相关性。 一个函数有多种不同的实现,针对多种不同的实现,需要定量分析出那种实现性能更好。三 JMH 的使用3.1 引入依赖<properties> <jmh.version>1.14.1&...

2020-06-30 01:01:39 860

原创 CPU 利用率高如何分析

CPU 繁忙的原因有以下几个:线程中有比较耗时的计算。 系统发生了频繁的 Full GC。一使用 jstack 来打印异常进程的堆栈信息第一步:通过 ps -ef | grep java 找到 Java pid。第二步:top -Hp pid 找到使用CPU最高的线程 tid。第三步:printf %0x tid 将 tid转化成16进制。第三步:jstack pid | grep tid 找到线程堆栈。如果jstack 得到的线程信...

2020-06-27 21:25:13 1027

翻译 05. 重构-重新组织数据

一 self Encapsulate Field (自封装字段) 直接访问一个字段,与该字段之间的耦合关系将会逐渐变得笨拙。为该字段建立取值、设值函数,并且只以这些函数来访问字段。二 Replace Data Value with Object (以对象取代数据值) 有一个数据项,需要与其他数据和行为一起使用才有意义。将数据变成对象。三 Change Value to Reference (将值对象改为引用对象) 从一个类衍生出许多彼此相等的实例,希望...

2020-06-27 15:37:09 413

翻译 04. 重构-在对象之间搬移特性

一 Move Method (搬移函数) 如果一个类有太多的行为,或者说如果一个类与另外一个类有太多合作而形成高度耦合,这个时候就应该搬移函数。通过搬移函数,可以使得系统中的类更加简单,最终也将更干净利落实现系统交付的任务。二 Move Field (搬移字段) 在程序中,如果某个字段被其所驻类之外的另一个类更多地用到。这个时候需要在目标类新建一个字段,修改源字段的所有用户,令它们改用新字段。三 Extract Class (提炼类) 如果某个类做了应...

2020-06-27 13:48:03 414

翻译 03. 重构-重新组织函数

一 Extract Method (提炼函数) 当看见一个过长的函数或者一段需要注释才能让人理解用途的代码,需要将这段代码放进一个独立函数中。提炼函数有如下好处: 1 首先,如果每个函数的粒度都很小,name函数被复用的机会就很大; 2 其次,这样做会使得高层函数读起来就像一系列注释; 3 最后,如果函数都是细粒度,那么函数的覆写也会更容易一些。二 Inline Method (内联函数) 如果函数的内容和起函数名称同样清晰...

2020-06-25 23:45:08 870

转载 分布式事务,有解吗?

单库,多个数据要同时操作,如何保证数据的完整性,以及一致性?答:事务。举个栗子:用户下了一个订单,需要修改余额表,订单表,流水表,于是会有类似的伪代码:start transaction;CURD table t_account; any Exception rollback;CURD table t_order; any Exception rollback;CURD table t_flow; any Exception rollback;...

2020-06-24 22:05:59 341

原创 count(*)、count(主键id)、count(字段)、count(1)实现原理和性能比较

在工作中我们或多或少都会遇到统计数据的需求,那么问题来了,count(*)、count(主键id)、count(字段)、count(1) 这些操作,我们到底用哪个比较合适呢。count() 的语义 count() 是一个聚合函数,对于返回的结果集,一行行地判断,如果 count 函数的参数不是 NULL,累计值就加 1,否则不加。最后返回累计值。MySQL 不同引擎,count()的实现方式MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) ...

2020-06-21 18:16:07 2717 1

原创 mysql按日、周、月分组统计数据

我们需要对每天,每周,每月活跃用户进行统计,1)按天统计:select DATE_FORMAT(create_time,'%Y-%m-%d') days, count(id) count from user group by days;2)按周统计:select DATE_FORMAT(create_time,'%Y-%u') weeks, count(id) count from user group by weeks;3)按月统计:select DATE_FORMA..

2020-05-28 22:57:53 603

翻译 02. 重构-代码的坏味道

目录1.Duplicated Code(重复的代码)2.Long Method(过长方法)3.Large Class(过大的类)4.Long Parameter List(过长參数列)5.Divergent Change(发散式变化)6.Shotgun Surgery(霰弹式修改)7.Feature Envy(依恋情结)8.Data Clumps(数据泥团)9.Primitive Obsession(基本类型偏执)10.Switch Statements(switch

2020-05-12 09:23:47 587

翻译 01. 重构-重构原则

一 重构定义 视上下文的不同,“重构”这个词有两种不同的定义: 1.1重构当做名词 对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可用性,降低其修改成本。 1.2重构当做动词 使用一系列重构手法,在不改变软件可观察行为的前提下,调整其结构。二 为何重构 重构是一个工具,它可以用于以下几个目的...

2020-05-08 21:24:56 870

翻译 05 MySQL数据库

一 建表规约1. 【强制】表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint(1 表示是,0 表示否)。 说明:任何字段如果为非负数,必须是 unsigned。 注意:POJO 类中的任何布尔类型的变量,都不要加 is 前缀,所以,需要在<resultMap>设置从 is_xxx 到 Xxx 的映射关系。数据库...

2020-04-20 16:19:36 605

翻译 04 安全规约

1. 【强制】隶属于用户个人的页面或者功能必须进行权限控制校验。 说明:防止没有做水平权限校验就可随意访问、修改、删除别人的数据,比如查看他人的私信内容、修改他人的订单。2. 【强制】用户敏感数据禁止直接展示,必须对展示数据进行脱敏。 说明:中国大陆个人手机号码显示为:137****0969,隐藏中间 4 位,防止隐私泄露。 3. 【强制】用户输入的 SQL ...

2020-04-20 14:53:05 391

翻译 03 单元测试

1. 【强制】好的单元测试必须遵守 AIR 原则。 说明:单元测试在线上运行时,感觉像空气(AIR)一样并不存在,但在测试质量的保障上,却是非常关键的。好的单元测试宏观上来说,具有自动化、独立性、可重复执行的特点。 A:Automatic(自动化) I:Independent(独立性) R:Repeatable(可重复) 2. 【强制】单元测试应该是全自动执行的,并且非交互式的。...

2020-04-20 14:46:12 406

翻译 02 异常日志

异常日志一 异常处理二 日志规约一 异常处理1. 【强制】Java 类库中定义的可以通过预检查方式规避的 RuntimeException 异常不应该通过 catch 的方式来处理,比如:NullPointerException,IndexOutOfBoundsException 等等。 说明:无法通过预检查的异常除外,比如,在解析字符串形式的数字时,可能存在数字格式错误...

2020-04-20 12:27:27 638

翻译 01 编程规约

1. 【强制】代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。 反例:_name / __name / $name / name_ / name$ / name__ 2. 【强制】代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。 说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义。注意,纯拼音命名方式更要避免采用。 正例:r...

2020-04-18 11:30:02 505

原创 SpringBoot 集成 RestTemplate 和使用

目录一 RestTemplate 依赖二 RestTemplate 装配三RestTemplate 使用一 RestTemplate 依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starte...

2020-04-17 09:00:34 3941

原创 List 和 Map、JSONArray、Array 相互转换

目录一 User 类二 List转Map三 Map转List四 List转JSONArray五 JSONArray转List六 JSON String转List一 User 类import lombok.Data;import java.util.Date;@Datapublic class User { private Long id; ...

2020-04-14 09:18:59 5925 1

转载 如何找出某一天访问百度网站最多的 IP?

题目描述现有海量日志数据保存在一个超大文件中,该文件无法直接读入内存,要求从中提取某天访问百度次数最多的那个 IP。解答思路这道题只关心某一天访问百度最多的 IP,因此,可以首先对文件进行一次遍历,把这一天访问百度 IP 的相关信息记录到一个单独的大文件中。接下来采用的方法与上一题一样,大致就是先对 IP 进行哈希映射,接着使用 HashMap 统计重复 IP 的次数,最后计算出重复次...

2020-04-13 08:24:47 367

转载 如何从大量数据中找出高频词?

题目描述有一个 1GB 大小的文件,文件里每一行是一个词,每个词的大小不超过 16B,内存大小限制是 1MB,要求返回频数最高的 100 个词(Top 100)。解答思路由于内存限制,我们依然无法直接将大文件的所有词一次读到内存中。因此,同样可以采用分治策略,把一个大文件分解成多个小文件,保证每个文件的大小小于 1MB,进而直接将单个小文件读取到内存中进行处理。思路如下:首先遍...

2020-04-13 08:22:14 1930

转载 如何从大量的 URL 中找出相同的 URL?

题目描述 给定 a、b 两个文件,各存放 50 亿个 URL,每个 URL 各占 64B,内存限制是 4G。请找出 a、b 两个文件共同的 URL。解答思路 每个 URL 占 64B,5,000,000,000 * 64B ≈ 5GB * 64 = 320GB,那么 50 亿个 URL占用的空间大小约为 320GB。由于内存大小只有 4G,因此,我们不可能一次性...

2020-04-13 08:18:26 517

转载 单点登录(SSO)的设计与实现

目录一、前言1、SSO说明2、设计目标二、SSO设计与实现1、核心应用与依赖2、用户登录状态的存储与校验3、用户登录/登录校验4、用户登出5、跨域登录、登出三、备注一、前言1、SSO说明SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。https://baike.b...

2020-04-05 09:27:23 738

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除