记一次慢SQL引发的头脑风暴
背景在一个阳光明媚的早晨,报警机器人邀我共进早餐:MySQL 集群 CPU 高涨,达到 70% 并持续了数十秒,我查看监控和日志,定位异常来源于下面这条 SQL :
12345678910func Method(ctx context.Context, tenantId int64, excludeSpaceType []SpaceType) (int64, error) { var count int64 err := db(ctx).Table(XXX). Where("tenant_id = ? and space_version = ? and (delete_flag = ? or delete_flag = ?) and default_attr != ? and space_type not in (?)", tenantId, ..., excludeSpaceType). Count(&count).Error if err != nil { return -1, err ...
HashMap原理与细节
HashMap概述简介Java为数据结构的映射定义了一个接口java.util.Map,其中有四个常用实现类:HashMap、HashTable、LinkedHashMap和TreeMap。
HashMap:根据键的hashCode值存储数据,允许一条记录的键为null,访问速度快,遍历顺序不稳定。HashMap线程不安全,并发环境可以使用Collections的syncronizedMap方法将它包装为线程安全的Map但是更推荐使用ConcurrentHashMap。JDK8以前HashMap使用数组+链表的数据结构,而JDK8之后引入了红黑树结构,查找时间复杂度为O(logn),当链表长度大于8并且数组长度大于64时会将链表转为红黑树。
LinkedHashMap:LinkedHashMap是HashMap的一个子类,通过加入双向链表保证了遍历的有序性。
Hashtable:Hashtable功xd能与HashMap类似,不同点是它继承Dictionary类,因此键值都不允许null,它直接对方法添加synchronized,是线程安全的。
TreeMap:TreeMap实现So ...
【CompletableFuture详解】换一种理解角度 - 被忽略的函数式接口
CompletableFuture前言很多文章在介绍CompletableFuture时都是照功能将方法划分为不同类型,直接解释具体方法的使用规则。可如果你本就英语不好,看到几个差不多的单词排列组合成几十种方法是不是头皮发麻了?又或者你经常搞混或忘记相似方法,实战根本不知道怎么用。进一步讲,当嵌套了多组括号和回调,且由于不同方法的入参和返回值不同,经常代码检查报错摸不着头脑。
如果你有这些感觉,那么看完本文对你一定会有收获。本文不会直接告诉你那么多API具体如何使用,而是教会你如何高效区分和掌握不同API的用法。
简介JDK8中新增了CompletableFuture类作为异步任务编排的解决方案,它可以被认为是Future的扩展,采用了函数式编程思想简化了任务编排和回调地狱,本文的CompletableFuture会以JDK8为准。
函数式接口如何做到快速掌握用法?其实很简单,就是被忽略的函数式接口。很多文章认为直接把方法翻译为具体功能更简单易懂,其实不然,其听我慢慢道来。
我们先来看看thenCombine方法的声明:
12345public <U,V> Completa ...
Markdown测试
Java代码块123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657/* Block comment */import java.util.Date;import static AnInterface.CONSTANT;import static java.util.Date.parse;import static SomeClass.staticField;/** * Doc comment here for <code>SomeClass</code> * @param T type parameter * @see Math#sin(double) */@Annotation (name=value)public class SomeClass<T extends Runnable> { // some comment private T field = null; priva ...