- 博客(352)
- 收藏
- 关注
原创 using filesort优化方案
问题:如果我们排序的时候,不能直接通过有序的索引直接返回排序数据,需要通过内存或者文件排序时,用explain关键字来解释sql时辉出现using filesort,进行了额外的排序,这样会使得排序的效率不高,通常是我们优化的重点方向。2.索引的维护成本很高,如果不好加索引,那么尽量不要使用select *的方式,只查询出需要的字段,这样可以减少需要查询的数据量,可以使用全字段排序和内存排序。1.如果排序的字段是索引,那么查询的数据直接就是有序的,不需要再进行二次的排序。mysql排序的过程。
2024-08-13 19:05:32
264
原创 适配器模式
聋哑人期望获的手语信息,而播音员提供的是语音信息,两者之间不兼容,所以需要手语播音员来作为适配器来转换信息,注意这个不兼容通常是不可调和的矛盾,例如聋哑人一下子治好不现实,或者让播音员不说话,只用手势也不现实,因为要照顾更多的正常人收听新闻。在日常开发中,我们可能经常需要跟外部接口交互,而我们的接口可能不跟外部的接口兼容,例如我们接口需要的是json格式,而外部接口是xml格式,或者报文的字段名不一致,这个时候就可以使用适配器模式。ITarget目标接口类。Adaptee 适配类。Adapter被适配类。
2024-02-01 10:20:58
627
原创 浅谈ICMP协议
ICMP(Internet Control Message Protocol) 网络控制消息协议是网络层的协议,所谓控制,指的是通过下发指令来判断是否当前主机可达目标主机及不可达时的错误报告。通常使用ping命令和traceroute命令来使用。traceroute命令:检测到目标主机中间经过了哪些路由器,并判断最终是否可达目的主机。ping命令:检测到目标主机是否可达、
2024-01-26 19:21:16
225
原创 leetcode 141 环形链表
解题思路:链表类的题,很多都可以使用快慢指针来解决,本题也可以使用快慢指针,如果有环,那么最后快慢指针指向的元素必定相同。leetCode141题:判断一个给定的链表是否有环。
2024-01-21 21:24:56
413
原创 浅谈ARP协议
ARP是 address resolution protocol的缩写,意思是地址解析协议,处于OSI七层模型的网络层,它的作用是根据Ip地址找到mac地址,实际上我们需要访问某一个ip时,是要先找到它的mac地址,也就是物理地址才行的,那么当本机第一次访问一个Ip时,需要通过广播arp请求,传送本机的Ip,mac地址以及目标的ip,然后目标ip收到请求后,会返回它的mac地址,然后本机收到回复后将目标ip和目标mac地址给缓存下来。下面展示一个arp请求的抓包过程,只需要在我们本地ping一个ip即可。
2024-01-20 21:55:19
422
原创 Leetcode160 两个链表是否相交
此题可以说是算法界第一深情,如果我走过你走过的路,那么我们就可能会相遇。leetcode 160题,判断两个链表是否相交。
2024-01-10 21:30:08
433
原创 leetcode231 判断一个给定的整数是否是2的n次幂
解题思路:用二进制来判别,因为2的n次幂是低位为1,末尾全为0的形式,类似a10000...这种形式,那么n - 1 就是a011111...的形式,用N & N - 1的结果为零,即可判断出来。先考虑边界条件,如果一个数小于等于零,那么肯定就不是2的N次幂。
2024-01-05 22:09:22
467
原创 利用堆来解决数组的topK问题
可以利用堆来解决这个问题,将数组的元素依次加入最小堆,然后如果堆的大小超过了K,则将堆顶的元素删除,这样,最后堆顶的元素就是第K大的元素,附上java的代码。leetcode 215 数组的第K大元素。
2024-01-03 20:11:40
351
原创 谈谈cpu cache line对程序代码的影响
为了解决cpu运行速度和内存速度不匹配的问题,引入了cpu三级缓存,L1,L2,L3.其中缓存是以缓存行为基本单位的,每次取数据都是取一个缓存行的数据,批量读取。所以肯能会出现多个cpu共享缓存行时,需要进行同步数据的工作。下面就是通过将共享数据放入两个缓存行来提高运行速度的例子,Java中的Thread类也有@Contented也是类似作用。可以看到,利用cpu cache line的特性可以提高约4倍左右的性能。将注释的代码放开,将共享数据放入两个缓存行,运行结果。
2023-12-27 17:26:01
408
原创 毒酒问题算法题
题目:有1000瓶酒,其中一瓶有毒,毒性一周以后会爆发,现在拿小白鼠来做实验,问最少需要多少只小白鼠,才能一周之后知道哪一瓶酒有毒?答案:10只,1000转化成二进制,最多10位,2^10 = 1024 > 1000,最后通过取交集的方式可以判断出哪一瓶酒有毒。
2023-12-26 15:18:37
479
原创 java-thread-affinity线程绑核
通过将线程绑定到指定的cpu上,可以提高执行效率。因为每次都是相同的cpu,可以充分利用高速缓存,在java中可以使用以下依赖来使用。具体使用可以自行查阅。
2023-09-02 19:51:46
320
原创 XML与JAVA对象之间的相互转换
(Java Architecture for XML Binding简称JAXB)允许Java开发人员将Java类映射为XML表示方式.使用起来极其的方便。先看一下JAXB的源码注释。jdk中默认提供了一个。1.创建java对象 Person。查看person.xml内容。下面来写一个简单的例子。
2023-05-11 11:12:17
201
1
原创 Mybatis使用java方法返回调用的sql语句
3.使用@SelectProvider,@UpdateProvider,@InsertProvider,@DeleteProvider通过调用java方法返回sql语句。2.使用@Select,@Update,@Insert,@Delete在注解里面写上sql。1.在mapper.xml中定义sql语句,关联dao中的接口方法。我们在使用mybatis时,可以有三种方式。下面看下源码中的注释SelectProvider。
2023-04-29 22:05:30
629
原创 mysql数据碎片整理
mysql中的表在delete操作后并没有真的清理调,而是标记为已删除,内存空间依然占用,后续插入的时候会优先使用这些碎片。这些碎片的存在会加大存储空间的占用,还会导致查询效率的降低,定期的清理mysql表的碎片还是很有必要的,清理碎片可以使用Optimize table tab_name语句。但是清理碎片会导致锁表,所以清理周期不能太频繁。
2023-04-21 10:38:52
403
原创 非@Controller类中的@RequestMapping无效问题
如果我们在非@Controller类中,使用@RequestMapping注解,会发现它是无效的,原因是springMvc在解析@RequestMapping注解时只会解析类上标注有@Controller注解或者@RequestMapping注解的类,参见源码如下。
2022-12-20 16:01:40
927
原创 springmvc参数绑定转换器
最近发现了一个问题,当我们使用springmvc参数绑定的时候,如果我们用整形来接收,那么即使有空格,也不会报错。猜测它应该是接收到参数后进行了一个trim操作,于是跟踪源码去看了一下。springmvc中将字符串转换成数字用的是。继续跟进NumberUtils.parseNumber方法。所以确实是经过了一次trim操作。
2022-11-15 14:30:32
245
原创 java集合中的fail-fast与fail-safe两种模式
线程不安全的集合在获取迭代器迭代的时候,如果集合中的元素发生了变化,例如新增或者删除,由于线程不安全,迭代器在next时会直接抛出concurrentModificationException,通过内部的一个modCount判断是否等于expectedModCount来进行比较。可以看到j.u.c包下的线程安全的集合在迭代的过程中,如果集合的元素发生了修改,并不会抛异常,这就是fail-safe机制,但是缺点就是元素的修改并不会立刻反映出来,适用于读多写少的场景。fail-safe案例。
2022-11-14 11:18:19
334
原创 索引下推(index condition pushdown)
索引下推通常都是发生在联合索引的时候,当索引中包含所有需要过滤的条件时,就会直接在索引中过滤。通过explain查看执行引擎,可以看到using index condition的字样。索引下推是mysql 5.6版本做的一个优化,本质上是将server层做的过滤的工作下推到引擎层,从而减少了回表的操作,提高了效率。
2022-11-07 17:49:48
359
原创 netty时间轮
netty的时间轮是一种环形数组结构,包含槽位和时间间隔,可以实现延时队列的任务。下面写一个HelloWorld程序。1.先引入netty依赖。
2022-11-07 10:39:26
418
原创 局域网Ip范围
ip地址分为公网Ip和局域网ip,其中公网Ip通常做为服务器来使用,所有人都可以访问,而私网ip通常限定在一定区域或一定组织内相互访问。3.C类网段:192.168.0.1 - 192.168.255.254。2.B类网段:172.16.0.1 - 172.31.255.254。1.A类网段:10.0.0.1 - 10.255.255.254。内网Ip分为三个网段。
2022-11-03 18:31:38
8164
原创 正则表达式匹配行首和行尾
在平常我们经常有这样的一种场景,需要在行首或者行尾加上一个分号或者双引号,这个时候如果每行都是对齐的,我们可以使用列编辑的方式,如果每行不是对齐的,怎么办呢?我们可以使用正则表达式来匹配行首和行尾。行首: ^行尾: $然后我们就可以批量的来对行首和行尾进行处理了。...
2022-05-28 23:49:19
8433
1
原创 Beetl入门
Beetl是一种模板引擎,相对于其他java模板引擎,具有功能齐全,语法直观,性能超高,以及编写的模板容易维护等特点。使得开发和维护模板有很好的体验。是新一代的模板引擎。总得来说,它的特性如下:功能完备:作为主流模板引擎,Beetl具有相当多的功能和其他模板引擎不具备的功能。适用于各种应用场景,从对响应速度有很高要求的大网站到功能繁多的CMS管理系统都适合。Beetl本身还具有很多独特功能来完成模板编写和维护,这是其他模板引擎所不具有的。 非常简单:类似Javascript语法和习俗,只要半小时就..
2022-03-21 21:39:31
538
原创 guava LoadingCache
guava中提供了LoadingCache本地缓存,可以很方便的使用本地缓存。 eg:public class TestCache { public static void main(String[] args) throws ExecutionException { LoadingCache<Integer, String> cache = CacheBuilder.newBuilder().expireAfterAccess(...
2022-02-17 17:42:42
316
原创 找到最接近的2的n次方
public class Test { public static void main(String[] args) { System.out.println(ceilingPowerOfTwo(1)); System.out.println(ceilingPowerOfTwo(3)); System.out.println(ceilingPowerOfTwo(5)); System.out.println(ceilingPower.
2022-02-14 17:13:00
651
原创 spring事件机制
通过applicationContext.publishEvent这种方式发送的事件,默认是同步处理,如果在listener那里通过加上@Async则可以变成异步处理。
2022-02-08 09:44:48
356
原创 基于Files.walkFileTree来删除文件夹
nio中新提供了Files类可以很方便的操作文件,可以使用walkFileTree来实现之前需要递归才能进行的一些操作,例如文件夹的删除,文件夹的遍历。其中walkFileTree方法通过访问者模式可以很方便的让我们可以对文件进行一个操作。 public class TestFilesWalkFileTree { public static void main(String[] args) throws IOException { Path mydir =...
2022-01-21 12:36:08
694
原创 nio 中channel和buffer的基本使用
public class Test { public static void main(String[] args) { try (FileChannel channel = new FileInputStream("test.txt").getChannel()) { ByteBuffer byteBuffer = ByteBuffer.allocate(10); while (true){ .
2022-01-20 23:22:01
227
原创 netty解决tcp粘包和拆包问题
tcp为了提高效率会将多个数据包批量发送过来,所以就会存在粘包和拆包的问题。使用Netty,可以通过自定义协议+编解码器来解决粘包和拆包的问题。1.定义协议public class MessageProtocol { private int len; private byte[] content; public int getLen() { return len; } public void setLen(int len) {
2022-01-20 21:59:01
2862
原创 Netty心跳检测
Netty提供了一个handler (IdleStateHandler) 可以很方便的来实现心跳检测机制,而心跳检测机制是分布式里面服务存活状态的一种检测机制,非常的重要。 public class NettyServer { public static void main(String[] args) throws Exception{ NioEventLoopGroup bossGroup = new NioEventLoopGroup(1); ..
2022-01-20 09:17:03
243
原创 非递归方式实现的二叉树的遍历
中序遍历是 左--》中--》右的顺序,可以考虑先找到所有左节点,然后按照先进后出栈的结构来实现。先来一个简单的二叉树。 public class BinarySearchTree { Node root; public void add(Integer value){ if(root == null){ root = new Node(value); return; } ...
2022-01-18 18:59:58
187
原创 Netty实现Http服务器
基于Netty可以很轻松的实现一个自己的服务器。 import io.netty.bootstrap.ServerBootstrap;import io.netty.buffer.ByteBuf;import io.netty.buffer.Unpooled;import io.netty.channel.*;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.SocketCh...
2022-01-18 11:44:34
2304
原创 线程池中的任务抛异常了会怎么样
线程池可以通过execute和submit两种方式来提交任务。先看使用execute方式提交任务 /** * Main worker run loop. Repeatedly gets tasks from queue and * executes them, while coping with a number of issues: * * 1. We may start out with an initial task, in whic...
2022-01-18 10:32:18
209
原创 stream分组求和
如何用Streamapi进行分组求和,可以使用Collectors.groupby(**, Collectors.summingInt(**))来进行分组求和。 public class Test { public static void main(String[] args) { Student student1 = new Student(1, 1); Student student2 = new Student(1, 1); ...
2022-01-17 21:19:50
15799
原创 基于Netty实现的服务端和客户端
NettyServerpublic class NettyServer { public static void main(String[] args) throws Exception{ NioEventLoopGroup bossGroup = new NioEventLoopGroup(); NioEventLoopGroup workerGroup = new NioEventLoopGroup(); try {
2022-01-14 13:21:04
210
原创 Jedis lettuce redisson的对比
jedis是同步阻塞式的,类似于Jdbc,是非线程安全的,多线程使用时需要使用连接池。 using Jedis in a multithreaded environmentYou shouldn't use the same instance from different threads because you'll have strange errors. And sometimes creating lots of Jedis instances is not good enoug...
2022-01-14 13:18:58
652
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人