自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 go-微服务的设计概括

比如我们通常会有一个BFF层用来并行调用多个微服务拿到数据进行组合,那么我们应该根据业务将BFF层拆分成多个BFF组件,否则所有接口的流量都走一个BFF容易导致宕机,也很容易因为一个地方的失误导致整个BFF不可用。针对问题一、二,简单粗暴的办法就是复制。BFF: 并行访问微服务接口组装数据返回给用户,注意的是BFF应该提供粒度较大、较通用、并且风格统一的接口,用来减小前端人员调用的复杂度。微服务中哪怕出现严重bug也只会影响自己的服务,并且上线都是逐步上线,没问题了才全部替换,能够大大提高整体的可用性。

2024-07-20 14:43:17 988

原创 shell-sed、awk、grep三剑客常用场景

作用:返回src_dir下包含字符串func main()的所有go文件的文件名,返回结果支持for循环遍历-r:表示递归-l:表示只返回文件名,不返回匹配行。

2024-07-16 17:52:32 415

原创 go-高效处理应用程序数据

大型的应用程序为了后期的排障、运营等,会将一些请求、日志、性能指标等数据保存到存储系统中。为了满足这些需求,我们需要进行数据采集,将数据高效的传输到存储系统。

2024-07-13 16:54:48 571 4

原创 go-redis 封装事件-client封装模型、批量数据处理的导出器设计

【代码】go-redis 最佳实践。

2024-07-07 00:10:01 164

原创 http包详解

go的http包是go的web编程的核心内容,go的web框架本质上都是基于http提供的组件进行再度封装。代码非常简单,就是为路由注册一个handler来处理请求并写入响应,我们来探究一下它的内部是如何实现的。

2024-06-30 12:25:58 318

原创 PFlag、Viper、Cobra-构建应用程序必备工具

PFlag和Cobra之前一直有点混淆,其实它们的逻辑关系是这样的PFlag主要用来解析命令行参数,比如 go run main.go --name zhangsan --age 15可以通过PFlag.VarString和VarInt来绑定这两个参数而cobra是提供命令的,cobra会使用PFlag为每个命令解析不同的参数用来绑定。

2024-06-19 23:57:58 408

原创 使用makefile进行项目研发的最佳实践

git提交前我们需要检查分支的名称是否符合标准,通过pre-commit githooks来完成,具体如下。

2024-06-16 12:24:14 255

原创 Makefile-快速掌握

工程中的哪些源文件需要编译,以及如何编译;需要创建哪些库文件,以及如何创建;如何最终生成我们想要的可执行文件。学习makefile,主要就是学习它的规则、语法,以及shell脚本,在makefile中会大量使用shell命令,所以shell是makefile的基础。

2024-06-15 11:57:55 576

原创 01-shell基础入门

不需要提前定义,可以直接使用的变量$$ :当前进程的 PID 进程号。:后台运行的最后一个进程的 PID 进程号。:最后一次执行的命令的返回状态,0为执行正确,非0执行失败。

2024-04-14 15:06:01 381

原创 Sharding-JDBC 分库分表入门

本项目中使用uId作为分片单键,且uId是String类型,无法进行模运算,因此我们借鉴hashmap的扰动函数来实现分片策略自定义精准分片策略,针对=和in操作,还有另外的分片策略暂时没用到@Override//订单号取模加1 与 订单表t_order_1 和 t_order_2的尾号做比对,如相等,就直接返回t_order_1 或 t_order_2。

2023-04-20 11:37:33 345 1

原创 MinIO文件上传

这些方法使我们能够得到上传文件的基本信息:fileName、bytes、contentType以及size。

2023-02-13 23:34:22 902

原创 算法刷题系列

heapInsert:当插入新元素时插入尾部并将heapsize+1,随后对最后一个元素进行向上调整。heapdify:从index位置向下调整堆,以heapsize为结束循环条件。heapsize:描述当前堆的大小,heapidify会用其做循环结束条件。快排的经典版和改版两种方式,这里不做讲解。

2023-01-05 14:15:22 336

