自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(29)
  • 收藏
  • 关注

原创 CountDownLatch,CyclicBarrier,Semaphore扫盲

CountDownLatch,CyclicBarrier,Semaphore在我们平常的开发中,可以用来做许多有趣的实现,比如像跑步一样,让多个线程能一起出发,或者像建房子一样,让多个线程通过协助,在创建完成后入住,有或者像摩天轮,有20个座位,我偏要每次只能一个人进去,馋哭那些排队的小朋友,从大致上看,这三个方法的作用非常类似,都是对多个线程协作进行管理,但是实际使用起来又有区别,在从源码对这三个工具类做进一步了解后写了这篇小文,以便以后查阅一、CountDownLatch他就对应上面讲房子的例子,他

2021-10-15 17:14:26 195

原创 初次反向编译apk并进行修改

使用一个app时,某个按钮因为权限问题被置灰无法点击,很烦,于是想着能不能通过修改apk的方式来防止按钮变灰,因为按钮本身是可以点的,只是时间限制被置灰了,之前从没有相关经验,所以过程中踩了很多坑,花了三天时间完成任务,在这里记录分享一下,免得以后对某个apk起色心的时候忘了怎么操作。所需要的工具(文章尾部附上下载链接)apktool dex2jar HexEditorI ZipCenOp jd-gui有了工具就可以正式开始了,下面将记录这次操作的每一步以及解决坑的方法一、使用Ap

2021-09-09 15:15:05 4384 2

原创 redis数据类型底层实现

一、什么是redisRedis是基于内存幷支持持久化的NoSQL数据库,由于其高效的性能及扩展能力,可以说是目前最受欢迎的NoSQL数据库,在我们目前的项目中,主要用于登陆信息验证、中断状态保存、实时广告数据拉取等场景,相比于其他的key-value数据库,redis有着丰富数据类型支持,包括有string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合),本文将从他支持的数据类型出发,进一步探索其内部数据结构实现,以对其支持的数据特性有更直观的理

2021-09-01 22:23:18 1608 1

原创 JUC锁基石-AbstractQueuedSynchronizer

提到juc,很多人会觉得陌生又熟悉,因为这个包在一般情况下用不到,但是在逛博客、面试、阅读书籍的时候又很容易看到他们的身影,因为这个包几乎和java的并发编程牢牢的绑在了一起,提到并发编码就必定会谈到Doug Lea的juc包,而并发编程又是java编程的重难点之一,总而言之,使用java,你就绕不开并发编程,也绕不开juc,无论你用或者不用,它就在这里,让你时而明白,时而困惑,今天我们就一起来探究构起java.util.concurrent大厦的基石AbstractQueuedSynchronizer。

2020-09-14 14:32:03 223

原创 Caffeine与Guava对比

Caffeine/Guava性能测试处于性能优化考虑,项目准备将本地缓存从guava cache 转到caffeine cache,于是着手对caffeine进行了一波调研,首先通过一系列测试,通过caffeine和guava从结果来看,在相同cpu负载下,Caffeine Cache的读取和写入速度优于Guava Cache,差距在4倍以上。但在内存占用方面来看,两者无明显区别。测试环境:CPU:i7-8700 3.20GHz 6核内存:16g系统:Windows 10JDK版本:8ID

2020-08-19 17:36:01 10827

原创 高性能MySQL第七章:MySQL高级特性

MySQL从5.0和5.1版本开始引入了很多高级特性,包括分区、触发器等,这些新特性也许不会频繁用到,但对于某些场景下,会给我们更多DB层面优化的选择,所以,了解一下总是有益的。一、分区表分区表,通过在创建表时,使用partition by子句来定义每个分区存放的数据,以达到将数据按照一个比较粗的粒度分在不同的表中,这样,就可以方便的对数据进行分区处理。分区表,一般在下面场景中,可以体现其价值表非常大以至于无法全部放到内存中,或者只在表的最后部分有热点数据,其他的均是历史数据对分区进行独立的处理,

2020-07-13 22:52:03 200

原创 高性能MySQL第六章:查询性能优化

前面的章节介绍了如何设计优良的表结构、建立最好的索引,但是有这些还不够,如果没有合理的查询,这些基础设计仍然没有办法发挥其作用,本章主要介绍了查询设计的一些基本原则,幷介绍了一些优化技巧一、为什么查询速度会慢查询任务是由一系列子任务组成的,每个子任务都会消耗一定的时间,包括网络IO,CPU计算,生成统计信息和执行计划,锁等待,其他任何一个节点都有可能导致整个查询任务变慢,所有,优化查询的目的就是减少和消除这些过程所花费的时间...

2020-07-01 22:21:55 265

原创 高性能MySQL第五章:创建高性能的索引

