自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 一键提交代码,实现自动化更新和部署个人博客网站!

完成以上所以配置,就可以轻松实现一键提交代码自动部署了。

2025-02-17 00:23:11 330

原创 Java对象复制别再用BeanUtils了,MapStruct更快更高效!

大家好,我是小义,今天来讲一讲MapStruct。我们在写项目的过程中,分层式结构很常见,像表示层controller、业务逻辑层service、数据访问层dao等。分层架构是软件工程中的一个基本原则,它帮助开发者构建更加灵活、可维护和可扩展的系统,甚至有人说:"计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决,如果不行,那就加两层。

2025-02-17 00:20:53 555

原创 开年第一个Bug,竟然是Java反射引起的,不会用就不要用啊喂!

在 Spring 中,给方法加上@Transactional注解后,通过 Spring 内部的 AOP 机制、对注解的解析以及代理对象的创建等一系列操作,就能使得该方法被 Spring 进行事务增强,从而方便地实现事务管理功能,保障了数据操作在事务控制下的一致性和完整性。细心的小伙伴可能发现了,HarmonyService和其他的继承了BeanService的Bean不同,它在处理业务代码时用到了事务,所以需要在方法上加上@Transactional事务注解。大家好,我是小义,我又来写技术文章了。

2025-02-16 19:49:57 244

原创 太强了!DeepSeek本地部署+联网搜索,从此告别服务器繁忙!

DeepSeek实在太火爆了,相信大家都感受到了强烈的推背感,一个人可以走得很快,但一群人,可以走得更远。欢迎关注小义工粽号【程序员小义】,AI时代,一起扬帆起航!

2025-02-16 19:46:16 682

原创 MapStruct拷贝工具秒杀BeanUtils!

大家好,我是小义,今天来讲一讲MapStruct。我们在写项目的过程中,分层式结构很常见,像表示层controller、业务逻辑层service、数据访问层dao等。分层架构是软件工程中的一个基本原则,它帮助开发者构建更加灵活、可维护和可扩展的系统,甚至有人说:"计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决,如果不行,那就加两层。

2024-08-15 00:30:26 386

原创 一不小心,弄了一个开源组件:caffeine+redis的多级缓存框架

starter组件是Spring Boot生态系统的一部分,它们帮助开发者快速搭建项目,减少配置的复杂性,并且确保依赖管理的一致性。增加自定义注解的拦截器,根据设置的缓存等级决定走本地缓存还是redis缓存,同时比较缓存的剩余过期时间是否小于阈值(preLoadTimeSecond),小于则重新刷新缓存,达到缓存预热的效果,同时减少缓存击穿的问题。首先,在spring.factories中,我们指定一下要自动装配的配置类,这样就可以将设置的包扫描路径下的相关bean部署到SpringBoot 中。

2024-08-15 00:28:50 505

原创 本地缓存Caffeine扩展

之所以选择caffeine,是因为Caffeine是为Java 8及以上版本设计的,它利用了Java 8的并发特性,提供了高性能的缓存实现,而且Caffeine采用了一种结合LRU、LFU优点的算法:W-TinyLFU,在性能上有明显的优越性,同时过期时间设置,很符合自己要实现的组件的功能要求。不能针对不同的key设置个性化的过期时间,那自然就无法查看缓存项的剩余过期时间。Guava是Google开发的Java核心库,其中的缓存模块简单易用,支持自定义缓存驱逐策略,如大小限制、时间限制等。

2024-06-27 11:44:17 303

原创 @Cacheable中key的SPEL表达式实现

Spring中的@Cacheable注解相信大家都有用过,其key属性是支持SPEL表达式的,像key="#root.args[0]"取到的就是方法第一个入参,这极大地简化了缓存key的配置。上面提到的SPEL(Spring Expression language),是Spring3.0开始引入的Spring表达式语言,可以通过程序在运行期间执行的表达式将值装配到对象的属性或构造函数中。在拦截器中获取拦截方法入参中的参数名称与参数值映射,然后通过解析spel表达式的key,获取真正存入缓存中的key值。