原创 JUC07-ConcurrentHashMap

多个线程对hashmap进行扩容时需要将原有数据转移到新的table数组中,这个过程中会重新计算每个元素对应的数组下标从而改变元素的next指针,而另一个线程重复对该链表进行迁移时可能会导致循环链表的产生二、JDK8-ConcurrentHashMap额外提一句,JUC包下提供了许多并发安全的容器,它们的前缀大概有如下几种,我们来分别讨论它们的特性。包含三类关键词:Blocking、CopyOnWrite、Concurrent构造器可以看到实现了懒惰初始化,在构造方法中仅仅计算了 table

2022-12-07 15:33:38 447

原创 JUC06-读写锁ReentrantReadWriteLock

state:表示当前锁的状态,前16位为写锁标识,后16位为读锁标识,0表示无锁,state的值表示锁重入的次数Node:若当前线程获取锁失败,则会将其关联到一个新的Node节点添加到阻塞队列中写锁上锁释放读锁上锁解锁tryReleaseShareddoReleaseShared:唤醒后继节点

2022-12-03 23:25:41 160

原创 JUC05-AQS、ReentrantLock原理

注意:等待队列的head指向的要么是正在运行的线程所在节点,要么是dummy结点(不含线程)简单说就是不可打断模式下,若阻塞的线程被打断会再次进入阻塞队列。非公平性具体体现在acquireQueued方法中。每个条件变量都维护了一条等待队列,如图所示。**release(AQS已实现)

2022-11-25 14:15:37 342

原创 JUC03-volatile、CAS及并发原子类

LongAdder通过使用多个cell分摊并发压力提高累加器性能,并且用@Contended注解修饰Cell对象,使其能够独占缓存行,解决了缓存行伪共享的问题。而AutomicInteger内部只用一个变量用来表示当前值,在高并发下多个线程争抢该变量性能损耗较大。

2022-11-18 15:53:23 295

原创 JUC02-多场景下的线程同步操作

在实际业务场景中,我们大概率会使用Future的方式来得到该结果,但Future必须是当t2线程执行完返回结果后才能在t1线程获取到。但我们可能会碰到t2线程业务很重,而t1线程只需要等待t2完成某一个操作时就能得到该结果继续往下执行,我们该怎么办呢?

2022-11-05 10:36:55 350

原创 JUC01-synchronized及底层优化

大家对于synchronized应该不陌生,在我们实际业务中经常需要书写同步代码块来保证线程安全性,而synchronized便是我们常用的一个加锁方式。那么问题来了,在高并发的情况下,synchronized是如何保证线程安全的呢?

2022-10-31 21:37:41 192

原创 Redis06-最佳实践

主要通过第三方工具来分析内存使用情况。

2022-10-20 20:33:14 398

原创 Redis05-附近商户、用户签到

业务类实现逻辑1. 首先根据商户类型、当前位置以及范围查询符合条件的数据2. 再根据current * pageSize过滤掉之前的数据,若查询到的数据小于需要current * pageSize则直接返回空数据3. 接收到符合条件的id后,根据id查询店铺信息,并将redis中返回的距离信息填充到pojo中。

2022-10-14 20:59:42 217

原创 Redis04-点赞、点赞排行榜

有同学可能会有疑惑,为什么关注的时候不为被关注的用户创建一个set,里面记录关注它的用户呢?博主发布笔记时将笔记存放在自己的发件箱中,粉丝打开关注列表时发送请求,从所有关注博主的发件箱中取出笔记,并按照时间顺序排序,难点在于取出笔记中实现分页。通过场景描述我们知道应该使用分页查询来查询数据,又由于涉及到时间的排序,所以使用我们熟悉的方法,用zset存储笔记id,时间作为score。因此,我们只需要将每次获取的最后一条笔记的score作为下一次的lastId,若为第一页查询,则lastId为now。

2022-10-12 11:18:31 726

原创 Redis03-优惠券秒杀