索引是存储引擎用于快速找到记录的一种数据结构,索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对性能的影响越发重要,但是如果设计了一堆糟糕的索引,反而会对性能带来负面影响,所以,正确的认识索引,幷根据索引的特性来设计索引是对查询性能优化最有效的手段一、索引基础1.索引的类型B-Tree索引存储引擎以不同的方式使用B-Tree索引,性能也各有优劣,例如,myISAM使用前缀压缩技术使得索引更小,但InnoDB则按照原数据格式进行存储,然后myISAM索引通过数据的物理地址引用被索引的行

2020-06-18 23:12:41 110

原创 高性能MySQL第四章:Schema与数据类型优化

良好的逻辑设计和物理设计是高性能的基石,前期的表结构设计质量,会直接影响基于表结构的业务SQL性能,所以,表结构的设计质量,直接关系到系统的运行情况,甚至是系统的用户体验,本章,主要对MySQL支持的数据进行讲解,说明数据类型的优缺点及适用场景一、选择数据类型的基本原则1. 更小的通常最好一般情况下,应该尽量选择可以正确存储数据的最小数据类型,因为它们占用的磁盘、内存和CPU缓存更少,并且调用CPU周期也更短,但是如果由于前期选择的数据类型支持的范围不足以支持业务数据,需要修改数据类型以增加数据范围,

2020-06-15 22:30:18 292

原创 高性能MySQL第三章:服务器性能剖析

本章主要围绕服务器是否达到了性能最佳状态、找出某条语句为什么执行不够快、以及诊断停顿、堆积、或者卡死的间接性故障三个问题来做出解答,幷说明解决问题的一些技巧和好用的工具一、性能优化简介性能优化的原则之一是弄清楚什么是性能?性能,有很多的指标用来描述性能的好坏,比如每秒查询次数、CPU利用率、可扩展性等,在本章中,对性能给出了一个正式的定义:“完成某件任务所需要的时间度量即响应时间”。确定了优化的方向,就要确定第二个原则:“无法测量就无法有效的优化”。所有优化的第一步是进行测量,确认时间花在了什么地方

2020-06-10 23:01:36 132

原创 高性能MySQL第二章:MySQL基准测试

基准测试是MySQL新手和专家都需要掌握的一项基本技能,简单的说,基准测试是针对系统设计的一种压力测试,目标是为了掌握系统的行为,有时候也是为了做硬件的可靠性测试。一、为什么要进行基准测试基准测试是唯一方便有效的、可以学习系统在给定的工作负载下会发生什么的方法,基准测试可以关系系统在不同的压力下的行为,评估系统的容量,掌握哪些是重要的变化,或者观察系统是如何处理不同的数据。基准测试可以在系统实际负载之外创建一些虚构的场景进行测试基准测试可以完成以下工作。验证基于系统的一些假设,确认这些假设是否符

2020-06-08 20:34:16 161

原创 高性能MySQL第一章:架构与历史

和其他数据库相比,MySQL也许幷不完美,但是他的灵活能让他在不同的场景中应用幷发挥良好,而这要归结其架构,其独特的存储引擎架构更是其丰富功能及灵活性的重要来源。本章主要描述了MySQL的服务器架构、各种存储引擎之间的主要区别、以及这些区别的重要性。1.1MySQL逻辑架构 上图为MySQL服务器的主要逻辑架构图,如图所展示,MySQL架构主要分为三层第一层是和大多数基于...

2020-06-04 21:22:39 125

原创 代码整洁之道第十三章-并发编程

编写整洁的并发程序很难-非常难,即使并发代码表面上看来有问题,但依然容易在不经意间产生无法预料的问题,并发代码主要存在难测试,难重现的问题,本章主要讨论并发编程的需求及困难之处,并给出了一些对付这些难点,编写整洁并发代码的建议。1.为什么要并发并发这么难,而且容易出现意料之外的问题,那为什么我们依然需要把多线程编程作为我们需要掌握的重点技能呢?其实,并发是一种解耦策略,它帮助我们把做什么和何时做分解开来,相对于单线程的目的和时机的紧密耦合,它能明显的改进应用程序的吞吐量和结构。并发确实能带来很大的性

2020-05-25 20:37:45 266

原创 代码整洁之道第十二章-迭进

通过迭进设计达到整洁的目的,本章主要介绍了四条简单的规则,用以帮助你更轻易的实现代码的良好的设计已经更轻松的应用SRP和DIP等原则,这四条规则是 运行所有测试 不可重复 表达程序员的意图 尽可能减少类和方法的数量 以上规则按其重要程度排列1.运行所有测试如前面章节所介绍的,拥有良好的单元测试覆盖率,并且持续运行,会使你的代码更容易遵守一些规则,因为你会努力去编写易于测试的代码,进而更注重代码的设计,去编写低耦合高内聚的代码。2.重构有了测试,你就能保