2024-06-27 11:42:02 515

原创 Github Pages域名托管至Cloudflare

自定义域名这里以腾讯云为例,得现在腾讯云平台购买一个域名,然后进入云解析DNS,设置域名解析。添加两条记录,第一条类型为A,主机记录为@,记录值185.199.108.153,不确定的话可以ping自己的username.github.io看一下;第二条记录类型为CNAME,主机记录为www, 记录值为username.github.io。保存之后在github的静态网站仓库里就会有一个CHAME文件,没有就新建一个,里面写上自己购买的域名。

2024-05-30 00:48:04 1282

原创 redis限流又踩坑了,真让人头大

虽然说redisTemplate的increment方法不会修改key的过期时间,但是如果线程在执行完if判断key存在进入if语句后,key这时正好过期,那么increment就会新增这个key,并且值为1,而且没有过期时间。但redis限流还需谨慎,否则一不小就踩了坑,来看看下面的例子。细心的小伙伴可能一下子就看出来了,redis的检查key命令和给value值加一命令是分开的,不能保证原子性,是会有bug的。在业务场景中,对用户进行接口限流,在一小时内只允许客户访问3000次请求,核心代码大致如下。

2024-05-30 00:43:48 275

原创 用github搭建免费的私人图床,白嫖真香

至此,私人图床的服务就已经弄好了,通过PicGo工具可以方便的实现图片上传。

2024-05-26 18:46:19 545

原创 Typora工具+图床,写博客文章,效率翻倍!

按Windows+R打开运行窗口,输入regedit打开注册表,找到Typora,然后在Typora上右键,点权限,选中Administrtors,把权限全部设置为允许。在typora随便新建个md文件,直接把图片复制粘贴,PicGo会自动将图片上传至图床,然后typora将转换后的url写入到文件中,图片正常展示,非常方便快捷。这是因为没有权限写入注册表,需要设置。点击typora界面左上角的文件,选择偏好设置,点击图像,上传服务设定为PicGo,记得提前安装好PicGo和配置图床服务。

2024-05-26 09:54:28 388

原创 完蛋了,线程池死锁,生产出bug了

因为父任务过多,一小子就把5个核心线程全部占有了,其他父任务和子任务只能到队列中等候,只有队列塞满了,才会另外起工作线程。这时候所有核心线程因为要等待子任务完成才能结束,而子任务又切好躺在队列中无法执行,所以就造成了循环依赖,也就是死锁,线程池被阻塞,无法工作了。排查了半天日志,原来是因为父子任务共用同个线程池,造成循环依赖,直接堵死了导出请求。生产环境系统excel报表导不出,挨客户投诉,内心慌得一批,赶紧查看日志,结果发现是线程池死锁,这锅真是湿手捏干面,不背也得背了。写个单元测试复现一下。

2024-01-02 20:28:20 517 1

转载 redis缓存设计规范

非字符串的bigkey,不要使用del删除,使用hscan、sscan、zscan方式渐进式删除,同时要注意防止bigkey过期时间自动删除问题(例如一个200万的zset设置1小时过期,会触发del操作,造成阻塞,而且该操作会出现在慢查询中(latency可查))默认策略是volatile-lru,即超过最大内存后,在过期键中使用lru算法进行key的剔除,保证不过期数据不被删除,但是可能会出现OOM问题。allkeys-lru:根据LRU算法删除键,不管数据有没有设置超时属性,直到腾出足够空间为止。

2023-12-27 22:45:35 243 1

原创 实现Cacheable注解

在之前的spring cache解析//...而自己设计的@CacheableTtl注解并不能支持,需要继续优化,下面开整!创建Aspect基类,提供基本的操作,原先的监听@CacheableTtl的拦截器CacheableAspect继承该基类/*** 根据指定注解方法获取拦截方法中的注解及参数值*/int i = 0;i++;// 解析上下文。

2023-11-14 08:15:00 139 1

原创 Spring Cache解析

spring cache解析

2023-11-13 08:00:00 188

原创 手写RPC框架

手敲rpc框架

