- 博客(240)
- 资源 (8)
- 收藏
- 关注
原创 算法分析中递推式的一般代数解法
算法分析中经常遇到需要求解递推式的情况,即将递推式改写为等价的封闭形式。例如汉诺塔问题的时间复杂度递推形式为,可以解出封闭形式为(设初始状态)。因为递推式求解的重要性,许多算法书籍对其有专门介绍。Donald Knuth在Concrete Mathematics一书中多个章节都涉及递推式求解方法。算法导论也在第四章中专门论述的这个主题。在这些相关论述中,主要介绍了一些启发式方法,这些方法往往需要一些特殊的技巧和灵感才能完成。
2024-03-28 09:34:21 340
原创 SAML2.0详解,助力企业级SSO
在国内,提到认证授权、单点登录(SSO),第一时间想到的大多是OAuth 2.0。OAuth 2.0 是一个开放标准,在国内的技术社区中得到了广泛的支持和推广,许多互联网公司以及开发者积极采用。还有一点就是国内的许多场景更关注于授权而非认证,OAuth 2.0 专注于授权机制,允许用户授权第三方应用程序访问其存储在另一个服务提供者上的资源,而无需共享用户名和密码,这种机制非常适合于社交媒体、移动应用、开放平台等场景。今天我想说的是一种不一样的声音,今日的主角并不是 OAuth 2.0,而是。
2024-03-28 09:34:09 166
原创 浅谈双亲委派模型
双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。双亲委派模型的工作过程是:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成。每一个层次的类加载器都是如此。因此,所有的加载请求最终都应该传送到顶层的启动类加载器中。只有当父加载器反馈自己无法完成这个加载请求时(搜索范围中没有找到所需的类),子加载器才会尝试自己去加载。很多人对“双亲”一词很困惑。
2024-03-27 09:39:21 476
原创 String常量池和String#intern()
String是Java基础的重要考点。可问的点多,而且很多点可以横向切到其他考点,或纵向深入JVM。本文略过了String的基本内容,重点在于String#intern()。
2024-03-27 09:39:02 553
原创 数组还可以这样用!常用但不为人知的应用场景
数组在Java中是一种基本的数据结构,可以表示连续的内存空间。它可以用来存储一组相同数据类型的元素。Java中的数组可以是一维或多维的,而且数组的大小一旦确定就无法更改。本文将介绍数组的几种常用但不为人知的应用场景,包括二维数组的应用,数组的旋转、查找、去重等操作,以及在算法中使用数组等场景。并且将分析这些应用场景的优缺点,并提供相应的示例代码和测试用例。这表示创建一个3行4列的二维数组。这种方式可以直接初始化二维数组的每个元素。
2024-03-26 17:33:39 744
原创 聊聊 Java GC
在遍历GC Roots 对象树的时候,同时将标记到得对象复制到新生代小的S0/S1内存区域中,这样,当我们遍历完对象空间的时候,可以将整个新生代Eden区域内存分配的当前有效内存开始指针置为开始位置,这样,我们就操作完了对新生代对象的GC回收。从上文的对象定位可以看到,一般情况下,java对象都是在堆上分配,然后其引用指针保存在调用栈对应位置,然后在访问的时候,需要两次查找才能获取完所有的需要的对象信息,而在栈上分配对象内存的话,就避免了这个耗时。因此,在S1上,就存在不同分代年龄的对象了。
2024-03-26 17:33:21 1638
原创 HashMap实现原理
HashMap是常考点,而一般不问List的几个实现类(偏简单)。以下基于JDK1.8.0_102分析。JDK版本:oracle java 1.8.0_102。
2024-03-25 09:34:16 803
原创 「探索Java中的EnumMap:利用枚举类型优化Map实现」
在Java中,枚举类型是一种非常有用的数据类型,它可以用于定义一组固定的常量。枚举类型在很多场景中都有广泛的应用,例如状态码、命令等。在Java中,EnumMap是一种基于枚举类型的Map实现,它具有非常高的性能和可读性。在本篇文章中,我们将会介绍EnumMap的概念、使用方法和实现原理,并且会通过一些例子来展示EnumMap的使用。本篇文章主要介绍Java中的EnumMap,包括EnumMap的概念、使用方法、实现原理以及一些例子。EnumMap是一种基于枚举类型的Map实现,它具有非常高的性能和可读性。
2024-03-25 09:33:12 819
原创 从抛硬币试验看概率论的基本内容及统计方法
这篇文章以抛硬币试验为引子引出了一系列现代数学中概率的基本模型、定理及基本的估计及显著性检验方法。写这篇文章是我无聊抛硬币时一时兴起,其中对很多东西只是给出一个轮廓,没有处处给出严格的定义和证明,不过大约说明了常用的一些统计方法及其理论基础,限于篇幅不能面面俱到,例如一个假设检验如果展开写可以单独写一篇文章。目前随着大数据概念的热炒,基于互联网的数据挖掘和机器学习也变得火热,其实很多数据挖掘和机器学习都是基于概率和统计理论的,很多方法甚至只是传统统计方法的应用。
2024-03-24 11:34:45 704
原创 为什么算法渐进复杂度中对数的底数总为2
在分析各种算法时,经常看到(O(\log_2n))或(O(n\log_2n))这样的渐进复杂度。不知有没有同学困惑过,为什么算法的渐进复杂度中的对数都是以2为底?为什么没有见过(O(n\log_3n))这样的渐进复杂度?本文解释这个问题。
2024-03-24 11:34:03 282
原创 x86-64体系下一个奇怪问题的定位
从上述过程知道,最初的笔试代码,在64位环境下,浮点数参数被送入mmx寄存器,而%d告诉printf第一个参数为int类型,所以printf仍然去默认的esi中寻找第一个int参数,所以从esi中读取了一个未确定的32bit数据并按int解释,最终造成结果的不确定。所以这道题的正确答案(小端序)是,在32位下,输出为“a = 0”;在64位启用SIMD情况下,输出结果不确定。
2024-03-23 10:02:16 946
原创 一文搞懂Log4j2的同步日志打印
Log4j2诞生于2012年,是Apache推出用于对标Logback的日志框架,本篇文章将对Log4j2的同步日志打印的源码进行学习。Log4j22.17.1本篇文章主要是从使用Log4j2日志框架时,日志打印器Logger的获取,的获取以及实际一条日志的打印进行的讨论。对于日志打印器Logger的获取,我们在应用程序中,获取到的日志打印器实际就是,但是实际打印日志是由其持有的来完成,而是有一个父子层级的关系在里面,也就是说name为的日志打印器的会优先取name为com.lee和com的日志打印器的。
2024-03-23 10:00:41 586
原创 总结java研发过程中一些实用的工具/类/方法/特性
动态方案的缺陷在于大量的反射调用,性能比较差,内存占用多,不适合特别高并发的应用场景。业务常用的方式是@Slf4j带的日志,不会有上面的风险,先定义一个Logger,然后支持不同级别的输出如fine()/info()/error()等。线上机器部署多个集群的时候,流量大的时候一定能打到某个机器,访问量不多的时候,比如预发就两台机器pods,从webshell进入,这个时候请求负载均衡不确定路由到哪一台,可以两边都开着,然后监听访问,区分读还是写的请求,如果是读接口,可以多点几下,肯定有一些会路由到的。
2024-03-23 10:00:28 596
原创 FastJson序列化隐藏特性
针对训练模型控制台的web后端维护,新增了一个int类型的maxTokenLimit字段,表示调用GPT模型请求允许的TokenSize上限值。后端添加好之后,数据库里面这个字段项没有填充数值,默认是空,所以理论上当maxTokenLimit字段为空的时候,应该传输的Json内容为maxTokenLimit: null ,但是前端那边F12查看,反馈接收到后端传参里面并没有这个字段。
2024-03-22 10:35:41 716
原创 SQL中为什么不要使用1=1?
1=1”在SQL语句中可能看起来无害,但实际上它是一种不良的编程习惯,可能会导致性能下降。就像在做饭时不会无缘无故地多加调料一样,我们在编写SQL语句时也应该避免添加无意义的条件。每一行代码都应该有它存在的理由,不要让你的数据库像一个困惑的图书管理员,浪费时间在不必要的事情上。
2024-03-22 10:35:12 569
原创 Java内存模型
JVM的内存结构大概分为:堆(heap):线程共享,所有的对象实例以及数组都要在堆上分配。回收器主要管理的对象。方法区(MEATHOD AREA):线程共享,存储类信息、常量、静态变量、即时编译器编译后的代码。方法栈(JVM Stack):线程私有、存储局部变量表、操作栈、动态链接、方法出口,对象指针。本地方法栈(NATIVE METHOD STACK):线程私有。为虚拟机使用到的Native 方法服务。如Java使用c或者c++编写的接口服务时,代码在此区运行。
2024-03-21 09:32:01 905
原创 一文搞懂跳表原理及实现
跳表可以达到和红黑树一样的时间复杂度O(logN),且实现简单,Redis中的有序集合对象的底层数据结构就使用了跳表。本篇文章将对跳表的实现进行学习。跳表的时间复杂度与AVL树和红黑树相同,可以达到O(logN),但是AVL树要维持高度的平衡,红黑树要维持高度的近似平衡,这都会导致插入或者删除节点时的一些时间开销,所以跳表相较于AVL树和红黑树来说,省去了维持高度的平衡的时间开销,但是相应的也付出了更多的空间来存储多个层的节点,所以跳表是用空间换时间的数据结构。
2024-03-21 09:31:44 524
原创 Java 多线程线程池分析
关于Java多线程的知识,看了很多博客书籍,对理论还是比较了解的。但是,最近写一个很简单的使用线程池对列表中任务进行处理,然后返回结果列表的功能,发现理论和实际操作还是有相当大的差距。/*** @author: ketao Date: 14-5-3 Time: 下午4:51*/@Overridetry {});
2024-03-20 09:34:07 511
原创 Nginx模块开发入门
(Nginx本身支持多种模块,如HTTP模块、EVENT模块和MAIL模块,本文只讨论HTTP模块)Nginx本身做的工作实际很少,当它接到一个HTTP请求时,它仅仅是通过查找配置文件将此次请求映射到一个location block,而此location中所配置的各个指令则会启动不同的模块去完成工作,因此模块可以看做Nginx真正的劳动工作者。通常一个location中的指令会涉及一个handler模块和多个filter模块(当然,多个location可以复用同一个模块)。
2024-03-20 09:33:47 600
原创 体系化全面认识 Nginx !
请求爆发式增长的情况下,单个机器性能再强劲也无法满足要求了,这个时候集群的概念产生了,单个服务器解决不了的问题,可以使用多个服务器,然后将请求分发到各个服务器上,将负载分发到不同的服务器,这就是负载均衡,核心是「分摊压力」。正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。子进程通过读取共享内存的数据,来获取后端服务器的信息。
2024-03-18 10:01:20 2088
原创 条件队列大法好:使用wait、notify和notifyAll的正确姿势
条件队列的使用是并发面试中的一个好考点。猴子第一次遇到时一脸懵逼,叽里咕噜也没有答上来,现在写文章时才发现自己根本没有理解。如果本文有哪里说错了,希望您能通过简书或邮箱联系我,提前致谢。挖坑系列——以后讲一下wait、notify、notifyAll的实现机制。原文地址:条件队列大法好:使用wait、notify和notifyAll的正确姿势。
2024-03-17 00:15:33 1009
原创 条件队列大法好:wait和notify的基本语义
条件队列是我们常用的轻量级同步机制,也被称为“wait+notify”机制。但很多刚刚接触并发的朋友可能会对wait和notify的语义和配合过程感到迷惑。今天从join()方法的实现切入,重点讲解wait()方法的语义,简略提及notify()与notifyAll()的语义,最后总结二者的配合过程。本篇的知识点很浅,但牢固掌握很重要。后面会再写一篇文章,介绍wait+nofity的用法,和使用时的一些问题。
2024-03-16 21:18:21 1007
原创 如何优化慢SQL?
对于推送业务的数据存储,可能数据量会很大,如果在方案的选择上,最终选择存储在 MySQL 上,并且做 7 天等有效期的保存。MySQL5.6 之后新增的 ICP,using index condtion 就是使用了 ICP(索引下推),在存储引擎层进行数据过滤,而不是在服务层过滤,利用索引现有的数据减少回表的数据。如果要求访问的数据量很小,则优化器还是会选择辅助索引,但是当访问的数据占整个表中数据的蛮大一部分时(一般是 20% 左右),优化器会选择通过聚集索引来查找数据。在索引上,避免使用 NOT、!
2024-03-16 21:18:07 502
原创 分布式锁用 Redis 还是 Zookeeper?
Curator是一个zookeeper的开源客户端,也提供了分布式锁的实现。try {= null ) {// 获取当前所有节点排序后的集合// 获取当前节点的名称// 判断当前节点是否是最小的节点// 获取到锁} else {// 没获取到锁,对当前节点的上一个节点注册一个监听器if ( stat!= null ){= null ){break}else{wait()throw e} finally{其实curator实现分布式锁的底层原理和上面分析的是差不多的。
2024-03-15 09:41:08 708
原创 浏览器事件循环机制、宏任务和微任务
但是它们在面试中出现的频率特别高,因为熟悉这些思维训练,有利于考察我们对JS单线程、事件循环机制、宏任务和微任务等原理的掌握程度。等时间到了之后,再进入 任务队列 (Event Queue)排队(排队是因为同一时间,JS 只能执行一个任务),先进先出。在早期,异步任务中只有宏任务,没有微任务。当主线程的任务执行完毕之后,此时主线程处于空闲状态,于是会去读取 Event Queue 中的任务队列,如果有任务,则进入到主线程去执行。如果微任务队列不为空,那就优先执行微任务队列中的任务。比如:close事件。
2024-03-15 09:40:51 981
原创 mac nginx安装、启动、简单命令
Nginx 默认8080端口,访问localhost:8080,若出现欢迎界面,说明成功安装和启动。配置文件路径:/usr/local/etc/nginx/nginx.conf。这时候如果成功访问localhost:8080,说明成功安装和启动好了。安装路径:/usr/local/Cellar/nginx/1.17.0。在终端中输入ps -ef|grep nginx如果执行的结果是。服务器默认路径: /usr/local/var/www。表示已启动成功,如果不是上图结果,在终端中执行。
2024-03-14 11:40:47 330
原创 Nginx 面试经典40问
Nginx是一个 轻量级/高性能的反向代理Web服务器,用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 协议。他实现非常高效的反向代理、负载平衡,他可以处理2-3万并发连接数,官方监测能支持5万并发,现在中国使用nginx网站用户有很多,例如:新浪、网易、 腾讯等。一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。
2024-03-14 11:40:30 2162
原创 一致性哈希算法及其在分布式系统中的应用
目前一致性哈希基本成为了分布式系统组件的标准配置,例如Memcached的各种客户端都提供内置的一致性哈希支持。本文只是简要介绍了这个算法,更深入的内容可以参看论文《Consistent Hashing and Random Trees: Distributed Caching Protocols for Relieving Hot Spots on the World Wide Web》,同时提供一个C语言版本的实现供参考。一致性哈希算法及其在分布式系统中的应用。
2024-03-13 23:23:12 1043
原创 源码|使用FutureTask的正确姿势
线程池的实现核心之一是FutureTask。在提交任务时,用户实现的Callable实例task会被包装为FutureTask实例ftask;提交后任务异步执行,无需用户关心;当用户需要时,再调用FutureTask#get()获取结果——或异常。随之而来的问题是,本文讨论使用FutureTask的正确姿势。JDK版本:oracle java 1.8.0_102今天换个风格。
2024-03-13 23:22:46 688
原创 源码|并发一枝花之BlockingQueue
为了方便讲解,我调整了部分方法的顺序,还增加了注释辅助说明。阻塞方法BlockingQueue#put()和BlockingQueue#take():如果入队(或出队,下同)失败(如希望入队但队列满,下同),则等待,一直到满足入队条件,入队成功。非阻塞方法BlockingQueue#offer()和BlockingQueue#poll(),及它们的超时版本:非超时版本是瞬时动作,如果入队当前入队失败,则立刻返回失败;
2024-03-12 09:51:30 612
原创 源码|从源码分析非线程安全集合类的不安全迭代器
上面看到了非线程安全集合类的迭代器是不安全的,但在单线程的环境下,这些集合类在性能、维护难度等方面仍然具有不可替代的优势。那么该如何在兼具一定程度线程安全的前提下,更好的发挥內建集合类的优势呢?使用非线程安全的集合时(实际上对于某些“线程安全”的集合类,其迭代器也是线程不安全的),迭代过程中需要用户自觉维护,不修改该集合。应尽可能明确线程安全的需求等级,做好一致性、活跃性、性能等方面的平衡,再针对性的使用相应的集合类。
2024-03-12 09:51:12 712
原创 四层和七层负载均衡的区别
七层的负载均衡,就是在四层的基础上(没有四层是绝对不可能有七层的),再考虑应用层的特征,比如同一个Web服务器的负载均衡,除了根据VIP加80端口辨别是否需要处理的流量,还可根据七层的URL、浏览器类别、语言来决定是否要进行负载均衡。以常见的TCP为例,负载均衡设备如果要根据真正的应用层内容再选择服务器,只能先代理最终的服务器和客户端建立连接(三次握手)后,才可能接受到客户端发送的真正应用层内容的报文,然后再根据该报文中的特定字段,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。
2024-03-11 10:12:11 1062
原创 Java IO 教程
这些方法是: int read(byte[]) int read(byte[], int offset, int length) Read (byte [])方法将尝试根据数组的空间将尽可能多的字节读入作为参数给出的字节数组。请注意,尽管 InputStream 每次返回一个字节,这意味着值介于0和255之间(如果流没有更多数据,则返回 -1) ,但 Reader 每次返回一个字符,这意味着值介于0和65535之间(如果流没有更多数据,则返回 -1)。的用于读取基于字节的数据,一次读取一个字节。
2024-03-11 10:11:53 823
原创 Java并发-并发模型
可以使用不同的并发模型来实现并发系统。一并发模型指定的系统协作线程如何完成他们给予的任务。不同的并发模型以不同的方式拆分任务,线程可以以不同的方式进行通信和协作。本并发模型教程将更深入地介绍撰写本文时(2015年至2019年)使用的最受欢迎的并发模型。
2024-03-08 14:16:03 682
原创 Nginx入门到精通
Nginx是一个高性能的Web服务器,它可以处理大量的并发请求,同时还可以作为负载均衡器和反向代理服务器。在本篇博文中,我们将介绍如何从入门到精通Nginx的使用。Nginx是一个功能强大的Web服务器,它可以帮助您实现高可用性和性能。在本篇博文中,我们介绍了Nginx的基本安装和配置方法,以及如何使用它进行负载均衡和反向代理。除此之外,我们还探讨了Nginx的高级功能,如动态模块和缓存控制等。希望这篇博文能帮助您更好地了解和使用Nginx。Nginx入门到精通。
2024-03-08 14:15:41 844
原创 Service Mesh:重塑微服务市场
今天我们不谈技术,不谈架构,也不谈具体的产品,我们来聊一聊在未来一两年之内,Service Mesh技术会在微服务相关的市场带来什么样的变化?大家好,我是敖小剑,今天给大家带来的这个主题叫做 “Service Mesh:重塑微服务市场”。刚才主持人张亮提到说,过去一年Service Mesh成为一个热词。基本上,在国内的话,我差不多是Service Mesh最早的布道师。可能如果大家之前有看相关的资料的话,应该会看到一些我的资料。我先后做过几场的演讲,做过一些技术的分享,也写过很多文章。
2024-03-07 10:00:48 1093
原创 理解OAuth 2.0
在详细讲解OAuth 2.0之前,需要了解几个专用名词。它们对读懂后面的讲解,尤其是几张图,至关重要。(1) Third-party application:第三方应用程序,本文中又称"客户端"(client),即上一节例子中的"云冲印"。(2)HTTP service:HTTP服务提供商,本文中简称"服务提供商",即上一节例子中的Google。(3)Resource Owner:资源所有者,本文中又称"用户"(user)。(4)User Agent:用户代理,本文中就是指浏览器。
2024-03-07 10:00:29 600
2018美团点评技术文章-后台篇
2019-01-25
java sigar获得服务器信息
2018-05-08
大型网站分布式技术架构书(集合)
2018-04-18
TCP-IP详解 卷一、二、三 非扫描
2018-04-17
Java TCPIP Socket编程 源码
2018-04-08
大话JAVA:从零基础到数据库、WEB开发.
2018-04-04
《Java加密与解密的艺术》源码
2018-04-04
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人