2020-05-21 22:30:44 244

原创 代码整洁之道第十一章-系统

整洁的代码帮助我们在较低层的抽象层级上达成项目代码简洁有力的目标,但是我们任然需要在较高的抽象层级-系统层级上保持整洁,就像一栋大楼,我们既需要内部装修的优美,也需要整个大楼各个部分责任明确、协调的工作。1.将系统的构造和使用分开构造和使用是非常不一样的过程,软件系统应将启始过程和启始过程之后的允许是逻辑分开,在启始过程中构件应用对象,也会存在互相纠缠的依赖你关系。也许这句话还够清晰,但是如果我们结合spring的依赖注入和控制反转所起到的作用就可以很好的理解这个思想了,这么看来,spring的DI

2020-05-20 23:02:15 173

原创 代码整洁之道第十章-类

即使我们能写出足够整洁,具有表达力的代码语句及由代码语句构成的函数表达力,但如果无法在更高的代码组织层面进行处理,就始终得不到整洁的代码。一、类的组织类应该从一组变量列表开始,如果有公共静态常量,应该先出现,然后是私有变量,以及私有实体变量。公共函数应该跟在变量列表之后,推荐将公共函数调用的私有工具函数紧跟在该公共函数后面,准守自顶向下的原则,使程序读起来就像一篇报纸文章。二、类应该短小和函数一样,我们强调类应该短小,尽量短小,如何判断类多小合适呢,我们该如何将一个大类重构为精炼短小的类呢?

2020-05-16 13:36:06 513

原创 代码整洁之道第九章-单元测试

因为敏捷开发和TDD运动,许多程序员都开始在项目开发中,同步开发自动化单元测试,就如我现在手上的项目一样,因为业务交叉比较大,经常导致迭代过程中,对某个模块的修改,影响系统其它的部分,在测试过程中,甚至被测试遗漏的地方,在线上暴露问题,导致项目较大的迭代风险和问题排查成本。最近项目组在考虑补充单元测试来覆盖关键的业务代码,来降低相关问题的出现的概率。本章主要是讲解一些关于编写好的测试的更细微但却更重要的点。1.TDD三定律定律一、在编写不能通过的单元测试前,不可编写生产代码。定律二、只可编写刚好

2020-05-14 21:33:27 213

原创 代码整洁之道第八章-边界

在开发系统过程中,我们总是需要购买第三方或使用开发源代码,有时我们也会依赖公司其他团队的组件或者子系统,不管哪种情况,我们都需要处理好本系统和第三方之间的边界问题,本章主要介绍一些保持软件边界整洁的实践手段和技巧。1.使用第三方代码在接口提供者和使用者之间,存在与生俱来的张力,接口提供者追求普适应,而接口使用者追求特定需求的满足,两者之间的矛盾就是导致系统边界的问题根本原因,以Map为例,Map提供了丰富的函数,可以对映射图中的数据进行灵活的操作,但是如果Map的使用场景只想来进行数据的存取,但是在

2020-05-13 23:42:16 284

原创 代码整洁之道第七章:错误处理

在代码开发过程中,由于大量的错误处理代码和正常的业务处理逻辑代码交杂在一起,导致代码凌乱不堪,逻辑不清,错误处理很重要,但是如果错误处理代码扰乱了代码逻辑,那这样本身就是错误的。本章主要讲述了如何雅致地处理错误代码的一些技巧和思路。1.使用异常而非错误代码以前,在处理错误时,要么设置一个错误标识,要么返回给调用者检查的错误码,但这会严重搞乱调用者代码,调用者必须在调用之后即可检查错误,但这个步骤很容易被遗忘,所以,遇到错误的时候,最好抛出一个异常,由上层代码捕获异常,统一处理,这样就可以很好的将错误

2020-05-11 23:34:18 297

原创 代码整洁之道第六章:对象和数据结构

对象和数据结构之间是截然对立的,它们之间存在着二分原理:使用数据结构的代码便于在不改动既有数据结构的前提下添加新的函数,面向对象代码(接口)便于在不改动既有函数的前提下添加新类。因为数据结构代码,在添加新的数据结构的时候,必须修改所有的函数,面向对象的代码难以添加新的函数,因为必须修改所有的类。 //数据结构,直接暴露内部数据 public class Point(){ public double x; public double y; }

2020-05-10 17:23:51 194

原创 代码整洁之道第五章:格式

