- 博客(100)
- 资源 (1)
- 收藏
- 关注
原创 何实现在上亿条的用户搜索日志中找到Top100的关键词
(2)创建一个长度为n(如2048)的哈希表数组,用来统计每个小文件中关键词出现的频率。服务端开启多线程并行遍历大文件切割出来的小文件,然后对每个用户搜索的关键词进行哈希取模运算,通过计算的结果将关键词统计到哈希表数组中。(1)将用户搜索的日志文件(一个大文件)切割成若干个小文件(如设置每个小文件大小为512KB)(3)使用小顶堆(小顶堆适用于解决统计频率最高的TopN的问题)统计前x位的关键词。(1)使用“分而治之”的思想,将大文件分割为小文件(可以使用哈希取模法切割文件)。
2025-07-24 09:52:56
108
原创 敏感数据加密后如何实现模糊查询
内存解密方案的优点是简单方便,缺点是每次将加密后的数据整表加载到内存中然后解密再匹配,随着业务的发展,业务数据量会越来越大,那么很容易造成OOM。如果在数据库里面的数据已经加密了,此时我们将这些数据查询到内存中,然后进行解密操作,最后在解密后的数据中进行模糊查询来筛选出符合条件的数据。如果要查询186手机号开头的用户信息,首先通过186手机号在明文表中查询对应的用户id,然后通过用户id去用户表中查询对应的用户数据。(2)如果支持敏感字段的模糊检索,那么加密的密文随原文长度增长而增加。
2025-07-22 09:45:08
593
原创 Cookie、Session、Local Storage和Session Storage区别
(5)Session保存在服务端,常用于用户认证(存储用户的登录状态,判断用户是否已经登录)、购物车功能(存储用户在购物车中的商品信息)、记录用户偏好设置(存储用户的个性化设置,如语言、时区等)、保存游戏状态(在游戏中存储用户的进度和状态)等场景,但是使用 Session时需要考虑安全性问题(如XSS攻击、CSRF攻击),确保用户数据的安全。Session由服务端生成,它代表服务器与浏览器的一次会话过程,这个过程是连续的,也可以时断时续的,Session对象用来存储特定用户会话所需的信息。
2025-07-21 15:58:16
726
原创 flowable表结构
此表和ACT_RE_DEPLOYMENT是多对一的关系,即,一个部署的bar包里可能包含多个流程定义文件,每个流程定义文件都会有一条记录在ACT_REPROCDEF表内,每个流程定义的数据,都会对于ACT_GE_BYTEARRAY表内的一个资源文件和PNG图片文件。1.全局参数, 默认三个参数next.dbid, IdGenerator区间, schema.history, 自动执行sql历史, schema.version, 当。记录机制基于Activiti引擎的事件机制的一般用途,并默认禁用。
2025-07-16 15:33:39
587
原创 SpringBoot中如何引入第三方的SDK
在项目中经常会遇到使用第三方SDK情况,即就是第三方生产的jar包,但是这个不能上传到maven仓库中,由于我们的项目需要依赖到这个SDK,那么我们可以通过以下的几步就可以轻松的引入SDK到我们项目中。(1)三方的jar包放到项目的src/main/resources目录下。(2)添加maven依赖。
2025-07-09 17:43:30
181
原创 Spring 为何需要三级缓存解决循环依赖,而不是二级缓存
循环依赖处理示例分析(AService ↔ BService):1、AService实例化,其ObjectFactory被存入三级缓存2、 AService开始属性填充,发现需要BService3、 触发BService加载流程:3.1、 BService实例化,其ObjectFactory存入三级缓存3.2、 BService开始属性填充,发现需要AService。
2025-07-03 11:18:33
882
原创 JVM的场景优化
这么做的结果就是,过了一段时间后,OOM依然会出现。死锁并没有第一种场景那么明显,web应用肯定是多线程的程序,它服务于多个请求,程序发生死锁后,死锁的线程处于等待状态(WAITING或TIMED_WAITING),等待状态的线程不占用cpu,消耗的内存也很有限,而表现上可能是请求没法进行,最后超时了。混合回收的基于复制算法的,所以大对象的复制会比较耗时,如果某个老年代的Region超过85%的对象是存活的,那他不会被回收,通过 -XX:G1MixedGCLiveThresholdPercent 设置。
2025-07-02 15:26:07
638
原创 flowable工作流的学习demo
需要注意的是,Authentication.setAuthenticatedUserId(currentUserId) 方法设置的当前用户ID在任务完成时对历史表产生影响是在任务监听器中触发的,例如在 “complete” 事件的任务监听器中执行了设置当前用户ID的操作。通常在开启一个新的流程实例、完成任务或者进行其他涉及用户身份的操作时,我们可以通过 Authentication.setAuthenticatedUserId() 方法设置当前用户的身份信息,以保留用户与相应操作的关联。
2025-06-14 22:58:51
666
原创 idea配置迁移
注意:最重要一点,如果安装idea时经过设置的,最好把原先\Roaming\JetBrains\IntelliJIdea2022.3.2复制到D:/software/IntelliJ IDEA 2022.3.2/config、\Local\JetBrains\IntelliJIdea2022.3.2复制到D:/software/IntelliJ IDEA 2022.3.2/system里面的数据原封不动的复制一份到目标目录,然后重启idea就可以了。更改IDEA的默认设置目录。
2025-06-14 20:09:51
415
原创 Java并发容器框架
/ node数组最大容量:2^30=1073741824// 默认初始值,必须是2的幕数//数组可能最大值,需要与toArray()相关方法关联//并发级别,遗留下来的,为兼容以前的版本// 负载因子// 链表转红黑树阀值,> 8 链表转换为红黑树//树转链表阀值,小于等于6(tranfer时,lc、hc=0两个计数器分别++记录原bin、新binTreeNode数量,<=UNTREEIFY_THRESHOLD 则untreeify(lo))
2025-06-10 14:09:42
998
原创 高并发下的计数器,为什么阿里不推荐使用 AtomicLong
LongAdder 是 JDK1.8 由 Doug Lea 大神新增的原子操作类,位于 java.util.concurrent.atomic 包下,LongAdder 在高并发的场景下会比 AtomicLong 具有更好的性能,代价是消耗更多的内存空间。LongAdder 是 Google 开源的一个高性能计数器实现。它采用了一种分段锁的策略,将一个 long 型的变量分割成多个 16 字节的段,每个段都使用一个独立的 AtomicLong 进行更新。
2025-06-04 14:14:38
927
原创 常用工具网站
https://github.com/dail8859/NotepadNext/releases
2025-06-04 13:33:48
92
原创 synchronized实现原理
synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法进入临界区,同时还可以保证共享变量的内存可见性。
2025-05-30 13:45:18
652
原创 springboot文件上传下载
SpringBoot中,类型可以精确控制HTTP响应,为文件下载提供完善的HTTP头信息。• 完全控制HTTP响应和头信息• 适合各种资源类型的下载• 支持动态生成的文件下载• 需要精确控制HTTP响应的场景• 动态生成的文件下载• 自定义缓存策略的文件服务。
2025-05-30 11:17:41
666
原创 多线程的一些概念
两个或两个以上的线程持有不同系统资源的锁,线程彼此都等待获取对方的锁来完成自己的任务,但是没有让出自己持有的锁,线程就会无休止等待下去。线程竞争的资源可以是:锁、网络连接、通知事件,磁盘、带宽,以及一切可以被称作“资源”的东西。如上图所示,Thread-1持有资源Object1但是需要资源Object2完成自身任务,同样的,Thread-2持有资源Object2但需要Object1,双方都在等待对方手中的资源但都不释放自己手中的资源,从而进入死锁。
2025-05-29 11:29:18
567
原创 ReentrantReadWriteLock读写锁
读取锁和写入锁都支持锁获取期间的中断;Condition支持。仅写入锁提供了一个 Conditon 实现;读取锁不支持 Conditon ,readLock().newCondition() 会抛出 UnsupportedOperationException。
2025-05-28 14:12:54
318
原创 volatile底层原理详解
Java语言规范对于volatile定义如下:Java编程语言允许线程访问共享变量,为了确保共享变量能够被准确和一致性地更新,线程应该确保通过排它锁单独获得这个变量。首先我们从定义开始入手,官方定义比较拗口。通俗来说就是但是它并不能保证多线程的原子操作。这就是所谓的线程可见性。。
2025-05-28 13:50:12
735
原创 Yavi用一行代码实现各种复杂验证
适用于任何对象的约束。包括Java Beans、Records、Protocol Buffers、Immutables等。支持API,以及结合验证结果和验证器的功能,融入了函数式编程的概念。类型安全的约束,不支持的约束不能应用于错误类型。在创建对象前对参数进行验证。
2025-05-23 16:55:54
164
原创 import*的展开(开发工具)
Java社区和许多编码规范(如Google Java Style)推荐明确导入所需的类,而不是使用通配符导入。很多IDE(如 IntelliJ IDEA、Eclipse)在自动补全功能上对于明确导入的类支持更好,使用。明确的导入语句有助于快速了解类的依赖关系,便于管理和修改。隐藏了实际使用的类,其他开发者在阅读代码时需要额外查找具体使用了哪些类,增加了理解代码的难度。虽然现代编译器和JVM对导入语句的处理非常高效,但在大型项目中,过多的。可能导致编译器无法明确识别要使用的具体类,进而引发编译错误。
2025-04-24 17:38:16
485
原创 在线正则网站
Github 地址:https://github.com/CJex/regulex。地址:https://jex.im/regulex/#!flags=&re=
2025-02-21 11:26:54
194
原创 红包算法实现
微信红包的分配算法通过将额度范围设置为这种设计既符合数学逻辑,也满足了用户体验的需求,是一种非常巧妙的算法设计。下面是一个基于 Java 的实现,用于模拟微信红包的分配算法。该算法的核心思想是:每次随机生成一个金额,范围在之间,同时确保总金额能够合理分配。
2025-02-20 10:43:25
248
原创 如何利用 Java 在线生成 PDF 文件
iText,对,没错,它就是我们今天的主角。iText是著名的开放源码站点一个项目,是用于生成PDF文档的一个java类库,通过iText不仅可以生成PDF或rtf的文档,而且还可以将XMLHtml文件转化为PDF文件。iText目前有两套版本,分别是iText5和iText7。iText5应该是网上用的比较多的一个版本。iText5因为是很多开发者参与贡献代码,因此在一些规范和设计上存在不合理的地方。iText7是后来官方针对iText5的重构,两个版本差别还是挺大的。
2025-02-17 14:16:10
617
原创 为什么数据库和数据库连接池不采用类似java nio的IO多路复用技术使用一个连接来维护和数据库的数据交换?
传统的阻塞IO为了提高效率,需要创建一定数量的连接形成连接池,而nio仅需要一个连接即可(大部分情况下一个连接即可)。但是一般我们在使用DB时,还是经常性采用c3p0,tomcat connection pool等技术来与DB连接,哪怕整个程序已经变成以Netty为核心。至于这些事件的处理方式,到底是业务代码循环着处理、丢到队列里,还是交给线程池处理,由业务代码决定。对于使用DB的程序来讲,不管使用多路复用,还是连接池,都要维护一组网络连接,支持并发的查询。在网络服务中,IO多路复用起的作用是。
2024-12-25 16:51:07
430
原创 Spring Boot整合EasyExcel并行导出及Zip压缩下载
这种方案特别适合需要处理大量数据导出的企业系统,在提升效率的同时,保证了系统的稳定性和可扩展性。首先,我们需要引入相关的依赖,包括 Spring Boot 和阿里巴巴的 EasyExcel 组件,此外还需要使用 Java 的 Zip 工具进行压缩操作。通过使用并行处理,可以同时生成多个文件。在这个例子中,假设我们有一个订单表,我们将导出每个用户的订单信息到不同的 Excel 文件中。:假设我们要导出上百万条订单数据,首先需要根据用户或其他条件将数据进行分片,每片数据导出到不同的 Excel 文件。
2024-12-13 11:16:35
726
原创 StreamingResponseBody:处理大批量数据导出
这种方式非常适合处理大文件下载、大批量数据导出等场景,因为它可以避免一次性加载所有数据到内存中,从而减少内存占用并提高性能。我们将采用StreamingResponseBody来实现流式响应,同时结合分页查询和异步处理。以下是带有详细注释的优化实现。Spring框架中,StreamingResponseBody 是一个接口,:只在需要时加载数据,并立即发送给客户端,减少了对服务器内存的压力。:数据可以分块地发送给客户端,而不是等待整个文件准备完毕。:用户无需长时间等待,文件开始生成后即可逐步接收到内容。
2024-12-06 15:44:28
1009
原创 解决 attempt to unlock lock, not locked by current thread by node id redisson异常
3.多线程竞争的问题,当第一个线程完成lock,此时并未 unlock,第二个线程未获取到锁,但执行finally,第二线程尝试着去释放第一个线程的锁。就是问题的翻译如下:尝试去释放不是当前线程持有的锁。2.多线程竞争的问题,当第一个线程完成lock,此时并未 unlock,如此,第二个线程尝试获取锁,并进行lock操作,会抛出该异常。1.当你在完成lock后,里面的业务代码执行时间大于lock时间时,进行unlock,会抛出该异常。为什么会这样,由于在进行lock操作时,会设置一个时间默认30s,
2024-10-29 15:49:37
1012
原创 实体与DTO如何转换
它是一个代码生成器,它基于约定优于配置的方法,极大地简化了 Java Bean 类型之间的映射实现。生成的映射代码使用简单的方法调用,因此执行速度快、类型安全且易于理解。另一方面,它是一个运行时库,用于实例化和调用生成的映射器。它采用基于约定的方法,同时提供简单、重构安全的应用程序接口(API)来处理特定用例。这里添加了Order到OrderDto转换的映射,将Order中的orderAmount映射到OrderDto中的money。在Spring环境下,建议配置如下的Bean以方便我们进行转换。
2024-10-22 10:24:34
493
原创 synchronized为什么会有两个monitor exit
于是线程就会释放锁。因为文章开头已经说过,这是由于Java在多个线程同时访问同一个对象的成员变量的时候,每个线程都拥有了这个对象变量的拷贝。代码如果遇到了这个标识,就表示获取到了对象的监视器monitor(monitor对象是由C++实现的),这个获取的过程是排他的,也就是同一时刻只能有一个线程获取到由synchronized所保护对象的监视器。在多线程之间,共享变量的值是线程不安全的,因为线程在开始运行之后都会拥有自己的工作空间,而从自己工作空间把修改的值刷新回主存的时候需要CPU的调度。
2024-09-05 13:45:43
461
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人