- 博客(86)
- 资源 (1)
- 收藏
- 关注
原创 责任链模式
行为型设计模式;收到请求后,链上的每个处理者都可以对请求进行处理,或可以将请求传递给下个处理者。为什么需要责任链模式如果不直接使用责任链模式,有下面一个场景:用户在使用一个在线交易系统,目前已经有如下权限控制:只允许认证用户创建订单,管理员可以查看所有订单。在几个月的开发中,又实现了几个过滤。如防止暴力破解密码,相同的请求缓存等。问题在于,代码本就臃肿不堪,然后还不断增加新的过滤逻辑。这也就是责任链模式出...
2021-11-16 19:54:59
379
原创 Sentinel核心处理链
核心处理链如上图所示,代码如下: ProcessorSlotChain chain = new DefaultProcessorSlotChain(); chain.addLast(new NodeSelectorSlot()); chain.addLast(new ClusterBuilderSlot()); chain.addLast(new LogSlot()); chain.addLast(new StatisticSlot..
2021-11-16 19:52:14
445
原创 Sentinel简介
简介Sentinel是什么?目的保证不管依赖的其他系统如何,自己的系统都会稳定运行。Sentinel与Hystrix的对比Sentinel与Hystrix的对比 Hystrix和Sentinel的关注点不同 Hystrix的关注点在于以隔离和熔断为主的容错机制,提供fallback机制。 Sentinel在于多样化的流量控制,熔断降级,系统负载保护,实时监控和控制台 Hystrix的资源模型设计上采用了命令模式,将对外部...
2021-11-12 11:31:55
841
原创 时序数据库
时序数据库简介从时序数据库的名称可以看出时序数据库存储的是时序数据。时序数据指的是按照时间顺序存储的一连串随时间推移测量相同事物的数据点。如监控数据、程序时间流等。时序数据具有以下特点: 抵达的数据几乎总是作为新条目被记录 数据通常按照时间顺序抵达 时间是一个主坐标轴(既可以是规则的时间间隔,也可以是不规则的) 为什么需要时序数据库为什么已经有传统关系型数据库的基础上,我们还要使用时序数据库?一般都是因为传统关系型...
2021-11-12 11:19:31
3479
原创 MySql语句优化注意
MySql语句优化注意索引失效的几种情况有or时大部分情况下索引失效建议最好不要使用orselect * from a where (storeId = 13891 or parentStoreid = 13891) AND CommentType = 0只走了commentType索引复合索引需满足最左匹配原则like以%开头存在索引列的数据类型隐形转换,则用不上索引,如列类型是字符串,那么数据一定要用引号引用where子句里对索引列上有数学运算explain select
2020-10-10 15:59:16
111
原创 JAVA常用压缩算法底层原理&性能比较
压缩算法目前常用的几个压缩算法GZIP,一个压缩比高的慢速算法,压缩后的数据适合长期使用。 JDK中的java.util.zip.GZIPInputStream / GZIPOutputStream便是这个算法的实现。deflate,zip文件用的就是这一算法。与gzip的不同之处在于,你可以指定算法 的压缩级别,这样你可以在压缩时间和输出文件大小上进行平衡。可选的级别有0(不压缩),以及1(快速压缩)到9(慢速压缩)。它的实现是java.util.zip.DeflaterOutputStrea
2020-08-26 22:01:09
4531
原创 Redis底层数据结构
Redis底层数据类型Redis中有五种数据结构,但他们的底层实现都不是唯一的,所以怎样选择对应的底层数据支撑呢?这就需要“多态”的思想,但是因为redis是C开发的。所以通过结构体来模仿对象的“多态”为了完成这个任务,redis这样设计redisObject对象基于redisObject对象的类型检查基于redisObject对象的显示多态函数对redisObject进行分配、共享和销毁的机制底层数据结构简单动态字符串sdsredis的字符串表示为sds,而不是C字符串(
2020-08-18 19:04:07
140
1
原创 ES语法&官方文档链接
ES语法参考文档查询请求GET _search { "size":1, "query": { "bool": { "filter":{ "term":{ "translateId":45 } } } }}返回{ "took": 100, "timed_out": false,
2020-08-12 14:05:27
5617
原创 MySql表分区
MySql表分区表分区原理分区表是由多个相关的底层表实现,这些底层表也是由句柄对象表示,所以我们也可以直接访问各个分区,存储引擎管理分区的各个底层表和管理普通表一样(所有底层表都必须使用相同的存储引擎),分区表的索引只是在各个底层表上各自加上一个相同的索引,从存储引擎的角度来看,底层表和一个普通表没有任何不同,存储引擎也无须知道这是一个普通表还是一个分区表的一部分。select查询当查询一个分区表的时候,分区表先打开并锁住所有的底层表,优化器判断是否可以过滤部分分区,然后再调用对应的存储引擎接
2020-07-21 15:23:25
131
原创 缓存相关概念&解决方案
缓存缓存穿透(缓存击穿)定义缓存击穿就是指用户查询数据,在数据库中没有,自然在缓存汇中也不会有。这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库再查询一遍,然后返回空。这样就绕过缓存直接查数据库,这也是经常提的缓存命中率问题。解决方案布隆过滤器将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的
2020-07-15 11:30:43
159
原创 本地BitMap,通过代码了解BitMap算法
BitMap介绍BitMap就是用一个bit位来标记某个元素对应的value,而key就是该元素。举个例子,假设我们要对0-7内的5个元素(4,7,2,5,3)排序(这里假设这些元素没有重复)。那么我们就可以采用Bit-map的方法来达到排序的目的。要表示8个数,我们就只需要8个Bit(1Bytes),首先我们开辟1Byte的空间,将这些空间的所有Bit位都置为0;然后遍历这5个元素,首先第一个元素是4,那么就把4对应的位置为1(可以这样操作 p+(i/8)|(0×01<<(i%8)
2020-07-15 10:20:24
196
原创 幂等性解密
什么是幂等性一次和多次请求某一个资源对于资源本身应该具有同样的结果。就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同。f(n) = 1^n 为什么需要幂等性?用户在APP上连续点击了多次提交订单,总不能生成多个订单吧。用户因为网络卡了,连续点击发送消息,接收者总不能收到重复的同一条信息吧。用户发起一笔付款请求,就应该只扣用户一次钱常用手段数据库建立唯一性索引,可以保证最终插入数据库的只有一条数据token机制,每次接口请求前先获取一个token,然后再下次
2020-05-08 18:37:14
1720
原创 Java设计模式-原型模式
Java设计模式-原型模式原型模式是用于创建重复的对象,同时又能保证性能。这种设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。...
2019-12-24 10:12:41
124
原创 Java设计模式-策略模式
Java设计模式-策略模式介绍在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。举个例子,我们出门的时候会选择不同的出行方式,如骑车,步行,做公交等策略模式定义了一组算法,将每个算法都封装起来,并且使他们之间可以互换。实例定义一个接口Strategypublic interface Strategy { int doOperatio...
2019-12-17 11:50:20
138
原创 AtomicInteger&LongAdder
AtomicInteger&LongAdder实例public class MyAtomic { public static void main(String[] args) { AtomicInteger num = new AtomicInteger(1); new Thread(()->AtomicIncrement(num)).s...
2019-12-13 17:27:15
208
原创 Unsafe
Unsafe介绍Unsafe在sun.misc包下,不属于java标准。但是很多java的基础类库,如JUC,包括一些被广泛使用的高性能开发库都是基于Unsafe类开发的,比如Netty、Hadoop、Kafka等使用Unsafe可以直接访问系统内存资源并进行自主管理,Unsafe类在提升java运行效率,增强java语言底层操作能力方面起了很大作用。官方不建议使用Unsafe实例化...
2019-12-13 16:07:33
118
原创 BlockingQueue
BlockingQueue阻塞队列,BlockingQueue很好的解决了多线程中,如何高效安全传输数据的问题核心方法public interface BlockingQueue<E> extends Queue<E> { //将给定元素插入到队列中,如果插入成功返回true,否则返回false。如果限制了队列长度,推荐使用offer方法 boo...
2019-12-13 10:35:16
129
原创 ThreadLocal
ThreadLocalThreadLocal也叫线程本地变量、线程局部变量其作用域覆盖线程,而不是某个任务其自然的生命周期与线程的生命周期相同(但在JDK实现中比线程的生命周期更短,减少了内存泄漏的可能性)ThreadLocal代表了一种线程与任务剥离的思想,从而达到线程封闭的目的,帮助我们设计出更健康的线程安全类ThreadLocal适用于每个线程需要自己独立的实力且该...
2019-12-12 16:02:38
96
原创 线程池原理
线程池原理以ThreadPoolExecutor为例private static final ThreadPoolExecutor EXECUTOR_SERVICE = new ThreadPoolExecutor(100,120,60, TimeUnit.SECONDS, new ArrayBlockingQueue<>(1000), ...
2019-12-10 19:38:53
107
原创 ConcurrentHashmap的读操作为什么不加synchronized
ConcurrentHashmap的读操作为什么不加synchronized去看ConcurrentHashmap的putVal源码会发现在putVal内部使用了Synchronized关键词保证了线程安全但是看get源码的时候发现根本没有用synchronized关键字,那么get方法是如何保证线程安全的呢?源码如下public V get(Object key) { Nod...
2019-12-06 15:55:26
1241
原创 CountDownLatch&CyclicBarrier&Semaphore
CountDownLatch&CyclicBarrier&SemaphoreCountDownLatch和CyclicBarrier都能够实现线程之间的等待,但侧重点略微不同CountDownLatch一般用于某个线程等待若干个其他线程执行完任务之后它才执行CyclicBarrier一般用于一组线程相互等待至某个状态,然后这一组线程再同时执行而且CountDownLat...
2019-12-06 14:00:18
170
原创 Java内存模型
Java内存模型前言CPU工作过程及出现的问题CPU执行过程计算机在执行程序时,每条指令都是在CPU中执行的,而执行的时候,又免不了要和数据打交道,而计算机上面的临时数据,是存储在主存中的。(计算机内存包括高速缓存和主存)我们知道CPU执行指令的速度比从主存读取数据和向主存写入数据快很多,所以为了高效利用CPU,CPU增加了高速缓存来匹配CPU的执行速度,最终程序的执行过程如下:首...
2019-12-04 10:13:09
113
原创 使用Redis实现消息队列
使用Redis实现消息队列消息队列什么是消息队列?消息队列就是一个保存消息的容器,它具有先进先出的特性为什么会出现消息队列?异步:场景的B/S架构下,客户端向服务器发送请求,但是服务器处理这个消息需要花费很长的时间,如果客户端一直等到服务器处理完消息,会造成客户端的系统资源浪费;而使用消息队列后,服务器直接将消息推送到消息队列中,由专门的处理消息程序处理消息,这样客户端就不必花费大...
2019-12-03 15:41:48
176
原创 锁消除和锁粗化
锁消除和锁粗化锁消除和锁粗化是虚拟机对低效的锁操作而进行的一个优化。锁消除简单来说,锁消除就是虚拟机根据一个对象是否真正存在同步情况,若不存在同步情况,则对该对象的访问无需经过加锁解锁的操作。(比如说程序员使用了StringBuffer的append方法,因为append方法需要判断对象是否被占用,而如果代码不存在锁的竞争,那么这部分的性能消耗是无意义的。于是虚拟机在即时编译的时候就...
2019-12-03 11:18:41
2707
原创 synchronized&volatile&synchronized原理
synchronized&volatile&synchronized原理Synchronized&volatileSynchronized本质上是解决对共享变量的访问顺序问题。多线程环境下,方法内的变量是线程安全的。多个线程同时处理一个实例,这个实例内的变量是不安全的。多个线程注入同一个类的不同实例,实例中的变量是安全的。Synchroniz...
2019-12-02 14:16:19
220
原创 深入理解JVM-3
深入理解JVM-3这部分说下执行完类加载机制后的JVM的五个区域程序计数器、虚拟机栈、本地方法栈三个区域随线程而生,随线程而死。Java堆和方法区不一样,只有在程序运行期间才知道会创建哪些对象,这部分内存的分配和回收都是动态的。内存回收判断对象是否存活的算法引用计数法:给对象添加一个引用计数器,每当有一个地方引用时,引用计数器加1,当引用失效时,引用计数器减1,任何时刻引用计数...
2019-11-27 14:06:26
129
原创 深入理解JVM-4
对象访问在Java语言中,对象访问是如何进行的?对象访问在Java语言中无处不在,是最普通的程序行为,但即使是最简单的访问,也会涉及Java栈、Java堆、方法区这三个最重要的内存区域之间的联系,如:Object obj = new Object();假设这句代码出现在方法体中,那“Object obj”这部分的语义将会反映到Java栈 的本地变量表中,作为一个reference类...
2019-11-26 14:47:47
148
原创 程序员吃的是青春饭?本质上取决于。。。
程序员吃的是青春饭?本质上取决于。。。你是否认真思考过————毕业3-5年、10年,乃至更久后,我们希望成为什么样的人呢?作为一名技术人,我们要如何规划自己的职业发展生涯?网上热议的“35 岁中年危机”,本质上又因什么而焦虑?今天,阿里资深技术专家毗卢,将带来自己的思考与理解,希望对大家有所启发。毗卢:近期,我与团队同学探讨了职业发展规划的问题。有些同学表示希望后续能进一步在技术领...
2019-11-25 15:45:04
188
原创 如何在阿里技术面试中脱颖而出?
如何在阿里技术面试中脱颖而出?宗心招聘的目的当今社会,技术已经成为影响商业成功的关键因素,工程师成为了这些公司最宝贵的财富,没有优秀的人组成团队来完成商业目标,公司根本不可能有今天的成就。所以招聘,就是选择最优秀的人。招什么样的人?招优秀的人显然是一个很模糊的概念,我们来度量的时候,个人认为三个因素是最关键的:技能工作项目经验,以及解决疑难问题的能力,毕竟招来的人首...
2019-11-22 17:22:04
138
原创 如何在工作中快速成长?致工程师的10个简单技巧
如何在工作中快速成长?致工程师的10个简单技巧文章很长,但是系统性也很强,干货满满,向前辈致敬!阿里经典的土话:“今天的最好表现,是明天的最低要求。”如何挖掘潜能、发现更好的自己?下面是阿里高级无线开发专家江建明总结出来的认知升级的方法一、如何阅读本文?找一个固定不被打扰时间仔细阅读在碎片化的时间中,每次读完一段内容最重要的是每次做到只字不差的阅读,然后停下,带着批判性思...
2019-11-21 17:22:28
246
原创 中台
中台中台迷思到处都在喊中台,到处都是中台,中台这个词在我看来已经被滥用了。在有些人眼里:中台就是技术平台在有些人眼里:中台就是微服务业务平台在有些人眼里:中台应该是组织的事情提出问题:企业为什么要平台化?企业为什么要建中台?背景传统的前台-后台架构中,各个项目相对独立,许多项目都在重复发明同样的轮子,即让项目本身越来越臃肿,也让开发效率越来越低。...
2019-11-20 16:49:12
542
原创 如何快速成为技术大牛?
如何快速成为技术大牛?作者:阿里资深无线开发专家李运华天天写业务代码的程序员,怎么成为技术大牛,开始写技术代码?几个典型的误区拜大牛为师有人认为想成为技术大牛最简单直接、快速有效的方式是“拜团队技术大牛为师”,让他们平时给你开小灶,给你分配一些有难度的任务作者表示反对,有以下原因:大牛很忙,不太可能单独给你开小灶,更不可能每天都给你开1个小时的小灶;而且一个团队...
2019-11-20 16:01:11
436
原创 优秀工程师必备的一项技能,你解锁了吗?
优秀工程师必备的一项技能,你解锁了吗?摘自阿里工程师的自我修养很多程序员在工作一段时间后会遇到迷茫期,虽有技术榜身,也难免会产生焦虑,反复思考怎么才能快速成长。关于如何提高自己的思考力,运用思考的力量推动能力提升,以此实现技术成长。引言如果你有下面问题,那么这篇文章值得你仔细往下看了:你自认为付出了跟别人同样的努力,但是你的成长确实更慢一些,比如学得比别人慢,排查问题比别人慢,...
2019-11-15 15:51:30
256
原创 输入的是垃圾,输出的只能是垃圾,无论多努力
输入的是垃圾,输出的只能是垃圾,无论多努力有位老师经常拿计算机的操作系统类比我们的大脑,他曾说到一个很好玩的计算机术语:缩写是GIGO,全句是 Garbage In,Garbage Out这个术语其实说明了一个非常关键的问题,对于所有人来说,这也许是一生中最重要的问题:如何把关自己的输入质量?正如很多人不会说话的根源在于他们根本没学会听一样,很多人决策质量差的根本原因...
2019-11-14 14:00:18
839
原创 优秀工程师必备的三大思维,你拥有哪些?
优秀工程师必备的三大思维,你拥有哪些?摘自阿里工程师的自我修养不同岗位、不同职责的技术人对工程师思维的深度要求是不一样的,但从多维度去思考却应是每个技术人都应该具备的素养。至简:坚信和倡导软件设计是软件质量之根本,并对软件开发的复杂性本质有着深刻的认识,对如何高质高效实施开发有着自己独到的见解和方法专人专岗的协作模式在进一步改善团队的协作效能时所面临的最大挑战在于”岗位墙“...
2019-11-14 09:56:57
327
原创 技术人具备”结构化思维“意味着什么?
技术人具备”结构化思维“意味着什么?摘自阿里工程师的自我修养什么是结构化思维?结构化思维的定义就是:逻辑+套路表达要有逻辑所谓逻辑是指我们的结构之间必须是有逻辑关系的想让内容有逻辑关系,我们要学会四种组织思想的逻辑关系演绎顺序:“大前提、小前提、结论”。比如,经典三段论:所有人都要死,苏格拉底是人,苏格拉底要死时间顺序:首先,然后,再者等,很多的时间顺序也是因果顺...
2019-11-13 13:30:45
280
原创 SpringBoot
SpringBoot本质上来说,SpringBoot就是Spring,只是它做了那些没有它你也会去做的Spring Bean配置。它使用“习惯优于配置”(项目中存在大量的配置,此外还内置了一个习惯性的配置,让你无需手动进行配置)的理念让你的项目快速运行起来。使用SpringBoot你可以不用或者只需要很少的Spring配置SpringBoot核心自动配置:针对很多Spring应用程序常...
2019-11-12 16:37:06
237
原创 FastDFS
FastDFS简介FastDFS是一个开源的分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。应用场景适合以文件为载体的在线服务,如相册网站、视频网站等FastDFS角色跟踪器和存储节点跟踪器主要做调度工作,在访问上起负载均衡的作用存储节点存储工作,完成文件管理的所有功能FastDFS架...
2019-11-06 09:37:52
110
原创 Nginx
Nginx简介Nginx是一个网页服务器,它能反向代理HTTP、HTTPS、SMTP、POP3、IMAP的协议链接,以及一个负载均衡器和一个HTTP缓存。作为HTTP服务软件的后起之秀,Nginx与它的老大哥Apache相比有很多改进之处。比如:在性能上,Nginx占用的系统资源更少,能支持更多的并发连接(特别是静态小文件场景),达到更高的访问效率在功能上Nginx不但是一个优秀的W...
2019-11-04 15:12:21
98
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人