- 博客(47)
- 资源 (1)
- 收藏
- 关注
原创 分布式锁的实现方式有哪些?
通过设置一个唯一的键值对来获取锁,并设置过期时间防止死锁。释放锁时需校验锁的持有者,避免误删其他客户端的锁。客户端创建临时顺序节点,判断是否是最小序号节点,若是则获取锁。释放锁时删除节点,其他客户端监听前序节点变化。基于 etcd 的租约(Lease)和事务(TXN)实现。客户端创建租约并尝试写入键值,成功则获取锁。利用数据库的唯一索引或排他锁实现。通过插入或更新一条记录作为锁标记,释放锁时删除记录。根据业务需求选择合适方案,高性能场景可选 Redis,强一致性需求可选 ZooKeeper 或 etcd。
2025-09-03 13:32:23
269
原创 Java基于HanLP实现分词
HanLP 是一款由 NLP 爱好者和学术团队维护的开源中文自然语言处理工具包,功能涵盖:中文分词词性标注命名实体识别依存句法分析关键词提取HanLP 提供了丰富的分词算法,包括标准分词、索引分词、NLP分词、最短路径分词等,可以根据不同场景选择合适的分词方式。使用 HanLP 在 Java 中实现中文分词非常简单,几行代码即可完成文本分词、词性标注和命名实体识别。对于自然语言处理初学者或 Java 开发者来说,HanLP 是一个非常值得学习和使用的工具。
2025-08-29 16:19:02
1005
原创 ES支持哪些数据类型,和MySQL之间的映射关系是怎么样的?
Elasticsearch与MySQL数据类型映射摘要:Elasticsearch支持文本、数值、日期等多种数据类型,其中text用于全文搜索,keyword用于精准匹配。MySQL则提供结构化数据类型如INT、VARCHAR等。两者映射关系包括:VARCHAR可对应ES的text/keyword,INT映射为long,DATE转为date类型。关键区别在于text会分词处理适合全文检索,而keyword保持原样用于精确匹配。这种映射关系便于实现数据同步与集成,满足不同场景的查询需求。
2025-08-19 14:17:18
482
原创 如何保证ES和数据库的数据一致性?
定期扫描数据库表中的变更,并将变更同步到ES。这种方式实现简单,但实时性较差,适用于对实时性要求不高的场景。扫描频率需要根据业务需求调整,频率过高会影响数据库性能,频率过低会导致数据延迟。例如数据库写入成功但ES写入失败,或者ES写入成功但数据库写入失败。数据库更新后,向MQ发送一条消息,ES监听MQ并处理更新。这种方式解耦了数据库和ES的操作,提高了系统的可扩展性。缺点是MQ可能存在延迟,并且需要引入新的中间件,复杂度会提高。通过解析数据库的Binlog来捕获数据变更,并将变更同步到ES。
2025-08-19 13:50:23
368
原创 Hutool工具包的常用工具类的使用介绍
Hutool是一个小而全的Java工具类库,上述只是列举了部分,涉及到其他的使用方法可以参考官方api文档进行查询。
2024-12-20 10:47:28
1987
原创 深入理解 CompletableFuture —— Java 异步编程的工具
CompletableFuture是Java8引入的一个类,位于 java.util.concurrent 包下。它是一个可以表示异步计算结果的对象。CompletableFuture 不仅可以用于异步编程,还可以进行组合、链式调用等复杂操作。相比传统的线程池或回调方式,它提供了一种更加灵活和可读性更强的方式来处理异步操作。执行异步任务:可以通过它启动异步计算,并在计算完成后得到结果。组合多个异步任务:通过链式调用,你可以将多个异步任务串联起来。
2024-12-18 15:34:23
1515
原创 Java的堆如何分代的?
正常情况下,对象在新生代进行分配,当Eden区内存耗尽,无法分配新的对象时候,会触发YoungGC进行垃圾回收,没有被回收的对象搬运到Survivor区,这个过程叫做晋升。1、很多对象都是创建在Eden区,Eden区内存用完的时候,会触发GC,非活对象会被标记死亡,活着的对象移动到Survivor区。1、躲过15次GC,每次垃圾回收的时候,没有被回收掉的对象年龄就会+1,累计到15次(jdk1.8默认),就会进入到老年代。新生代和老年代,新生代存放新创建的对象,老年代存放长期存在的对象。
2024-03-06 23:51:40
675
2
原创 设计模式的7大基本原则
一个类只负责一种职责,如果一个类有两个不同的职责, 如果职责1的需求发生变更而需要改变时,可能会造成职责2的执行错误。要求程序要依赖于抽象接口,而不是具体的实现,该原则通过引入抽象接口和抽象类来将高层模块和低层模块解耦。对于拓展是开放的,对于修改是关闭的。任何父类出现的地方,都可以用它的字类来替代,而不会导致系统出错,强调正确使用继承关系。客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上。接口应该小而专注,不应该包含其他多余的方法,不要使用一个大的总接口。
2024-01-10 14:43:54
744
原创 什么是设计模式?有什么好处?
设计模式可以降低对象之间的交互的耦合性,让系统更容易拓展和维护,增加代码可读性。通过抽象层和接口,将变化的部分抽离出来,从而不影响其他业务,增加代码的可拓展性。设计模式是在软件开发过程中经常遇到的问题的通用解决方案。
2024-01-10 12:57:26
454
原创 如何使用自定义注解
RetentionPolicy.CLASS:停留在class文件,但是会被jvm丢弃(默认)ElementType.TYPE:类、接口(包括注解类型)或者是enum声明。ElementType.LOCAL_VARIABLE:局部变量声明。ElementType.PARAMETER:参数声明(废弃)ElementType.CONSTRUCTOR:构造器声明。ElementType.METHOD:方法声明。ElementType.PACKAGE:包声明。
2024-01-10 12:23:28
635
原创 策略模式解决if-else问题
这种模式支持开闭原则,在不修改现有代码的前提下,动态的添加、删除、替换算法。策略模式是一种行为设计模式,它允许在运行时根据不同的情况来选择不同的策略。:它是一个接口,具体的策略实现类去实现这个接口,就可以提供不同的实现方式。2、提高代码可读性:不同的业务处理在不同的策略实现类中,易于理解和维护。1、易于拓展:不需要修改原有代码,方便的增加、删除算法。可以根据需要来修改策略,或者定义一个工厂类。以Strategy接口实现某具体算法。3、避免大量的if-else语句。
2024-01-10 11:55:24
1143
原创 线程池线程数设置多少为合适?
5、可根据公式先设置一个数值,然后再根据实际的业务场景来调整。N是CPU的总和数。CPU密集型:线程池大小设置为N+1。IO密集型:线程池大小设置为2N+1。4、一次业务的整体耗时。2、服务器的配置情况。
2024-01-02 23:52:38
1658
原创 binlog、redolog、undolog的区别
在事务进行的全过程中,Mysql会将事务做了什么改动存储到redolog中,当系统发生异常情况时,Mysql会通过redolog中的记录来进行恢复操作,将事务所做的操作持久化到磁盘上。用于事务回滚或者是服务崩溃时回滚事务所做的操作,当一个事务执行完成之后,Mysql会将事务修改前的数据记录到undolog中,如果事务需要回滚,则会从undolog中找到对应的记录用来撤销事务所做的修改。主要用于对于数据库的数据备份,容灾恢复,数据复制等操作。undolog主要是保证事务的原子性和一致性,主要用于事务回滚。
2024-01-02 22:52:39
767
原创 MySQL聚簇索引和非聚簇索引的区别
对于聚簇索引来说,他的非叶子节点上存储的是存储数据的值,而它的叶子节点上存储的是这条记录的整行数据。2、对于非聚簇索引,它的非叶子节点存储的都是索引值,它的叶子节点上存储的是主键的值所以,非聚簇索引的查询,需要进行一次回表,就是先查到主键ID,在去查询需要的字段。,它是将表数据按照主键的顺序存储在磁盘上的一种方式,这种索引方式保证了行的物理存储顺序和主键的逻辑顺序相同,所以查找聚簇索引的速度非常快。1、对于聚簇索引,它的非叶子节点存储的是索引值,它的叶子节点存储的是整行记录。
2023-12-29 23:58:40
819
原创 什么是RabbitMQ死信队列?如何实现?
当消息变成“死信”之后,如果配置了死信队列,那么它将会被发送到死信交换机,死信交换机将死信发送到一个队列上,这个队列就是死信队列。2、消息过期:RabbitMQ中消息可以设置过期时间,如果在规定时间内没有被消费,它可以被认为是死信并被发送到死信队列。4、消息无法路由:当消息不能被路由到任何队列时,例:没有绑定关系或者是路由键,消息可以被发送到死信队列。3、死信队列和死信交换机进行绑定:将死信队列和死信交换机进行绑定,以便消息发送到死信队列上。1、创建死信队列:用来存储死信消息的队列。
2023-12-28 22:56:10
1203
原创 MySQL事务中的隔离级别有哪些?
不可重复读,是一个事务范围内的两次查询返回了不同的数据。事务在做范围查询时,有其他事务对这个范围的数据做了新增或者删除操作,导致范围内查询的结果条数不一致。读到了其他事务未提交的数据,比如A事务在操作数据,但是未提交,B事务处理的时候使用到了这条数据,因为事务A还未提交,所以事务B读到的数据就是脏数据。由于读已提交的隔离级别会产生不可重复读的现象,所以更高一级别的隔离级别可以解决不可重复读的问题,没办法彻底解决幻读。最低的隔离级别,A事务可以读取到B事务未提交的数据,会存在幻读、脏读、不可重复读的问题。
2023-12-28 14:00:59
610
原创 Mysql主从复制的实现过程
半异步复制是全同步复制和异步复制之间的一种复制方式,主库执行完事务之后,不会立马给客户端返回,也不会等所有从库都进行复制完成,而是等其中一个从库完成数据复制之后,再反馈给客户端。2、从服务器的I/O线程会尝试和主服务器建立连接,主服务器中有一个binlog dump线程,专门和从服务器的I/O线程交互。5、当dump线程检测到binlog发生变化时,会从指定位置开始读取内容,然后会被从服务器的I/O线程拉取过去。全同步复制中,当主库执行完一个事务之后,会等待所有的从库完成数据复制之后,才会给客户端反馈。
2023-12-28 00:28:27
650
原创 Redis和Memcached有什么区别?
2、持久化方式不同:redis支持rdb和aof方式持久化,可以将数据持久化到磁盘上,Memcached不支持持久化。1、数据结构不同:redis支持多种数据结构,Memcached只支持简单的键值对。3、Memcached是将数据全部存储到内存中,断电之后就会挂掉。Redis适应于数据结构复杂、需要更高级功能和数据持久化的场景。Redis和Memcached都是常见的缓存服务器。Memcached适应于简单的键值存储场景。
2023-12-26 23:32:33
1038
1
原创 缓存穿透、击穿、雪崩
访问一个缓存和数据库都不存在的key,此时会直接打到数据库上,并且查询不到数据,没办法根据查询结果写入缓存,所以下一次请求过来还是直接访问到数据库,并且缓存也起不到作用了,每次请求都会走到数据库,流量大的话数据库可能就会挂掉。某一个热点key,在缓存过期的一瞬间,同时有大量的请求进来,由于缓存过期了,所以这些请求都会走到数据库,造成瞬时数据库的请求量增大,导致数据库挂掉。使用锁的时候,添加锁时,要按照请求key的维度来加锁,如果使用“固定的key”加锁,会导致不同的key之间也会互相阻塞。
2023-12-26 17:19:06
537
原创 什么是线程池
4、CallerRunsPolicy:当有新任务提交后,如果线程池没被关闭且没有能力执行,则把这个任务交于提交任务的线程执行,也就是谁提交任务,谁就负责执行任务。2、newCachedThreadPool():创建一个可缓存的线程池,调用execute将重用以前构造的线程,如果没有可用的线程则创建一个新得线程并添加到线程池中,终止并从缓存中移除那些超过60s没有被使用得线程。线程池就是提前创建好一批线程,保存到线程池中,当有任务需要执行的时候,从线程池中选一个线程来执行任务。线程池、连接池、对象池。
2023-12-26 00:32:22
446
原创 创建多线程有几种方式?
Future是一个接口,代表一个异步执行的结果,接口中的方法用来检查执行是否完成、等待完成和得到执行的结果。当执行完成后,只能通过get方法得到结果,get方法会阻塞到有结果,可以通过cancel方法取消。Runnable和Callable都可以创建多线程,但是Runnable需要重写run方法,Callable需要实现call方法。Runnable的run方法无返回值,Callable的call方法有Object类型的返回值。2、实现Runnable接口实现多线程。1、继承Thread类重写run方法。
2023-12-25 23:55:59
560
原创 线程的几种状态?状态之间流转
WAITING是线程等待状态,调用wait方法,线程进入WAITING状态,当线程执行sleep方法时,线程进入TIMED_WAIT状态。就绪:线程创建后,调用了start()方法,等待线程调度并且分配cpu使用权。4、等待状态(WAITING):进入该状态的线程需要等待其他线程做出动作(通知)5、超时等待(TIMED_WAIT):该状态和等待状态不同,指定时间到了自动返回。运行中:就绪状态中的线程获取到了cpu时间片,开始执行代码。1、初始状态(new):新创建了一个线程,还没调用start()方法。
2023-12-25 23:27:32
412
原创 基于AOP实现接口请求的入参和返回日志打印
鉴于日常开发过程中,很多排查问题的情况下,需要二次操作业务流程进行入参的获取,实际操作起来增加排查问题的处理时间,为了提高效率,可以通过Aop实现接口入参以及返回的日志打印,方便快速解决问题。
2023-03-29 14:34:58
646
原创 CountDownLatch一个或者多个线程去等待其他线程完成操作统一返回
一个或者多个线程去等待其他线程完成操作统一返回;java开启多个线程,等待所有线程都执行完毕之后接口统一返回
2022-06-20 22:21:51
979
1
原创 JAVA通过EasyPoi根据模板导出word文档
1、引入依赖备注:如果没有jar包冲突,可以忽略jar排重(<exclusions>标签内内容) <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-base</artifactId> <version>4.3.0</version>
2022-03-24 12:06:00
1854
1
原创 Java手动分页工具类
public class PageListUtils { /** * 分页函数 * @param currentPage 当前页数 * @param pageSize 每一页的数据条数 * @param list 要进行分页的数据列表 * @return 当前页要展示的数据 */ public Page getPages(Integer currentPage, Integer pageSize, List list) .
2022-03-23 14:55:40
2087
原创 List<bean> 转换成List<Map>
//将listmap转换成list实体类 List<OaAttachment>list=new ArrayList<OaAttachment>(); if(Func.isNotEmpty(attachments)){ for(Map<String,Object> map:attachments){ OaAttachment fileInfo=new OaAttachment(); .
2022-02-15 17:09:20
1858
1
原创 java执行linux命令
列举个例子,其他类推:1.java删除linux服务器某个目录下的文件夹Process process =null;//文件夹路径String path = "/var/www/uploadFileResource/temp";String[] cmd = new String[] { "/bin/sh", "-c", "rm -rf "+path };try { //执行命令 process = Runtime.getRuntime().exec(cmd); lo
2022-02-14 17:09:30
5570
原创 java下载附件到本地目录
需要注意的点:/** * 下载的是图片 本地路径则是 名称.png/jpg等等 * 下载的是文档或者是pdf 本地路径则是 名称.doc/xls/pdf * */★★★本地目录后面一定要跟着文件名称String path="E:\\image\\123.jpg"; public static void main(String[] args) throws Exception { String url = "https:
2021-10-11 15:42:42
623
原创 idea远程debug调试
使用原因:由于本地环境服务正常运行,部署到linux服务器之后,服务出现报错的情况,这个时候不好排查问题,只能在本地通过以打log的方式再次将服务部署到linux服务器,以查看日志的方式来排查错误点;此办法耗时耗力,事倍功半。那么我们就可以通过远程debug的方式来直接调试linux服务器上的代码首先在服务器上的服务启动指令中设置jvm参数: nohup java -Xdebug -Xrunjdwp:transport=dt_socket,address=5500,serv...
2021-09-09 10:13:23
965
1
原创 原生js生成标签云
/** 3d标签云* 功能:鼠标移入标签,当前标签静止放大* 说明:* */window.tagcloud = (function(win, doc) { // ns // 判断对象 function isObject (obj) { return Object.prototype.toString.call(obj) === '[object Object]'; } // 构造函数 function TagCloud (options.
2021-09-03 12:25:00
775
原创 java手机号正则校验工具类
public class RegexUtils { /** * 大陆号码或香港号码均可 */ public static boolean isPhoneLegal(String str)throws PatternSyntaxException { return isChinaPhoneLegal(str) || isHKPhoneLegal(str); } /** * 大陆手机号码11位数,匹配格式:前三位固定格式+后8位任.
2021-08-28 13:03:34
831
2
原创 RabbitMq创建队列绑定交换机
声明交换机@Beanpublic TopicExchange exchange() { return new TopicExchange(exchange);}声明队列@Beanpublic Queue delayedQueue(){ return new Queue(queue);}@Beanpublic Queue delayedQueue1(){ return new Queue(queue1);}队列绑定交换机@Beanpublic
2021-08-25 11:32:56
5859
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