- 博客(271)
- 资源 (9)
- 收藏
- 关注
原创 从两道题来认识“事务的传播行为”
前言我们今天来学习关于事务的传播行为的知识。题目一题目如下:某个复杂的计算逻辑,由若干个子流程处理 + 主流程处理共同完成。业务要求是 :1)子流程处理互相独立,即其中一个发生错误事务回滚,不影响其他子流程的处理;2)主流程处理失败,事务回滚时,所有的子流程也要跟着回滚。思考鄙人苦苦思索良久,绞尽脑汁,穷尽我以前所学知识,憋出了如下的答案:class A { @Transactional public void methodA() {
2022-01-24 16:39:47 373
原创 Lucene应用实战(四)——Lucene搜索的两种方式
前言本文我们来对Lucene具体如何进行数据的搜索,进行详细的介绍。环境准备我们直接使用在 Lucene应用实战(二)——Field域的使用及索引库的维护 中的应用代码案例。因为索引和存储两者是分开的,对于某一个字段我们可以建立索引,但是不存储,我们依然可以对此字段进行搜索,但是因为我们没有存储,所以我们搜索出来的结果中不显示此字段的内容。本文为了结果的展示明显,我们将“desc“属性进行索引并且存储。搜索结果TopDocs类Lucene搜索结果可通过TopDocs遍历,TopDocs类提供了
2022-01-24 13:52:13 2089
原创 Lucene应用实战(三)——分词器的使用
前言前面几篇文章我们对Lucene中索引的创建等相关知识进行了初步的学习。接下来思考一个问题,我们创建的索引,是不是符合我们搜索要求的索引呢?平日里我们搜索东西的时候,输入某个关键词,有时候能搜出来,有时候搜别的关键词就搜不出来。用户输入的关键词和我们存储的索引之间会有一个匹配的过程,如果能匹配的上,那么就返回相应结果。索引创建是很关键的一环,而分词又是索引创建的核心,直接影响到索引的质量。接下来我们来从分词入手,详细拆解索引创建过程中分词的流程。分词的相关概念分词器:采集到的数据会存储到D
2022-01-24 13:51:28 1227
原创 Lucene应用实战(二)——Field域的使用及索引库的维护
Field域的使用及索引库的维护前言在前面我们对Lucene的使用进行了简单的demo实战,本文我们详细来说明下Lucene中的Field域的使用及索引库维护的相关操作。Fileld域的使用简介Lucene存储对象是以Document为存储单元,对象中相关的属性值则存放到Field中。Field是文档中的域,包括Field名和Field值两部分,一个文档可以包括多个Field,Document只是Field的一个承载体,Field值即为要索引的内容,也是要搜索的内容。Field有三大属性:
2022-01-24 13:50:45 510
原创 Lucene应用实战(一)——索引创建与搜索
Lucene简介Lucene是非常优秀的成熟的开源的免费的纯java语言的全文索引检索工具包。Lucene是一个高性能、可伸缩的信息搜索(IR)库。 Information Retrieval (IR) library.它可以为你的应用程序添加索引和搜索能力。Lucene是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。由Apache软件基金会支持和提供,Lucene提供了一个简单却强大的应用程序接口,能够做全文索引和搜索。
2022-01-24 13:49:04 2582
原创 痛苦的根源
我痛苦的根源在于在用学生的思维来生活和工作,学生时做题考试是有标准答案的,但是人生没有标准答案,可以这样活,也可以那样活,最重要的是要想明白自己到底想要的是什么,然后去做选择,这是属于我自己的选择,与他人无关,至于别人所吹捧的别的什么东西,那也是别人的,与我无关。...
2022-01-24 12:38:52 276 1
原创 面试官:MySQL中的锁你能说出来几种?
前言面试官:MySQL中的锁很多,你能说出来几种?要是你能完整的回答出来,那就不用往下看了,如果有疑惑,就继续看喽。锁分类在 MySQL中锁有很多不同的分类。从操作粒度看从操作的粒度可分为表级锁、行级锁和页级锁。表级锁:每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低。应用在MyISAM、InnoDB、BDB 等存储引擎中。行级锁:每次操作锁住一行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。应用在InnoDB 存储引擎中。页级锁:每次锁定相邻的一组
2022-01-24 11:51:44 1236
原创 深入Redis底层数据结构,看这篇文章就够了
Redis的value的常见几种数据类型,有string字符串类型、list列表类型、set集合类型、sortedset(zset)有序集合类型、hash类型等。本篇我们来深入研究下这些数据结构的底层实现,从而对Redis有更深层次的认识。
2022-01-20 19:46:23 870
原创 面试官:来说一说缓存雪崩、缓存穿透、缓存击穿的区别?我整个人都懵了
前言本文我们整理总结下Redis使用过程中一些常见的问题,并研究如何解决。缓存穿透一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。简介缓存穿透是指在高并发下查询key不存在的数据,会穿过缓存查询数据库。导致数据库压力过大而宕机 。解决方案解决方案:对查询结果为空的情况也进行缓存,缓存时间(ttl)设置短一点,或者该key对应的数据insert了之后清理缓存。存在的问题:缓存太多空值占用了更多的空间使用布隆过滤器。在缓存之前
2022-01-20 19:37:46 1967 2
原创 大厂面试题:说一说Redis的过期淘汰策略
前言我们经常用redis来当缓存使用,既然是缓存,就有过期时间,否则就有可能数据更新不及时,造成脏数据的现象,本文我们来学习下redis的过期淘汰策略。Redis的性能Redis有两种使用场景,一种是作为DB(数据库)使用,一种是当做缓存使用。关于Redis的性能,我们来看一下官方数据:读:110000次/s写:81000次/s长期使用,key会不断增加,Redis作为缓存使用,物理内存也会满。如果物理内存满了之后,内存就需要与硬盘交换(swap) ,就是需要我们常说的虚拟内存 ,频繁IO
2022-01-20 19:31:06 1619
原创 缓存“延时双删”真的有必要吗?我觉得没有
第一次清空缓存后,更新数据库前的这段时间内,其他事务查询了数据库的数据,第二次清空缓存后,刚才查询数据库 的那个线程又更新了缓存,此时又会将旧数据更新到缓存
2022-01-19 13:37:42 6014 1
原创 Linux性能优化大杀器—平均负载率详解(鼓励收藏)
平均负载是指单位时间内,系统处于 可运行状态 和 不可中断状态 的平均进程数,也就是平均活跃进程数,它和CPU 使用率并没有直接关系。
2022-01-18 08:59:39 1394 1
原创 学会了伪共享问题解决方案,又能涨薪了
前言学习的过程中遇到了一个名词——“伪共享”,出于对知识的兴趣,上网查阅了一些博文,研究了“伪共享”的问题,写此文章总结记录。要很好的理解伪共享问题,我们要先从CPU的缓存开始说起。CPU缓存架构CPU 是计算机的心脏,所有运算和程序最终都要由它来执行。主内存(RAM)是数据存放的地方,CPU 和主内存之间有好几级缓存,因为即使直接访问主内存也是非常慢的。如果对一块数据做相同的运算多次,那么在执行运算的时候把它加载到离 CPU 很近的地方就有意义了,比如一个循环计数,你不想每次循环都跑到主内存
2022-01-17 13:50:44 275 1
原创 经济学的几个原理
1. 边际效用递减边际效用递减 ,是指在一定时间内,在其他商品的消费数量保持不变的条件下,当一个人连续消费某种物品时,随着所消费的该物品的数量增加,其总效用(total utility)虽然相应增加,但物品的边际效用(marginal utility,即每消费一个单位的该物品,其所带来的效用的增加量)有递减的趋势。 边际收益递减原理,在实际社会中的应用举例如下。在生产中,比如,在农田里撒化肥可以增加农作物的产量,当向一亩农田里撒第一个100公斤化肥的时候,增加的产量最多,撒第二个100公斤
2022-01-16 11:36:36 2788
原创 java对象分配过程及堆溢出测试
JVM设计者不仅需要考虑到内存如何分配,在哪里分配等问题,并且由于内存分配算法与内存回收算法密切相关,因此还需要考虑GC执行完内存回收后是否存在空间中间产生内存碎片。
2022-01-15 19:40:11 261
原创 java中“堆”的相关参数demo设置
堆大小 = 新生代 + 老年代。其中,堆的大小可以通过参数 –Xms、-Xmx 来指定。1)年轻代(Young Gen):年轻代主要存放新创建的对象,内存大小相对会比较小,垃圾回收会比较频繁。年轻代分成1个Eden Space和2个Survivor Space(from 和to)。2)年老代(Tenured Gen):年老代主要存放JVM认为生命周期比较长的对象(经过几次的Young Gen的垃圾回收后仍然存在),内存大小相对会比较大,垃圾回收也相对没有那么频繁。
2022-01-15 19:34:39 282
原创 GC日志分析实战,你了解吗?
前言本节我们来通过代码实战来看下GC日志的一些信息。代码示例我们看以下代码:package com.test;public class TestGCLog01 { private static final int _1MB = 1024*1024; /** * VM参数: * -Xms20M -Xmx20M -Xmn10M -XX:+UseParallelGC -XX:+PrintGCDetails -XX:SurvivorRatio=8 */
2022-01-15 13:51:33 104
原创 RabbitMQ实战(一)——RabbitMQ安装
RabbitMQ 简介RabbitMQ,俗称“兔子MQ”(可见其轻巧,敏捷),是目前非常热门的一款开源消息中间件,不管是互联网行业还是传统行业都广泛使用(最早是为了解决电信行业系统之间的可靠通信而设计)。RabbitMQ的特点如下:高可靠性、易扩展、高可用、功能丰富等支持大多数(甚至冷门)的编程语言客户端。RabbitMQ遵循AMQP协议,自身采用Erlang(一种由爱立信开发的通用面向并发编程的语言)编写。RabbitMQ也支持MQTT等其他协议。本文主要来介绍RabbitMQ的安装步
2022-01-15 13:47:49 165
原创 JVM如何判断一个对象是否存活?
前言在 深入浅出Java虚拟机(三)——初识JVM的垃圾回收机制 中我们介绍了如何判断对象已死的两种算法,分别是引用计数法和可达性分析法。本文我们再来详细说明一下JVM中判断对象是否、存活的相关细节。finalize()方法的执行条件即使在可达性分析算法中判定为不可达的对象, 也不是“非死不可”的, 这时候它们暂时还处于“缓刑”阶段, 要真正宣告一个对象死亡, 至少要经历两次标记过程:第一次标记:如果对象在进行可达性分析后发现没有与GC Roots相连接的引用链, 那它将会被第一次标记, 随后进
2022-01-15 10:30:00 613
原创 手把手教你如何自定义一个类加载器
前言前面 认识类加载器及双亲委派模型/ 中我们认识了类加载器,本文我们来自定义一个类加载器。为什么需要自定义类加载器?既然JDK已经有类加载器了,为什么还需要自定义类加载器呢?大概有以下几个原因:隔离加载类模块隔离,将类加载到不同的应用程序中。比如Tomcat这类web应用服务器,内部定义了好几种类加载器,用于隔离web应用服务器上不同的应用程序。扩展加载源 还可以从数据库、网络或其他终端上加载类防止源码泄露 Java代码容易被编译和篡改,可以进
2022-01-14 14:12:27 3364 1
原创 认识类加载器及双亲委派模型
类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。>注意:JVM主要在程序第一次主动使用类的时候,才会去加载该类,也就是说,JVM并不是在一开始就把一个>程序就所有的类都加载到内存中,而是到不得不用的时候才把它加载进来,而且只加载一次。
2022-01-14 14:09:41 301
原创 JVM常用指令实战(值得收藏即用即查)
前言本文我们来学习下JVM中的一些常用的指令。jps介绍jps 是(java process Status Tool), Java版的ps命令,查看java进程及其相关的信息,如果你想找到一个java进程的pid,那可以用jps命令替代linux中的ps命令了,简单而方便。命令格式:jps [options] [hostid]options参数解释:-l : 显示进程id,显示主类全名或jar路径-q : 显示进程id-m : 显示进程id, 显示JVM启动时传递给main()
2022-01-14 13:56:49 691
原创 最近的状态,很不好
最近太浮躁了,整个2021年都很浮躁。把我最近几个月的状态理了一下,人云亦云,没有坚定的价值观;不够专注;24岁的年纪有性欲,外界有很多诱惑,很浮躁,2021年浮躁了一整年;把工作没有当成自己的事业来做,只是想着赶紧下班回家,混吃等死;内心的空虚,早上起来的那种无力感,经常半夜惊醒;感觉人生没有意义,找不到活着的理由;知道自己应该怎样努力,去学什么,但就是放在那儿不想学习,不想动弹;什么道理都懂,但就是不想去做,并不觉得他们努力的人有什么高尚的,觉得干什么都一样,最终都是死,众生皆苦;我
2022-01-13 19:21:54 146
原创 JVM中类加载的过程详解
类从被加载到虚拟机内存中开始,到卸载出内存,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initiallization)、使用(Using)和卸载(Unloading)这7个阶段。其中验证、准备、解析3个部分统称为连接(Linking)
2022-01-13 19:10:32 599
原创 Java虚拟机栈的出栈入栈流程及栈内存大小设置
Java虚拟机栈(Java Virtual Machine Stacks)是线程私有的,即生命周期和线程相同。Java虚拟机栈和线程同时创建,用于存储栈帧。每个方法在执行时都会创建一个栈帧(Stack Frame),用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直到执行完成的过程就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
2022-01-13 19:07:52 2590 2
原创 Java虚拟机(三)——初识JVM的垃圾回收机制
前言对于程序计数器、虚拟机栈、本地方法栈这三个部分而言,其生命周期与相关线程有关,随线程而生,随线程而灭。并且这三个区域的内存分配与回收具有确定性,因为当方法结束或者线程结束时,内存就自然跟着线程回收了。因此本篇文章所讲的有关内存分配和回收关注的是Java堆与方法区这两个区域。如何判断对象已死?1. 引用计数法简介给对象增加一个引用计数器,每当有一个地方引用它时,计数器就+1;当引用失效时,计数器就-1;任何时刻计数器为0的对象就是不能再被使用的,即对象已“死”。引用计数法实现简单,判定效率也比
2022-01-12 19:39:21 312
原创 深入浅出Java虚拟机(二)——Java内存模型
前言我们从一个问题入手来进行对JVM的深入理解。JVM的内存区域是怎么高效划分的?为什么要问到 JVM 的内存区域划分呢?因为 Java 引以为豪的就是它的自动内存管理机制。相比于 C++的手动内存管理、复杂难以理解的指针等,Java 程序写起来就方便的多。然而这种呼之即来挥之即去的内存申请和释放方式,自然也有它的代价。为了管理这些快速的内存申请释放操作,就必须引入一个池子来延迟这些内存区域的回收操作。我们常说的内存回收,就是针对这个池子的操作。我们把上面说的这个池子,叫作堆,可以暂时把它看成一个
2022-01-12 19:37:55 294
原创 深入浅出Java虚拟机(一)——初识JVM
什么是JVMJVM 全称 Java Virtual Machine,也就是我们耳熟能详的 Java 虚拟机。它能识别 .class后缀的文件,并且能够解析它的指令,最终调用操作系统上的函数,完成我们想要的操作。一般情况下,使用 C++ 开发的程序,编译成二进制文件后,就可以直接执行了,操作系统能够识别它;但是 Java 程序不一样,使用 javac 编译成 .class 文件之后,还需要使用 Java 命令去主动执行它,操作系统并不认识这些 .class 文件。Java 程序和我们通常使用的 C++
2022-01-12 19:34:21 317
原创 java并发编程(三十八)——“死锁“的发生及修复策略
前言锁是我们之前常使用的并发工具,但有时候也会有一些问题,比如死锁。本文我们来了解下死锁相关的知识。简介死锁一定发生在并发场景中。我们为了保证线程安全,有时会给程序使用各种能保证并发安全的工具,尤其是锁,但是如果在使用过程中处理不得当,就有可能会导致发生死锁的情况。死锁是一种状态,当两个(或多个)线程(或进程)相互持有对方所需要的资源,却又都不主动释放自己手中所持有的资源,导致大家都获取不到自己想要的资源,所有相关的线程(或进程)都无法继续往下执行,在未改变这种状态之前都不能向前推进,我们就把这种状
2022-01-12 19:31:15 289
原创 java并发编程(三十七)——什么是自旋锁?
“自旋”可以理解为“自我旋转”,这里的“旋转”指“循环”,比如 while 循环或者 for 循环。“自旋”就是自己在这里不停地循环,直到目标达成。而不像普通的锁那样,如果获取不到锁就进入阻塞。
2022-01-09 12:29:02 345
原创 java并发编程(三十六)——初识读写锁
前言在没有读写锁之前,我们假设使用普通的 ReentrantLock,那么虽然我们保证了线程安全,但是也浪费了一定的资源,因为如果多个读操作同时进行,其实并没有线程安全问题,我们可以允许让多个读操作并行,以便提高程序效率。但是写操作不是线程安全的,如果多个线程同时写,或者在写的同时进行读操作,便会造成线程安全问题。我们的读写锁就解决了这样的问题,它设定了一套规则,既可以保证多个线程同时读的效率,同时又可以保证有写入操作时的线程安全。我们来学习下读写锁的规则及用法。读写锁简介读写锁的整体思路是它
2022-01-09 12:23:45 437
原创 java并发编程(三十五)——公平与非公平锁实战
前言在 java并发编程(十六)——锁的七大分类及特点 一文中我们对锁有各个维度的分类,其中有一个维度是公平/非公平,本文我们来探讨下公平与非公平锁。公平|非公平首先,我们来看下什么是公平锁和非公平锁,公平锁指的是按照线程请求的顺序,来分配锁;而非公平锁指的是不完全按照请求的顺序,在一定情况下,可以允许插队。但需要注意这里的非公平并不是指完全的随机,不是说线程可以任意插队,而是仅仅“在合适的时机”插队。那么什么时候是合适的时机呢?假设当前线程在请求获取锁的时候,恰巧前一个持有锁的线程释放了这把锁,那
2022-01-09 12:21:27 404
mybatis-log-plugin插件idea.zip
2020-05-15
elasticsearch-7.4.0-linux-x86_64.tar.gz
2020-05-15
HosptialOA.zip
2019-11-28
Rufus+v3.8+Build+1580.zip
2019-11-13
Navicat Premium.zip
2019-11-13
计算机系课程设计管理系统
2018-07-13
操作系统课程设计 模拟页面置换算法的实现 基于Qt
2018-07-07
基于Qt开发的12306汽车售票系统
2018-07-07
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人