- 博客(58)
- 收藏
- 关注
原创 Prometheus与Zabbix的对比
总结:Zabbix更适合于物理机/虚拟机的监控。Prometheus更适合容器的监控,对于目前来说,大部分都是Docker或者K8s容器,如果公司所在逐渐往容器方向发展,建议还是采用Prometheus。
2024-09-23 22:54:01 1418
原创 Springboot启动过程详解
这是一个扩展功能,callRunners(context, applicationArguments) 可以在启动完成后执行自定义的run方法;有2中方式可以实现:a、实现 ApplicationRunner 接口b、实现 CommandLineRunner 接口接下来我们验证一把,为了方便代码可读性,我把这2种方式都放在同一个类里面import org。
2024-08-22 23:04:35 6105
原创 vue2和vue3的区别
1、vue2的双向数据绑定利用了es5的api object.definepropert(),而vue3中使用了es6的api proxy;2、vue3支持碎片,而vue2不支持;3、 vue2使用选项类型api,而vue3使用合成型api;4、建立数据,vue2把数据放入data属性中,而vue3使用setup()方法;5、vue3有teleport组件,vue2没有。
2024-07-27 21:27:05 6298
原创 架构设计六大原则
There should never be more than one reason for a class to change.(有且仅有一个原因可以引起类的变更)一个类只负责一件事,面向对象语言开发,类是一个基本单位,单一职责原则就是封装的粒度。
2024-07-02 22:25:48 999
原创 Spring AI使用
2024年5月30日发布了Spring AI 1.0.0 Milestone1,代表spring项目中引入包括LLM之类的AI类进入stable状态。jdk要求java 17以上体现出AI项目的未来趋势,更对企业开发环境升级提出了要求。
2024-07-02 22:11:46 722
原创 TF-IDF算法及sklearn实现
TF-IDF(term frequency-inverse doument frequency,词频-逆向文档频率)是一种用于信息检索(information retrieval)与文本挖掘(text mining)的常用加权技术。TF-IDF是一种统计方法,用以评估一字词对与一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比的增加,但同时会随着它在语料库中出现的频率成反比下降。
2024-06-01 20:54:51 1651
原创 spring事务失效的11种场景、大事务及编程式事务
在使用 @Transactional 注解声明事务时,有时我们想自定义回滚的异常,spring 也是支持的。可以通过设置rollbackFor参数,来完成这个功能。@Slf4j@Service如果在执行上面这段代码,保存和更新数据时,程序报错了,抛了 SqlException、DuplicateKeyException 等异常。而 BusinessException 是我们自定义的异常,报错的异常不属于 BusinessException,所以事务也不会回滚。
2024-06-01 20:15:38 974
原创 GraalVM介绍:云原生时代的JVM
GraalVM是 Oracle 开源的一款通用虚拟机产品,官方称之为 Universal GraalVM,是新一代的通用多语言高性能虚拟机。它可以运行多种编程语言,如Java、JavaScript、Python等,并提供了即时编译(JIT)和AOT编译(AOT)的支持。GraalVM还支持在不同语言之间互相调用,以及嵌入到其他应用程序中使用。这使得GraalVM成为一个非常强大和灵活的工具,可以满足不同应用场景的需求。
2024-05-18 09:32:44 1183
原创 Oracle基础包UTL_FILE
用于读写OS文件.使用该包访问OS文件时,必须要为OS目录建立相应的DIRECTORY对象…当用户要访问特定目录下的文件时,必须要具有读写DIRECTORY对象的权限.在使用UTL_FILE包之前,应首先建立DIRECTORY对象.
2024-05-18 09:31:56 867
原创 Redis实现UV统计
UV统计是很多电商常见的一个需求,与PV不同的是,PV是统计应用的点击量或者浏览量,UV是单个页面单个用户去重之后的访问次数。如果用redis实现该功能,PV完全可以用计数器实现,UV可能大家会想到用redis的set不断去添加,但是如果你的网站并发量非常大,你将维护以后巨大的set。这时候就要介绍一个redis专门用于该类型场景的数据结构HyperLogLog了。
2024-05-03 10:31:08 414
原创 Redis实现用户签到
我们针对签到功能完全可以通过mysql来完成,比如说以下这张表用户一次签到,就是一条记录,假如有1000万用户,平均每人每年签到次数为10次,则这张表一年的数据量为 1亿条每签到一次需要使用(8 + 8 + 1 + 1 + 3 + 1)共22 字节的内存,一个月则最多需要600多字节我们如何能够简化一点呢?其实可以考虑小时候一个挺常见的方案,就是小时候,咱们准备一张小小的卡片,你只要签到就打上一个勾,我最后判断你是否签到,其实只需要到小卡片上看一看就知道了。
2024-05-03 10:20:44 841
原创 Java处理CSV类库:OpenCSV
官网:目前最新版本4.0,更新比较频繁,4.0版本还不够成熟。支持注解(根据名称或者位置)支持自定义转换器AbstractBeanField支持跳跃行skipLine和数据过滤Filter@CsvBindByName:根据CSV输入中该字段的标题名,将一个bean字段映射到CSV文件中的一个字段, 可以控制列名,按名字列名的先后顺序好像是按照字母排序的。
2024-04-17 20:54:00 1953
原创 Oracle执行计划优化SPM案例
执行下面这段代码,发现子库存表走了全表扫描子库存表里面的索引于是我们加上库存组织后再进行查询仍旧是全表扫描这时我们使用hint语法,强制走索引。
2024-04-17 19:19:51 292
原创 java中Hutools常用方法
Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅。
2024-04-07 23:02:26 1756 1
原创 redis缓存穿透、缓存击穿、缓存雪崩及其解决方法
第一种方法比较好理解,就是当数据库中查不到数据的时候,我缓存一个空对象,然后给这个空对象的缓存设置一个过期时间,这样下次再查询该数据的时候,就可以直接从缓存中拿到,从而达到了减小数据库压力的目的。第二种方式使用了加锁的方式,锁的对象就是key,这样,当大量查询同一个key的请求并发进来时,只能有一个请求获取到锁,然后获取到锁的线程查询数据库,然后将结果放入到缓存中,然后释放锁,此时,其他处于锁等待的请求即可继续执行,由于此时缓存中已经有了数据,所以直接从缓存中获取到数据返回,并不会查询数据库。
2024-03-24 22:40:27 915
原创 常见6种React Hook用法
PS:class组件中this.setState更新是state是合并, useState中setState是替换。
2024-03-24 22:31:03 846
原创 godot shader参考
有点像PS的混合选项,因为shader无法栅格化,所以有需求的话可以加入opencv对图像进行处理。原理是获取图像的A通道进行膨胀+高斯模糊+uv移动旋转。左图是原图,右图是shader的效果。
2024-03-10 17:12:55 631
原创 Spring和Struts比较
1、Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上SpringMVC就容易实现restful url,而struts2的架构实现起来要费劲,因为Struts2中Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。8、Spring MVC和Spring是无缝的。
2024-03-10 17:03:54 587
原创 四种垃圾回收算法
标记整理算法是针对复制算法在对象存活率较高时持续复制导致效率较低的缺点进行改进的,该算法是在标记-清除算法基础上,不直接清理,而是使存活对象往一端游走,然后清除一端边界以外的内存,这样既可以避免不连续空间出现,还可以避免对象存活率较高时的持续复制。分代收集算法就是目前虚拟机使用的回收算法,它解决了标记整理不适用于老年代的问题,将内存分为各个年代,在不同年代使用不同的算法,从而使用最合适的算法,新生代存活率低,可以使用复制算法。该算法先标记,后清除,将所有需要回收的算法进行标记,然后清除;
2024-03-03 21:40:57 591
原创 类加载器分类
(3)系统类加载器(system class loader)也叫应用类加载器:它根据Java应用的类路径(CLASSPATH)来加载Java类。类加载器(Class Loader)是Java虚拟机(JVM)的一个重要组件,负责加载Java类到内存中并使其可以被JVM执行。(2)扩展类加载器(extensions class loader):它用来加载Java的扩展库。(1)启动类加载器(Bootstrap ClassLoader)用来加载java核心类库,无法被java程序直接引用。
2024-03-03 21:36:19 599
原创 Java六种常用线程创建执行方法
注意:Executors的底层其实也是基于线程池的实现类ThreadPoolExecutor创建线程池对象的。优点:线程任务类只是实现接口,可以继续继承类和实现接口,扩展性强。缺点:线程类已经继承Thread,无法继承其他类,不利于扩展。缺点:多一层对象包装,如果线程有执行结果是不可以直接返回的。调用线程对象的start()方法启动线程(启动后还是执行run方法的)优点:线程任务类只是实现接口,可以继续继承类和实现接口,扩展性强。调用线程对象的start()方法启动线程。创建MyThread类的对象。
2024-02-18 18:25:49 1859
原创 Java volatile的作用
当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。而普通的共享变量不能保证可见性,因为普通共享变量被修改之后,什么时候被写入主存是不确定的,当其他线程去读取时,此时内存中可能还是原来的旧值,因此无法保证可见性。另外,通过synchronized和Lock也能够保证可见性,synchronized和Lock能保证同一时刻只有一个线程获取锁然后执行同步代码,并且在释放锁之前会将对变量的修改刷新到主存当中。因此可以保证可见性。
2024-02-18 18:24:53 1282
原创 Redisson看门狗机制
网上redis分布式锁的工具方法,大都满足互斥、防止死锁的特性,有些工具方法会满足可重入特性。如果只满足上述3种特性会有哪些隐患呢?redis分布式锁无法自动续期,比如,一个锁设置了1分钟超时释放,如果拿到这个锁的线程在一分钟内没有执行完毕,那么这个锁就会被其他线程拿到,可能会导致严重的线上问题。既然存在锁过期而任务未执行完毕的情况,那是否有一种可以在任务未完成时自动续期的机制呢,几年前在redisson中找到了看门狗的自动续期机制,就是解决这种分布式锁自动续期的问题的。
2024-02-03 18:07:25 5154 2
原创 详解跨域(JSONP和CORS)
同源策略(Same Origin Policy): 同源是指域名,协议,端口完成一致,那么这两个url就是同源。同源策略是一种约定,它是浏览器最核心也最基本的安全功能,也是浏览器故意设置的一个功能限制。如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。使用代码window.origin或者location.origin可以获取当前的源。源 = 协议+域名+端口号。
2024-02-03 17:38:45 1796
原创 布隆过滤器四种实现(Java,Guava,hutool,Redisson)
1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列的随机映射函数(哈希函数)两部分组成的数据结构。用于检索一个元素是否在一个集合中。时间复杂度低,增加及查询元素的时间复杂度都是O(k),k为Hash函数的个数;占用存储空间小,布隆过滤器相对于其他数据结构(如Set、Map)非常节省空间。存在误判,只能证明一个元素一定不存在或者可能存在,返回结果是概率性的,但是可以通过调整参数来降低误判比例;
2024-01-14 22:29:11 2912
原创 雪花算法及Java实现
现如今越来越多的公司都在用分布式、微服务,那么对应的就会针对不同的服务进行数据库拆分,然后当数据量上来的时候也会进行分表,那么随之而来的就是分表以后id的问题。例如之前单体项目中一个表中的数据主键id都是自增的,mysql是利用autoincrement来实现自增,而oracle是利用序列来实现的,但是当单表数据量上来以后就要进行水平分表,阿里java开发建议是单表大于500w的时候就要分表,但是具体还是得看业务,如果索引用的号的话,单表千万的数据也是可以的。
2024-01-14 22:04:05 1053
原创 Log4j漏洞原理及修复
*JNDI(Java Naming and Directory Interface–Java)**命名和目录接口 是Java中为命名和目录服务提供接口的API,通过名字可知道,JNDI主要由两部分组成:Naming(命名)和Directory(目录),其中Naming是指将对象通过唯一标识符绑定到一个上下文Context,同时可通过唯一标识符查找获得对象,而Directory主要指将某一对象的属性绑定到Directory的上下文DirContext中,同时可通过名字获取对象的属性同时操作属性。
2024-01-01 21:06:06 2479
原创 WebMvcConfigurer和WebMvcConfigurationSupport(MVC配置)
在日常开发中推荐优先使用WebMvcConfigurer的方式(官方推荐),因为简单方便,也没有特别复杂的定制需求;若我们项目中使用的MVC存在着更加复杂的配置需求推荐WebMvcConfigurationSupport,通过继承此类,我们可以说对官方的MVC代码进行重写操作,但是因为其配置量较大,实现比较复杂,因此在日常开发中使用WebMvcConfigurationSupport并不常见。常用自定义配置如下:1.addInterceptors(拦截器配置)
2024-01-01 13:26:03 5547 1
原创 Spring三种注解注入方式@Autowired,@Resouce,@Inject
1.@Resource是JavaEE规范定义的注解,@Autowired是Spring框架提供的注解, @Inject 是JSR-330规范中的注解。2.@Resource是按照名称进行注入的,它可以通过name属性指定具体要注入的资源名称,如果未指定名称,则按照类型进行注入。而@Autowired是按照类型进行注入的,它会根据类型在容器中找到对应的实例进行注入。不行的话会根据名称来进行注入。
2023-12-19 23:44:15 640
原创 redis存储时使用StringRedisTemplate进行序列化与反序列化
传统RedisTemplate进行序列化时会自动存储类对象的路径,为反序列化时作准备。这样占据了内存空间,可以使用StringRedisTemplate优化。
2023-12-19 22:55:26 659
原创 ElasticSearch报错client.indices().create方法deprecated
发送请求时报如下错误:ElasticsearchStatusException[Elasticsearch exception [type=mapper_parsing_exception, reason=Failed to parse mapping [properties]: Root mapping definition has unsupported parameters: [all : …];检查是否方法过时:创建索引库CreateIndexRequest应该修改成这个包:
2023-12-10 23:53:11 528
原创 ReactNative 0.62.2 报错Unexpected token punc «:»,expected punc «,»
(版本0.62.2)构建项目时报如下错误:Unexpected token punc «:»,expected punc «,» in file node_modules/react-native/Libraries/Blob/URL.js at 104:30(个人使用方法一解决)方法一:将metro-react-native-babel-preset升级到0.59:方法二:修改babel.config.js方法三:在package.json中增加:
2023-12-06 00:22:20 474
原创 ReactNative 0.62.2 报错Failed to transform react-native-0.71.0-rc.0-debug.aar
构建项目报如下错误:Failed to transform react-native-0.71.0-rc.0-debug.aar方法一:把应用到react-native的包都换成指定版本,我用的是0.62.2,记住是所有的,不能用react-native:+方法二:一次替换所有在android项目路径下的bulid,gradle中的allprojects中加入以下代码即可:
2023-12-05 23:21:48 256
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人