- 博客(40)
- 资源 (4)
- 收藏
- 关注

原创 爱书爱考平台说明
后面我也会带着大家开发一套微信小程序,包括上架、运维、部署环境的搭建、相关资质的审核等一系列开发和上架的过程都会记录下来分享给大家。最近我开发了一个综合性的考试平台,内容包括但不限于职业资格证考试、成人教育、国家公务员考试等内容。目前1.0版本已经开发完成,其他的功能陆续完善中。目前维护了java相关的面试题的考题和详解信息。你的关注是我最大的动力。
2025-01-28 10:16:31
716
2
原创 3 申请微信小程序和微信公众号
如果已经有小程序,点击扫码登录自己需要登录的小程序即可。如果没有注册过,点击下方的三个选项选择你要做的帐号类型。我们找的标有官网的标题点击进去。注册成功后绑定微信,以后扫码登录即可。
2025-02-07 15:19:27
286
原创 2 注册公司并准备相关材料
点击进入给我们的域名填写备案信息并提交阿里云审核,阿里云审核通过后会给你打电话确认信息,然后提交到当地的备案管局审核。我们可以到阿里云的官网上选择购买域名,用户首次购买域名1年只要1元,后面费用会增加。我的域名是aishu.icu首年费用是1元,后续一年的费用是63元。我注册公司的时候没有自己去跑,找的代注册公司帮注册的几百块钱。说说注册公司需要准备的材料,如果找注册公司代办,代办人员会和你讲清楚。先属于自己想要的域名,点击查询,选好要购买的域名。我们在这个页面可以管理我们的域名,配置映射的ip信息等。
2025-02-05 14:40:19
831
原创 1 项目概述
先带着大家做一个无限极返佣的系统和一些赚外快的小项目和一些游戏脚本(主要是按键精灵和C++开发)还有一些爬虫项目,这些项目都是能够给大家带来收益的,创作不易,这些项目可能都要收费才能看。然后做一个基于分布式的通用功能,方便以后快速开发项目。项目篇带着大家一起做项目,其中涉及到产品设计,架构设计和前段后端的开发工作。带着大家一起把项目做起来。开始我们做几个小项目,基本涉及不到架构设计。后面再做涉及到我们前面讲到的架构设计的相关知识,把能用到的技术大体上用一遍。后期还会分享一些我赚外快的一些项目。
2025-02-03 14:00:40
377
1
原创 19 压测和常用的接口优化方案
压测的测试报告主要有以下几个方面:1.响应时间 2.不同的线程压测的错误率,也叫失败率3.吞吐率(TPS)4压测情况下服务器的其他性能指标。如:网络层、代理(nginx)、CPU、缓存中间件的指标等。这些需要看具体的项目需求。专业的测试使用loadrunner测试的结果非常全面,也可以根据具体的业务写脚本测试。一般的排查资源释放问题,一些性能指标使用jmeter即可。高并发的平台应用,项目上线前离不开一个重要步骤就是压测,压测对于编码中的资源是否问题的排查,性能的调优都是离不开的。
2025-01-31 22:28:40
544
原创 18 大量数据的异步查询方案
我们知道在数据库中的模糊查询需要全盘扫描,找的匹配的字符并返回,性能上就会比较慢,特别是数据量比较大的时候就是一个灾难。通过分词映射到实际数据的方式避免全盘扫描的问题,如果是海量数据,es的存储压力比较大,那么我们把海量数据存储在分析型数据库中即可。主流的两种hbase和clickhouse,千亿条数据查询也是很快的,但是分析型数据库对修改的操作性能非常差,我们使用的时候注意这一点就可以了。我们在java程序中查询的时候通过es的分词找的数据实体,然后需要找全量数据的时候再到分析型数据库中查询即可。
2025-01-30 14:57:21
343
原创 17 一个高并发的系统架构如何设计
我们分库还有一个原则就是一个数据库实例操作数据的瓶颈受到数据库引擎程序执行的瓶颈影响,所以在高并发的环境下,做好了垂直拆分的数据库,如果一个数据库实例承载不了并发的情况下,我们也要做水平拆分,一般会根据主键hash求模或数值型主键求模做水平拆分。我们的系统在做一些活动的时候,会产生一些瞬时的高峰流量,这些请求如果直接和数据库交互处理业务的时候会把数据库压垮。第三:高并发系统常见的需要考虑的问题,如内存不足的问题,服务抖动的问题、磁盘不足的问题、网络带宽的问题、突发流量的问题、面对黑客攻击的问题。
2025-01-27 04:28:30
1368
原创 16 分布式session和无状态的会话
如果以集群的方式部署,用户登录的session存储在该次登录的服务器节点上,如果下次访问服务端的请求落到其他节点上就需要重新生成session,这样用户需要频繁的登录。该方案缺乏容错性,如果用户请求的机器发生故障,请求就会落到其他的节点上,session就会失效。使用中间件存储session信息。当nginx使用该方式代理请求转发时,相同ip的用户请求会落到相同的机器上,这样就可以避免了频繁的登录。该方案保证了容错性,如果在用户量很大的情况下网络会成为同步的瓶颈,整个集群的性能会受到严重的影响。
2025-01-25 04:13:38
1100
原创 15 分布式锁和分布式session
当某个进程想要做唯一资源操作时,插入数据表示获得锁,并获得该资源的使用权,其他进程想要获取该资源的使用权时,发现数据库中已经有记录了,就需要等待。我们一个进程想要获取锁,在进程中生成uuid(保证唯一性即可)放入redis中,其他进程想要获得锁资源先判断本进程的uuid是否和redis中的uudi匹配,不匹配说明不能进行资源的操作。会话超时:如果一个子节点的会话超时了,因为创建的是临时节点,因此对应的临时节点也会被删除,这样避免了死锁的出现。永久节点不会因为会话的结束而消失,临时节点随着会话的结束而结束。
2025-01-23 15:27:29
1271
原创 14 常用的负载均衡算法
像我之前做过的互联网广告平台,对请求响应时间要求非常高,为了解决南北方网络延迟的问题,在不同的区域部署了不同的IDC机房,请求通过域名访问后,会判断落到哪个IP响应时间短后续该ip的请求就会落到不同IP的机房中,大大减少了网络传输带来的响应时间的开销。在访问接口的时候,由于每次请求接口的响应时间不一样,通过轮询或加权轮询的时候,每台服务器的连接数不同,负载也就不同。根据请求的ip进行hash算法分发到不同的服务器,相同ip的请求转发到相同的服务器,这种适合保持会话,适用于服务器保持会话的场景。
2025-01-21 09:04:39
925
原创 13 CAP理论和base理论
我们试想一下:假如A和B节点的网络通信中断了,在满足分区容错性的前提下,如果要保持AA和BB库的数据一致,那么就需要等待A和B节点的通信恢复,如果满足可用性,那么在A和B通信不可用的情况下,就会返回不一致的数据。CAP只能满足其中两个。有了网络分区的分区容错性之后§的前提条件下,我们选择强一致性或可用性对外提供服务,如果一致性和可用性都要满足的情况下,就只能返回错误的提示信息给到用户。一个系统提供的服务必须一直处于可用的状态,每次请求都能够获取到非错误的响应(不保证获取的数据为最新的数据)
2025-01-20 12:59:21
493
原创 12 分布式事务
我们拿mysql数据库来说,当数据库为单体数据库的时候,我们打开事务,执行sql为预执行阶段,最后commit时通过日志控制最终全部提交后存储到磁盘中,如果commit失败,可以通过日志控制回滚回来,但是当我们的数据库实例为多个的时候,不同的数据源,我们的日志已经无法控制落入磁盘的数据正常的回滚。事务的管理者协调事务的参与者,询问是否能够执行分布式事务的操作,各个事务的参与者在收到管理者消息时,锁定相关的资源,并应答管理着已经准备好了可以提交。如果有参与者返回不能提交事务则下达回滚的指令。
2025-01-19 09:20:39
1299
原创 11 RPC框架的主要实现原理
A机器的进程需要调用B机器上的服务,首先A机器的进程需要到注册中心找到B机器的IP地址和端口号信息,注册中心提供提供一个可靠的寻址方式。随着互联网的发展和互联网用户的不断增加,之前的单体应用在增加部署节点的带来的收益越来越小,这个时候我们把整体的应用架构拆分成多个应用,以提升程序运行的效率。服务的调用方,发起远程方法调用,把调用的参数信息序列化,再从注册中心拿到服务的提供者的地址,把调用转换成方法发起通信,在java服务于大多数企业家应用的时候,单体的应用架构成为主流,将所有业务部署在一起减少部署的成本。
2025-01-18 07:44:54
610
原创 10 为什么系统需要引入分布式、微服务架构
随着业务复杂度的提高,我们如果还是把程序维护在一个项目里面,不管是实体类的增加,JVM类加载的问题,性能的问题,项目复杂度的问题,这个时候需要我们对项目的复杂度进行拆解,也就是我们技术中说到的垂直拆分,随着我们在对整个系统进行拆分的时候遇到实际部署中遇到的一些问题,我们总结出DDD领域建模的方法论。随着应用的业务功能的扩展,团队也需要不断的扩张,各种复杂的业务会交织在一起,造成项目的臃肿,维护起来会越来越麻烦,最后修复功能的时候牵一发而动全身,系统很难维护。在微服务的架构中,每个服务独立负责自己的业务。
2025-01-16 06:41:57
1084
原创 9分布式微服务架构
然后我们在部署在不同机器的ip通过keepalive做出来一个虚拟的ip,当一台机器由于网络原因或者机器的原因不可达时,我们的keeplive写入数据库的时候会把虚拟的ip切到另外一台数据中执行。我们知道bonlog在同步的时候是有延时的,当切到另外一台机器时,上一台机器的binlog还未同步过来,我们往数据库中插入一条自增主键的数据时候,我们生成的id就会重复,这个时候就会造成很严重的问题。判断中心化和去中心化区分的关键点是分布式系统中的管理节点是由管理节点控制的还是由集群中的节点选举控制的。
2025-01-14 11:24:42
778
原创 8 如何设计一个高并发系统
我们知道一个数据库的进程也是由数据库的引擎程序去执行我们的sql语句操作的,也就是说当我们对数据库的操作过于频繁的时候(并发高的情况下),执行引擎也是处理不过来的,这个时候我们就要考虑分库的问题,如果只是数据库比较大但是操作并不频繁,这个时候引擎程序是能够处理的,但是由于需要从磁盘找数据,这个是比较耗时的动作,这个时候我们需要考虑分表的问题。还有我们做架构的整个一个逻辑体系和方法论的建立也不是一朝一夕的事情,不但需要我们不断的去学习,而且还有有强大的总结能力,提炼方法论的能力。主要关注下面的几个点。
2025-01-12 20:48:08
430
原创 7 分布式定时任务调度框架
我们在大型的复杂的系统下,会有大量的跑批,定时任务的功能,如果在独立的子项目中单独去处理这些任务,随着业务的复杂度的提高,大量的任务将很难进行统一的管理,出现bug以后问题也很难排查,最后将成为一种灾难。当执行器以集群方式部署的情况下,调度任务的策略选择"分片广播"的情况下,一次调度任务会以广播的形势触发集群中所有的执行器,同时传递分片参数,可以根据分片参数开发分片任务。4.源码也有很多值得学习的地方,虽然刚发布的时候会有很多资深的程序员诟病,但经过多年的发展维护,已经非常稳定。
2025-01-10 12:33:42
2746
1
原创 6 分布式限流框架
我们在固定窗口计数器的基础上对每一个时间窗口再进行时间上的切分,比如我们是按照1分钟100次请求的限制进行限流的,我们再将1分钟切成6份,就是10秒一个时间窗口,在每个细分的时间窗口中记录请求数量,时间从前一分钟的开始到前一分钟的结束为止,到了前一分钟的前10秒,我们的时间窗口从前一分钟的前10秒到下一分钟的前10秒结束。令牌桶算法的概念如下: 我们以固定的速率,生成令牌并放入桶中,如果令牌桶满了,生成的令牌将被丢弃。服务变为分布式的部署的情况下,我们只对单个节点进行限流的时候,其他节点并未得到限流。
2025-01-09 11:04:14
867
原创 5 分布式ID
比如我们一个应用实例不会在1毫秒生成4096个数值,我们可以把时间戳的值改成35位,把6个bit均分到机器id和服务id上,也就是说我们可以部署256*256=65536个实例。标识位为10位,由5位的机器id和5位的服务id组成。如果我们考虑以上问题可以在我们的程序中保留最近一次的生成时间,并拿来做校验,就可解决这个问题。一个用户体量比较大的分布式系统必然伴随着分表分库,分机房部署,单体的部署方式肯定是承载不了这么大的体量。从上图我们可以看出来雪花算法是64bit位的long类型的数值型的id。
2025-01-07 09:03:04
1072
原创 4 JAVA CAS
在上述代码中,我们设置一个账户余额有10000元,然后设置1000个线程,每个线程转出10元,正确结果这里应该是0,AccountCas类中,我们定义了一个AtomicInteger对象,CAS的底层操作就是如withdraw函数中所示,获取到当前的值和将要修改的值,然后做一个比较并设置的操作,将Account对象的最新值和当前线程拿到的当前值做对比,如果相等,则返回true,是没有问题的,如果不相等,那么获取当前值,在while(true)中再次执行一次流程。所以达到了我们预期的效果。
2025-01-03 08:41:53
2131
原创 3 抢红包系统
计算好这些,我们还要考虑代理服务器能不能承载的问题,代理服务器的多活问题(一般nginx+keepalive),如果是独立的机房部署用LVS(四层代理,通过修改局域网的协议包,实现转发,性能更好)是不是更好的选择,如果公司不差钱,用H5(银行喜欢用这个)是不是也可以,这些就涉及到技术选型的问题了.如果这个不能保障的时候,是不是需要在外面还套一层DNS轮询。如果我们能把这些做好,做技术选型的时候,即时我们对相关的技术没有深入的了解也可以通过查阅资料去了解。我们上面说的第一点,用户打开抢红包软件的时候。
2025-01-02 08:53:55
838
原创 2 秒杀系统架构
我们知道秒杀活动是需要商家参与的,当商家加入秒杀活动的时候,我们在秒杀服务建立和正常业务同样的库表结构,商家参与秒杀的商品数量等信息同步到秒杀系统的库中,这样可以做到完全的物理隔离,即时秒杀系统崩了,其他的业务也能正常运行。而且还有个问题,我们其实并卖不到那么多的商品,只是做一个商品促销的噱头吸引用户到我们的平台来,让他们知道我们的平台并记下我们的平台。例如我们用不加锁的缓存下商品数量,当涌入的人数超过一定数量的时候比如超过商品库存的时候,或者商品库存N倍的时候,后面的请求就不会再进入到后面的处理逻辑。
2024-12-31 09:32:38
1071
原创 1 架构设计概述
我们首先有胆量去拆这台机器,但是要心细的去对待,我们在拆下第一颗螺丝的时候,就要记得把这个螺丝还能拧上。假如我们在拆这台机器的时候,啥都不管直接拆个稀碎,然后也不记得怎么装起来的,忙活了很久也装不好,最后不得不放弃,最终以失败告终。我们应该把这台机器拆了,然后反复研究每个零部件的作用和零部件之间的作用,就是我们说的胆大。我们在胆大的同时也要心细。当再次去面对问题的怎么形成一个解决问题的有效的方法论。上面的方式是自主学习的能力,我们很多非计算机专业的来到it行业就需要这样的的自顶向下的学习方法去提升自己。
2024-12-30 10:16:30
737
2
原创 2 海量数据去重的问题
其实很简单,假如我们有4个数要去重,我们申请一个4个bit位的数组,如下图所示:假如放置1和4这两位整数,那么就把1和4这个位置的bit位置为1.我们需要拿出来不重复的数 只要拿bit位为1的的位置就是我们需要的不重复的数。同理40亿个QQ号我们就搞一个40亿个bit位的bitmap.遍历这个bitmap就能拿出来所有不重复的qq号我们使用的内存空间=4000000000*1/8/1024/1024=476M 够用了bitmap算法的优势在于它可以非常高效地进行集合运算。
2024-12-27 08:27:57
792
原创 1: 处理大量URL的问题或大文件的问题
然后根据不同的hash值把这些去重的url分配到不同的机器上去做去重的操作。但是第一我们的机器内存受限于4G.先不关注内存能不能放得下的问题假如是100亿、1000亿条呢。第二步:把得到a、b文件中得到相同hash值的分配到同一台机器上,这样有重复的url肯定是分配到同一台机器上的。第三步:把每台机器的a、b文件的内容放到不同的hashset上。第一步:顺序读取文件,并对每个词做hash,我们计算好1M内存的限制看需要分多少份。当我们在面试中遇到大文件,大数据量的问题,基本上都是分而治之的思路去解决的。
2024-12-26 08:37:58
392
原创 4 Files,反射与动态代理
代理类在程序运行时创建的代理方式被成为 动态代理。也就是说,这种情况下,代理类并不是在Java代码中定义的,而是在运行时根据我们在Java代码中的“指示”动态生成的。相比于静态代理, 动态代理的优势在于可以很方便的对代理类的函数进行统一的处理,而不用修改每个代理类的函数jdk的动态代理是通过java内部的反射机制实现的。return "张三";// 目标对象// 通过构造方法传入目标对象try{//添加打印日志的功能//开始添加用户//添加用户成功。
2024-12-23 08:39:09
1035
原创 3 JDK 常见的包和BIO,NIO,AIO
NIO (New I/O):NIO是一种同步非阻塞的I/O模型,在Java 1.4 中引入了NIO框架,对应 java.nio包,提供了 Channel , Selector,Buffer等抽象。非阻塞模式正好与之相反。AIO 是异步IO的缩写,虽然 NIO 在网络操作中,提供了非阻塞的方法,但是 NIO 的 IO 行为还是同步的。在活动连接数不是特别高(小于单机1000)的情况下,这种模型是比较不错的,可以让每一个连接专注于自己的 I/O 并且编程模型简单,也不用过多考虑系统的过载、限流等问题。
2024-12-20 11:16:01
2032
原创 2 面向对象
我们知道在C语言中,从main函数开始,我们根据我们需求的逻辑往下面写代码,在编码的过程中可能会需要一些函数,我们会编写函数的逻辑,然后在主线程中调用。后续还会用到的时候也会继续调用该函数。但是只是对函数的封装。我们在编写JAVA代码的时候会以类的形式出现,需要用到类的方法的时候我们会new一个对象,然后调用对象的方法。方法是一个对象的方法,遵循高内聚低耦合的要求。我们称这样一个过程叫面向对象编程。那么我们可以这样解释面向对象:可以将某个事物抽象出来,赋予它自己的特征,并且可以针对这个事物进行相应的操作
2024-12-19 08:19:24
953
1
原创 1 JVM JDK JRE之间的区别以及使用字节码的好处
java源代码编译成的class文件,正常的处理器识别不了class文件,只有JVM可识别class文件。class文件就是字节码文件。
2024-12-18 08:35:53
1033
原创 10 JVM内置锁
我们先想明白一个问题,什么是锁?我们去给自己家锁门的时候,只有对应的一把钥匙能开锁。当用钥匙去开锁的时候,锁孔的内置型号会验证钥匙能不能对的上。能对上就能把锁打开,然后进到家里使用家里的资源。否则就在外面等着。
2024-12-17 09:14:16
1175
2
原创 9 OOM和JVM退出。OOM后JVM一定会退出吗?
在我们在main函数内部启动的线程发生OOM的时候该线程退出,线程池OOM线程池创建的线程结束。要主线程无关,并且JVM不会退出什么时候OOMJVM会退出呢?1:所有的非守护线程由于申请不到内存而OOM,所有非守护线程退出,JVM退出,这个属于主动退出OOM的发生表示了此刻JVM堆内存告罄,不能分配出更多的资源,或者GC回收效率不可观。一个线程的OOM,在一定程度的并发下,若此时其他线程(含非守护线程)也需要申请堆内存,那么其他线程也会因为申请不到内存而OOM,甚至连锁反应导致整个JVM的退出。
2024-12-16 08:36:04
946
原创 8 即时编译
我们先了解java编译相关的几个概念java编译器(javac)把源文件(.java)编译成java字节码(.class)文件的步骤叫前端编译在JVM加载class文件的字节码后,每次执行方法调用的时候,JVM会把字节码翻译成机器码,然后CPU再执行机器码,这个过程叫解释执行。解释执行为了提升启动效率,并没有在启动时将字节码全部翻译成机器码,所以启动效率较高。但是在执行过程中,字节码不能被执行,要翻译成机器码才能执行,所以执行效率会比较低。编译执行和解释执行相反,JVM在加载字节码的时候直接翻译成机器码
2024-12-15 09:11:52
615
原创 7 逃逸分析
通过逃逸分析确定该对象不会被外部访问后,JVM判断对象是否可以被进一步分解,如果对象可以打散为 变量,则 JVM不会创建该对象,而是化整为零, 将该对象成员变量分解若干个被这个方法使用的成员变量,所以,JIT总的目标是发现热点代码, 热点代码变成了提升性能的关键,hotspot JVM的名字,也就是这么来的,把识别热点代码,写在名字上,作为毕生的追求。一个对象可能不需要作为一个连续的存储空间,也能被访问到,那么对象的部分可以不存储的在连续的内存,而是存可以打散存储,甚至部分存储或者打散在CPU寄存器中。
2024-12-13 08:40:04
1267
原创 6 JVM调优
下一次GC时在本次的基础上,再选定一定的区域来进行回收。8 -XX:MaxTenuringThreshold=0:设置垃圾最大年龄.如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代. 对于年老代比较多的应用,可以提高效率.如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活 时间,增加在年轻代即被回收的概论.除了单线程的GC,其他的垃圾收集器,比如 PS,CMS, G1等新的垃圾收集器都使用了多个线程来并行执行GC工作。
2024-12-12 08:46:10
1190
原创 5.2 JVM常见问题及面试题
我们平时new了一个对象就是强引用,例如 Object obj = new Object();即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象。Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java虚拟机让这个变为可能,因为它知道底层硬件平台的 指令长度和其他特性。6 JVM调优。
2024-12-11 08:41:33
879
原创 5.1 JVM常见问题及面试题
执行引擎是 java 虚拟机的最核心组件之一,它负责执行虚拟机的字节码,有即时编译和解释执行,通常采用解释执行方式。解释执行是指解释器通过每次解释并执行一小段代码来完成.class程序的所有操作。即时编译则是将.class文件翻译成机器码在执行(比如:经常多次访问的代码可以全部编译)垃圾回收系统是 java 虚拟机的重要组成部分,垃圾回收器可以对 栈 堆进行回收。其中, java 堆是垃圾收集器的工作重点。
2024-12-10 13:44:46
1055
原创 3 JVM怎么知道哪些对象需要gc
前面我们讲了JVM的堆内存的管理方式,虽然没有把整体的细节讲完。但是也介绍了参考书籍,有兴趣的朋友可以参看源码。我们知道了jvm管理内存,那么JVM怎么知道哪个对象需要释放的呢?
2024-12-09 16:04:10
978
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人