自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 收藏
  • 关注

原创 Java中的偏向锁、轻量级锁和重量级锁

在 JDK1.6 版本之前,所有的 Java 内置锁都是重量级锁。重量级锁会造成 CPU 在用户态与核心态之间频繁切换,所以代价高、效率低。JDK1.6 版本为了减少获得锁和释放锁所带来的性能消耗,引入了“偏向锁”和“轻量级锁”实现。......

2022-06-07 23:12:43 2092

原创 HTTP 长连接原理

1. HTTP长连接原理

2022-05-21 22:22:40 15078 2

原创 Netty的ByteBuf学习笔记

网络编程中,当我们要进行数据传输时,往往需要使用缓冲区,常用的缓冲区就是Java NIO类库提供的java.io.buffer,在NIO编程时,我们主要使用的是ByteBuffer。从功能角度而言,ByteBuffer完全满足NIO编程的需要,但是由于NIO编程的复杂性,ByteBuffer也有其局限性,它的主要缺点如下:ByteBuffer长度固定,一旦分配完成,它的容量不能动态扩展和收缩,当需要编码的POJO对象大于ByteBuffer的容量时,会发生索引越界异常; ByteBuf...

2022-04-18 14:48:55 688

原创 基于DDD(领域驱动设计)的微服务设计实例

DDD(Domain Driven Design,领域驱动设计)是一种行之有效的划分业务领域边界的方法,以帮助完成应用的拆分和微服务的设计。它会按照流程或功能边界分解业务领域,根据业务上下文边界,构建领域模型,并将其作为微服务设计的输入,是构建复杂应用的重要方法论之一。

2022-03-28 21:59:41 2799

原创 MySQL、主流NoSQL和消息队列、Redis的数据写安全

1、MySQL将 innodb_flush_log_at_trx_commit 设置为1,保证每次事务的结束都会触发Log Thread 将log buffer中的数据写入文件并通知文件系统同步文件,从而保证不论是MySQL Crash 还是OS Crash或者是主机断电都不会丢失任何已经提交的数据。2、MongoDBMongoDB的建议最小部署是一个复制集,包含3个数据节点。默认情况下应用的写操作(更新,插入或者删除)在主节点上完成后就会立即返回。写操作则通过OPLOG方式在后台异步方

2022-03-10 11:18:58 393

原创 Leo-IM,开源好用的IM(基于Netty开发)

Leo-IM,开源好用的IM。Leo-IM是基于Java语言、Netty框架、Vue+Element-UI开发的轻量级IM,服务端可独立运行(无需部署到web容器),HTTP服务和Socket服务可分开部署,使用基于Netty扩展的netty-rest-serverRESTful框架提供Web服务,简单易用,方便扩展。...

2021-09-29 17:17:44 2628 1

原创 基于K8s构建微服务系列 第三章 - 整体架构设计

一、基于Nacos的服务治理基于Nacos实现服务注册、发现与配置中心的整体架构Nacos作为服务的注册中心与配置中心; 微服务user-service启动时从Nacos拉取配置文件并在启动成功后将自身注册到Nacos; Web前端应用通过Nacos发现user-service的注册信息,并通过Feign实现客户端负载均衡; 基于Sentinel实现服务的限流、熔断与降级; 所有服务与中间件、数据库全部部署在K8s中。二、基于K8s的服务治理基于K8s Service做服务发.

2021-09-29 16:33:05 1826

原创 基于K8s构建微服务系列 第二章 - 环境准备

安装VirtualBox 下载地址:Downloads – Oracle VM VirtualBox 根据操作系统类型选择对应的安装包下载,下载后运行安装包,根据提示安装即可。 安装minikube 系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录 前..

2021-09-29 16:15:37 217

原创 基于K8s构建微服务系列 第一章 - 前言

当下越来越多的人选择用微服务的方式构建应用程序,相对传统的单体应用程序,微服务架构具有如下优势:易于扩展:微服务可独立运行,可根据需要对局部进行扩展。 开发效率高:微服务是高内聚、低耦合的独立单元,可以被小团队单独开发,团队成员可只关注某一特定的业务领域。 技术栈不受限:可以根据项目和团队的特点,选择最合理的技术栈。 可复用:微服务聚焦于某一业务领域的,如果设计和封装的足够好,可以做到拿来即用,避免重复造轮子。 便于维护:微服务足够小,易于被开发人员理解和维护。为了最大化利用微服务的这些优

2021-09-29 12:27:24 514

原创 基于Storm与Cassandra的实时计算与大数据实践

本文讲述了Storm如何整合Cassandra解决大量业务数据场景下的实时计算问题,文中描述的应用场景是作者实际工作中解决的业务需求,如转发请标注出处。原文地址:https://mp.weixin.qq.com/s/hMiOPVJY0wcLRW9KrtxbEg...

2018-12-20 13:17:00 478

原创 用redis实现的小游戏设计