该方法的思路:一个long类型有8个字节,用四个字节(32位)存放时间信息(136.102208 年),四个字节存放这一天的订单数量。那么这种方法从项目开始计时,能够正确运行2^32 秒,每天最多能生成2^32个id。其实我们也可以只用16位来存储当前count,剩下48位来存放时间信息,如果一天内达不到2^32次方的订单id生成量,不如节省下来位数存储时间信息让项目运行的更久。

2022-10-08 11:16:07 1089

原创 Redis02-分布式session、缓存查询及缓存问题的解决

但不代表任何数据我们都可以通过添加缓存来提高性能,对于那些经常修改的数据,若是添加缓存反而会降低性能。再者,缓存一般占用的是内存,滥用缓存也会对内存造成浪费。在多线程并行下,更新数据库的时间都要远远大于写入缓存的时间,所以写入缓存的执行时机应该先于更新数据库。该问题主要是由于更新缓存策略不当造成的。

2022-10-04 20:53:14 1735

原创 Redis01-数据类型及常见指令

为什么可以对String进行这三种分类呢?因为String底层是用byte[]实现的,通过不同的编码方式形成不同的类型。

2022-10-02 20:31:05 526

原创 06-JVM-监控及调优案例

jstack工具主要用于捕捉JVM当前时刻的线程快照,线程快照是JVM中每条线程正在执行的方法堆栈集合。在线上情况时,生成线程快照文件可以用于定位线程出现长时间停顿的原因,如线程死锁、死循环、请求外部资源无响应等等原因导致的线程停顿。当线程出现停顿时,可以通过jstack工具生成线程快照,从快照信息中能查看到Java程序内部每条线程的调用堆栈情况,从调用堆栈信息中就可以清晰明了的看出:发生停顿的线程目前在干什么,在等待什么资源等。7. 程序中存在内存溢出问题,一直在蚕食可用内存,GC无法回收导致内存溢出。

2022-09-29 20:03:18 629

原创 05-JVM-垃圾回收器

答:不是,由于CMS是并发进行垃圾回收的,如果当内存不够时再进行垃圾回收,此时用户线程仍然再产生垃圾,很容易报错OOM,所以我们需要手动的设置一个阈值,当老年代内存达到这个阈值的时候就可以进行垃圾回收。答:原因也是因为CMS是并发进行垃圾回收的,如果使用标记压缩算法,那么会移动堆中的数据,造成用户线程无法找到对象位置。

2022-09-28 17:15:16 172

原创 04-JVM-垃圾回收

再回收之前执行finalize()方法,可以在finalize()方法中被其它存活对象引用完成"复活"提醒垃圾回收器去执行Full GC,但不会立即执行。

2022-09-23 17:54:40 341

原创 03-JVM-对象内存、执行引擎

将热点代码的机器码进行缓存,方便下次直接调用,但若一开始就使用JIT,由于缓存需要额外耗费时间和空间,速度反而要差于解释器,也会额外增加内存消耗。简单来说就是将java代码编译成字节码文件,再由执行引擎动态的将字节码转换成机器码。逐行将字节码翻译成机器码。特点:预热快,速度慢。特点:预热慢,速度快。

2022-09-23 16:18:09 297

原创 02-JVM-内存篇

一个jvm实例只存在一个堆内存,它是java内存管理的核心区域堆在jvm启动的时候被创建,空间大小也是在启动时就确定了,是jvm管理的最大一块内存空间堆大小是可以调节的它是一个物理上不连续但逻辑上联系的空间是垃圾回收的重点区域面试题Java中所有对象都在堆上吗?答:几乎是,jvm规范中写到 所有的class实例和数组都应该在运行时分配在堆上堆的结构是什么样子?堆为什么要分为新生代、老年代、持久代、新生代中为什么要分为Eden和Survivor?

2022-09-21 20:18:19 247

原创 01-JVM-类加载篇

/*** 编写findClass方法的逻辑*/@Override// 获取类的class文件字节数组} else {//直接生成class对象}}/*** 编写获取class文件并转换为字节码流的逻辑 * @param className * @return*/// 读取类文件的字节try {// 读取类文件的字节码= -1) {}}}/*** 类文件的完全路径*/}try {//创建自定义的类的加载器1。