2023-11-12 22:33:34 291 1

原创 Jmeter使用指南

如果线程数为 200 ,循环次数为 10 ,那么每个线程发送 10 次请求。开发过程中往往需求进行接口性能压测,这时候就需要用到jmeter,该工具体积小,上手快,并且是免安装的,使用非常方便。如果线程数为 200 ,准备时长为 10 ,那么需要 1 秒钟启动 20 个线程。下载完成后解压,双击 Jmeter 解压路径(apache-jmeter-5.4.1\bin)的 bin 下面的 jmeter.bat,出现如下界面则表示启动成功。Median:中位数,单位毫秒,也就是 50% 用户的响应时间。

2023-10-28 12:18:12 189 1

原创 一文吃透缓存的击穿、穿透和雪崩

从问题成因来看,缓存雪崩和击穿主要是因为数据不在缓存中了,而缓存穿透则是因为数据既不在缓存中,也不在数据库中。所以,缓存雪崩或击穿时,一旦数据库中的数据被再次写入到缓存后,应用又可以在缓存中快速访问数据了,数据库的压力也会相应地降低下来,而缓存穿透发生时,Redis 缓存和数据库会同时持续承受请求压力。对于缓存的击穿、雪崩、穿透,看似很平常简单的问题,重要的,不是死记硬背八股文式的答案,而是能够从系统和架构的角度,去理清设计原由和解决思路。

2023-10-24 00:06:37 343

原创 强一致性和弱一致性

弱一致性是指当一个数据被更新后,不保证任何时刻任何节点的读取操作都能得到最新的值。这种一致性可以提高系统的性能和可用性,但是也会导致数据的不确定性和不一致性。弱一致性有很多不同的形式,比如最终一致性(Eventual Consistency),它要求在没有新的更新操作发生后,所有节点最终会达到一致状态。在分布式系统中,强一致性是指当一个数据被更新后,任何时刻任何节点的读取操作都能得到最新的值。弱一致性适用于对数据实时性要求不高,或者可以容忍数据不一致的业务场景,比如社交网络、搜索引擎、缓存服务等。

2023-10-23 23:54:28 679

原创 Hystrix熔断限流

4、如果run()方法在指定的超时时间内没有返回结果,或者抛出了异常,那么Hystrix Command对象会执行fallback()方法,表示异常或超时时的备选逻辑,该结果返回给服务,并释放线程资源,同时向Hystrix Circuit Breaker对象报告失败信息。3、如果run()方法在指定的超时时间内返回了正常的结果,那么Hystrix Command对象会将该结果返回给服务,并释放线程资源,并向Hystrix Circuit Breaker对象报告成功信息。

2023-10-23 23:41:25 162

原创 Eureka注册中心

Eureka Client也可以从Eureka Server获取其他服务的信息,并根据负载均衡算法来选择合适的服务进行调用,还可以通过缓存(cache)机制来本地存储服务信息,减少对Eureka Server的依赖,提高查询效率和容错能力。Eureka Server是一个集中式的服务注册中心,它可以存储和提供服务的信息,比如服务的名称、地址、状态等。自我保护机制是eureka的一种特殊的功能,它可以让eureka在遇到网络异常或服务故障时,保护自己的数据不被误删,从而提高服务的可用性和稳定性。

2023-10-23 23:40:46 61

原创 ETCD的注册中心实现

etcd是一个分布式的键值存储,它可以用于服务的注册和发现,以及配置的共享和同步。• 服务提供者在启动时,在etcd中创建一个以服务名为路径的目录,并在该目录下创建一个以自己的地址为键的子目录或键,并设置TTL为一定时间间隔(例如30秒)。• 服务消费者在启动时,在etcd中创建一个watcher,监听服务名对应的目录,并获取该目录下所有子目录或键的数据,作为可用的服务列表。• 服务提供者在运行时,定期向etcd发送心跳请求,更新自己的子目录或键的TTL,以维持自己在etcd中的存活状态。

2023-09-14 22:02:24 808 2

空空如也

空空如也

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

TA关注的人

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