当有人查看底层代码实现时,我们希望他们为其整洁、一致及所感知到的对细节的关注而感到震惊。我们应该保持良好的代码格式,选择一套管理代码格式的简单规则,然后贯穿这些规则。如果在团队中工作,则团队应该一致同意采用一套简单的格式规则,所有成员都要准从。一、垂直格式像报纸那样,我们的代码也应该重上到下,层层递进,细节往下渐次展开,给人一种像读报纸一样,内容短小精悍,次序谨然。1、使用空白行进行概...

2020-05-06 22:09:21 199

原创 代码整洁之道第四章:注释

什么也比不上放置良好的注释来的有用,什么也不会比乱七八糟的注释更有本事搞乱一个模块,什么也不会比陈旧、提供错误信息的注释更有破坏性。工作中,我们总会听到比如:这代码什么注释都没有,完全看不懂,这是谁写的垃圾代码,一行注释都没有,但是我们好像从来没有听到谁说:这谁的代码,这么多注释,久而久之,我们都开始尽量多写注释,因为领导也这么要求,大家也都说这是对的,但是有时候我们写注释可能只是为了掩盖那糟...

2020-04-29 23:01:40 405

原创 代码整洁之道第三章:如何写好函数

如何写好一个函数,我觉得,一个好的函数的标准就是能让人一眼就能知道它是做什么的,这么做的,而不是上下不停的滑动,来找前后代码的关联1.短小函数的第一规则就是短小,第二条规则是还要更短小2.只做一件事,每个函数一个抽象层级判断函数是否只做了一件事就是看能否再拆出一个函数,该函数不仅只是单纯的重新诠释其实现。要确保函数只做一件事,函数中的语句都要在同一个抽象层级上,函数中混杂不同抽象层...

2020-04-28 23:37:57 258

原创 代码整洁之道第二章:有意义的命名

一、命名的意义命名,一个随处可见的操作,就像你有一个名字,我也有一个名字一样,看见马,你就能知道是指在草原驰骋的俊秀,看到猫,你就能想到是那个在家等你回去撸的小可爱,在项目中,从项目的创建到函数的实现,每一步都一命名为起点,我们需要给变量、函数、参数、类和封装包命名,这些名字出现在代码的每个角落,随处可见,名字就好像项目的指路牌,也是项目的第一道门面,如果整个项目始终贯穿着一个好的命名规范,就...

2020-04-27 19:24:51 217

原创 代码整洁之道第一章:简洁代码

本章主要举例说明了混乱代码的代价以及说明是简洁代码。一、混乱代码的代价书中主要通过叙述一个包含混乱代码的项目生命周期以及挣扎过程来说明我们需要为混乱代码所付出的代价,这个举例让我感觉不仅真实,而且熟悉。混乱代码走向如下:1.系统迭代由于代码的混乱,每次修改,都是牵一发而动全身,而为了完成修改任务,而不得不往上堆积更多的混乱代码,一次次迭代,混乱代码越来越多,每一次修改牵涉的混乱代码...

2020-04-27 16:11:20 262

原创 List转String错误差坑记录

项目背景项目中,需要将远程文件(多个)拉取到本地,并保存本地文件路径到数据库,供后续业务使用,路径存储分两个字段,一个存储基本路径,一个存储文件名。.采坑过程由于文件是多个,且本地文件名称使用UUID重新生成,在拉取文件的过程中,使用List暂存文件路径,在入库是,开始使用 List.toString进行转化后入库,但是发现转化后的数据存在[],后续取值后需要再次处理,与是想到直接去掉[]...

2020-02-27 14:54:08 600

原创 Invalid bound statement (not found): **** 的解决办法

出现这个错误时,按以下步骤检查一般就会解决问题:1:检查xml文件所在package名称是否和Mapper interface所在的包名一一对应;2:检查xml的namespace是否和xml文件的package名称一一对应;3:检查方法名称是否对应;特别留意空格的问题以上都为网络搜索,刚刚采坑为下一条:检查 Mapper.xml文件命名规范是否与mybatis配置文件配置的ma...

2019-12-27 09:45:48 120

原创 项目中常用到的数据库事务(mysql)

项目中常用到的数据库事务一.什么是事务正式解释一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transac...

2019-12-03 18:06:05 1605

原创 广告系统常见名称

IAB:美国互动广告局,主要行业参考标准发布者 MMA:中国无线营销联盟 曝光(Impression):是指某一网站在制定时间周期内,广告被展现的次数,对于图片类的广告而言,页面中的广告被加载就实现一次曝光,如果页面刷新一次记为新的一次曝光,对视频广告而言,视频素材首帧画面被展现即视为曝光。曝光是互联网广告监测中最常用的效果监测指标之一。 独立曝光(Unique Impression):独立...

2019-11-27 18:35:16 645

空空如也

空空如也

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

TA关注的人

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