前段时间接了一个H5游戏的后端开发任务,需求比较简单,就是在大会场里,几百、上千人分成若干组,在一段时间里同时摇手机,实时显示当前排名,最后看哪个组摇的最快,哪个人摇的最快。由于是所有用户同时摇手机,而且一秒钟之内要摇5-10下,假设一千人同时摇,可能在一秒钟内会有5000至10000次的写入请求,而且在写入后还要同时计算当前各组的排名和个人里前N名的排名,如果用关系数据库,可能会由于瞬间大量插入...

2018-07-13 11:24:11 908

原创 Spring bean的生命周期

正确理解Spring bean的生命周期非常重要,因为有的时候可能会利用Spring提供的扩展点来自定义bean的创建过程,同时Spring bean的生命周期也是面试时经常被提起的问题,所以写篇文章总结一下。先用一张图来展示一下bean装载到Spring应用上下文中的一个典型的生命周期过程:...

2018-07-07 17:43:43 368

原创 使用ArrayList时设置初始容量的重要性

ArrayList是Java中比较常用的一个类,它是基于数组实现,非线程安全,可快速随机访问List中的元素。ArrayList具有动态扩容的机制,每次在添加元素时,都会判断容量是否够用,如果不够用,则需要扩容。JDK1.8中,ArrayList的初始容量为0,第一次添加元素时,会将扩容代码如下: /** * Increases the capacity to ensure tha...

2018-07-06 11:18:36 10642 4

原创 MySQL性能优化

MySQL性能优化最近看了一篇MySQL优化的ppt,把相关知识点总结一下。让数据库多做它擅长的事情:尽量不在数据库做运算复杂运算移到程序端CPU尽可能简单应用MySQL举例:md5(xx字段)、ORDER BY RAND()合理分表不超载User idDateArea...一年内的单表数据:纯int不超过1000W,含char不超过500W,单库不超过300-400个表表字段少而精IO高效、全表...

2018-07-05 03:47:50 360

原创 Java+Netty、Vue+Element-UI实现的即时通信应用 leo-im

之前工作接触了几个开源的IM产品,再加上曾经用Netty实现过几个服务,于是就有了用Netty实现一个IM的想法,于是用业余时间写了一个IM,和喜欢Netty的程序员们分享。考虑到方便扩展,在服务端采用了Http+Socket结合的设计,客户端所有的请求都基于Http,如发送消息、修改个人信息等,所有的消息推送采用Socket方式即时推送到客户端,这样的设计可以在并发访问量大的情况下,将好Http...

2018-06-19 13:57:17 4275

原创 Java+Netty实现的RESTful框架--netty-rest-server

在工作中用Netty做了几个服务,感觉Netty做出来的程序性能好,资源占用少,但是实现Http服务比较麻烦,于是就参考Spring MVC的注解基于Netty实现了一个轻量级的RESTful框架。该框架提供了控制器注解、全局异常控制器、拦截器等功能。注解名称参考了Spring MVC,编译理解和记忆,主要包括如下注解:@RestController@RequestMapping@GetMappi...

2018-06-19 13:31:57 3866 1

原创 基于Vue+Spring MVC+MyBatis+Shiro+Dubbo开发的分布式后台管理系统

本文项目代码:服务端:https://github.com/lining90567/dubbo-demo-server前端:https://github.com/lining90567/dubbo-demo-client最近项目中使用了shiro做权限管理,在开发过程中也踩了一些坑,于是便有了开发个应用巩固一下所学知识的想法,正好在开发的过程里学习一下Vue开发。技术栈方面,现在前后端分离大行其道...

2018-03-02 15:54:24 3654

原创 简述Java类的“初始化”

Java虚拟机规范规定了有且只有5种情况必须立即对类进行初始化:1.使用new关键字实例化对象的时候、读取或设置一个类的静态字段(被final修饰、已在编译器吧结果放入常量池的静态字段除外)的时候,以及调用一个类的静态方法的时候。2.使用java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化。3.当初始化一个类的时候,如果发现其父

2017-08-16 23:16:34 582

原创 java多线程之ThreadLocal

java中的java.lang.ThreadLocal,为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序,ThreadLocal并不是一个Thread,而是Thread的局部变量。ThreadLocal很容易让人望文生义,想当然地认为是一个“本地线程”。其实,ThreadLocal并不是一个Thread,而是Thread的局部变量,也许把它命名为T

2017-07-11 14:40:25 316

原创 PostgreSQL jdbc driver的一个不完善之处

公司一个产品在上线到云以后,运行一段时间就会提示获取数据库连接失败,用 select * from pg_stat_activity; 查看所有连接,发现有很多连接最后一次执行的SQL语句是 SELECT t.typname,t.oid FROM pg_catalog.pg_type t JOIN pg_catalog.pg_namespace n ON (t.typspace = n.o

2017-07-04 15:50:30 2134

原创 java多线程之延迟初始化

有时候我们可能推迟一些高开销的对象的初始化操作,并且只有在使用这些对象时才进行初始化,开发者可以采用延迟初始化来实现该需求。但是要正确实现线程安全的延迟初始化还是需要一些技巧的,否则很容易出现问题。下面是一个非线程安全的延迟初始化的例子:public class UnsafeLazyInit { private static Instance instance; public st

2017-06-30 14:03:29 700

原创 java多线程之wait、notify和notifyAll

wait、notify和notify是Object类的3个final方法,这三个方法可以实现线程间的通信。在线程中调用Object的wait方法,将阻塞当前线程等待其它线程的通知,通知使用notify或notifyAll方法。当其它线程中调用了Object的notify或notifyAll方法后,将通知调用wait方法的线程继续执行wait后的代码。下边的例子有两个waiter和一个notif

2017-06-29 19:04:26 371

原创 java多线程之yield

java的Thread.yield,是暂停正在执行的线程,然后执行其他线程(包括被暂停的线程),但是无法保证执行yield方法的线程真正达到“让步”的目的,因为“让步”的线程也有可能被线程调度程序选中继续执行。class MyThread extends Thread { private String threadName; public MyThread(String threa

2017-06-29 10:44:12 339

原创 java多线程之join

java的Thread.Join,是把指定的线程加入到当前线程,也就是如果调用了某个线程的join方法,则后续线程必须等待该线程执行完成后才能执行。假设有三个线程,同时执行并输出当前线程的名称,输出后让线程sleep100毫秒,由于是并发执行,我们无法控制其输出的顺序,代码如下:public class ThreadJoinDemo { class MyThread extends

2017-06-29 09:59:33 230

原创 java多线程之synchronized

Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。然而,当一个线程访问object的一个加锁代码块时,另一个线程仍然可以访问该object中的非加锁代码块

2017-06-27 09:53:32 294

原创 python在windows下import其他模块的注意事项

初学python,在同一目录中创建了两个py文件:a.py和b.py,然后再a.py中import b.pyfrom . import b......在linux下执行没有问题,但是在windows下就提示  ImportError: cannot import name 'b'在网上搜了半天也没有找到问题所在,后来还是在google上找到了答案。原来是python会在sys.p

2017-06-22 17:46:46 2398

原创 Java实现流控-Semaphore

Java实现流控-Semaphore

2017-06-02 18:57:02 2653

转载 二叉树的Java实现及特点总结

转自:http://www.cnblogs.com/lzq198754/p/5857597.html二叉树是一种非常重要的数据结构,它同时具有数组和链表各自的特点:它可以像数组一样快速查找,也可以像链表一样快速添加。但是他也有自己的缺点:删除操作复杂。我们先介绍一些关于二叉树的概念名词。二叉树:是每个结点最多有两个子树的有序树,在使用二叉树的时候,数据并不是随便插入到

2017-06-02 16:09:56 380

转载 深入分析 ThreadLocal 内存泄漏问题

转自:http://blog.youkuaiyun.com/wudiyong22/article/details/52141608前言ThreadLocal 的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度。但是如果滥用 ThreadLocal,就可能会导致内存泄漏。下面,我们将围绕三个方面来分析 Threa

2017-06-02 13:42:48 302

转载 Java之:强引用、弱引用、软引用、虚引用

转自:https://my.oschina.net/ydsakyclguozi/blog/4043891、强引用(StrongReference)         强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。如下:Object o=new Object();   //  强引用当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryErr

2017-06-02 11:53:03 299

转载 快速排序算法原理及实现(单轴快速排序、三向切分快速排序、双轴快速排序)

转自:http://www.cnblogs.com/nullzx/p/5880191.html1. 单轴快速排序的基本原理快速排序的基本思想就是从一个数组中任意挑选一个元素(通常来说会选择最左边的元素)作为中轴元素,将剩下的元素以中轴元素作为比较的标准,将小于等于中轴元素的放到中轴元素的左边,将大于中轴元素的放到中轴元素的右边,然后以当前中轴元素的位置为界,将左半部分子数组和右半部

2017-06-02 10:39:09 1001

原创 堆排序

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。由于建初始堆所需的比较次数较多,

2017-06-01 15:31:37 209

原创 java实现插入排序

有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法。插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元

2017-06-01 15:09:32 245

原创 快速排序

快速排序的原理:选择一个关键值作为基准值。比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的)。一般选择序列的第一个元素。一次循环:从后往前比较,用基准值和最后一个值比较,如果比基准值小的交换位置,如果没有继续比较下一个,直到找到第一个比基准值小的值才交换。找到这个值之后,又从前往后开始比较,如果有比基准值大的,交换位置,如果没有继续比较下一个,直到找到第

2017-06-01 14:44:39 298

原创 冒泡排序

冒泡排序算法的实现原理:1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。3. 针对所有的元素重复以上的步骤,除了最后一个。4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。实现代码:public void sort

2017-06-01 14:39:36 318

原创 Java实现二分查找法

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以

2017-06-01 13:40:16 886

原创 基于guice、resteasy、mybatis和undertow实现的轻量级restful服务

前段时间一直在做公司的微服务项目,技术栈主要是Spring Boot+Thrift,感觉使用Spring Boot确实太方便了:1. 无xml配置。2. 自动配置。3. 应用可打包为单独的jar包独立运行。4. 可嵌入tomcat、jetty或undertow,无需部署war包。5. 使用Spring Data,以非常少的代码遍可以操作数据库。......但是由

2017-03-13 21:58:17 2629

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除