2022-09-19 17:41:33 248

原创 JVM-记忆集、卡表、并发标记、重标记

目前的垃圾回收器,在做垃圾回收的时候首先都要进行初始标记,也就是查找GC Root节点,但是除了GC Root和GC Root引用链上的对象需要保留之外,被老年代引用的Eden中的对象也需要保留,那么问题来了,现在我们已经知道了卡表的作用以及它的工作原理,现在出现一个新的问题,那就是卡表的更新。卡表就是一个字节类型的数组,数组中的每个元素对应着一块固定大小的内存区域叫做。,卡页的大小通常设置为2的N次幂,默认是512字节。,接下来我们来说一下记忆集的实现。的实现上,这也是我们常说的卡表,...

2022-08-31 15:43:41 591

原创 IDEA-找不到工程内部的类

很多时候编写代码的时候好好的,运行时候也好好的,但是关上电脑第二天重新打开idea后就会发现红茫茫一篇,而且报的都是自己项目内部的类无法解析,这种情况可能是idea的缓存出现问题,清理一下缓存就好。

2022-08-22 10:12:10 253

原创 04-学生选课(课程记录、订单创建、微信支付)

​ 在学生选课中,需要学员通过学成在线门户网站实现,查看学生的课程购买记录、学生购买课程的下单、学生支付收费课程、分布式任务调度查询支付结果等操作。本次主要是对学成的学生群体来开发对应的功能。.........

2022-08-16 15:08:07 630

原创 03-视频点播-文件上传及媒资管理

当我们把这些文件上传到第三方服务后,我们需要将第三方服务返回的信息给我们的后端,再由后端将其写入到数据库中。

2022-08-15 11:25:13 760

原创 SpringSecurity-Oauth2 之JWT令牌详解

这两个时机的执行都是依靠JwtAccessTokenConverter来完成的注意:上面说的只是组件,JWT暴露给SpringSecurity的服务是tokenService,SpringSecurity也是通过tokenService来完成token的生成、解析以及存储的(二) 组件之间的依赖关系JWT暴露给tokenService使用的类是tokenStore,而tokenStore又依赖于accessTokenConvert和authenticationConvert完成token的生成和解析

2022-08-06 21:05:46 3605

原创 01-SpringSecurity认证、授权

springSecurity的认证流程

2022-08-02 19:06:31 866

原创 02-课程发布

若超过指定次数仍然未到达mq,触发生产者的回调函数,我们在该回调函数中将该消息记录到日志中,等待人工干预。

2022-07-27 21:15:59 519

原创 七牛云上传文件-业务逻辑以及代码讲解

使用七牛云作为第三方服务完成文件的存储,讲解七牛云如何使用以及它的业务逻辑

2022-07-13 14:16:00 1229

原创 02-SpringCloud-Nacos

一、服务分级存储Nacos分为服务 集群 实例 三个层级,一般我们会将同一个机房的服务设置成同一个集群,并且在调用时优先调用同集群的服务spring: cloud: nacos: server-addr: localhost:8848 discovery: cluster-name: HZ # 集群名称userservice: ribbon: NFLoadBalancerRuleClassName: com.alibaba.cloud.

2022-05-26 16:08:07 178

原创 01-SpringCloud-注册中心

一、SpringCloud就是分布式架构?我相信有很多同学跟我一样,在接触springcloud之前将它与微服务、分布式等价起来,以为学会它就学会了分布式,其实不然,分布式是一个非常大的概念,里面也细分了许多技术点,像redis、dubbo、注册中心、全文检索服务等等技术。SpringCloud是微服务治理方案,帮助我们整合、装配和使用各种分布式技术。微服务方案也是当前分布式架构里面的最优选择总之,SpringCloud是一种微服务的治理方案,它提供了很多类来帮助我们整合和使用各种分布式技术二、

2022-05-26 11:18:03 107

空空如也

空空如也

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

TA关注的人

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