- 博客(48)
- 收藏
- 关注
原创 redis学习笔记(一)单线程的redis为什么快?
redis是单线程吗?我们经常能听到这样的说法:Redis 是单线程。redis单线程主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,这也是 Redis 对外提供键值存储服务的主要流程。 但 Redis 的其他功能,比如持久化数据、异步删除、集群数据同步等,其实是由其他的线程执行的。 所以,严格来说,redis 并不是单线程,但是我们一般把 redis 称为单线程(键值对存储服务)。redis为什么用单线程?要了解这个问题,首先得知道多线程的开销。“使用多线程,可以
2021-08-19 22:59:22
264
原创 JVM与CPU之间的联系
JVM结构图程序计数器记录正在执行的虚拟机字节码指令的地址(如果正在执行的是本地方法则为空)。#Java 虚拟机栈每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息。从方法调用直至执行完成的过程,对应着一个栈帧在 Java 虚拟机栈中入栈和出栈的过程。可以通过 -Xss 这个虚拟机参数来指定每个线程的 Java 虚拟机栈内存大小,在 JDK 1.4 中默认为 256K,而在 JDK 1.5+ 默认为 1M:该区域可能抛出以下异..
2021-05-26 23:28:20
17532
原创 Java中的 InterruptedException 异常
什么是InterruptedException异常Thrown when a thread is waiting, sleeping, or otherwise occupied, and the thread is interrupted, either before or during the activity. Occasionally a method may wish to test whether the current thread has been interrupted, and
2021-05-07 21:35:59
18086
原创 JVM类加载机制以及双亲委派模型
概述将.java文件编译成.class字节码文件的过程是编译期。从.class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可被虚拟机直接使用的Java类型的过程就是运行期,也就是标题所说的类加载过程。(红色框代表的就是类加载过程)具体过程『加载』->『验证』->『准备』->『初始化』->『卸载』这五个阶段的顺序是确定的,而『解析』可能为了支持Java的动态绑定会在『初始化』后才开始 上述阶段通常都是互相交叉地混合式进行的,比如会在一.
2021-03-08 23:15:20
155
原创 自旋锁原理及其应用场景
题外话自旋锁不是一种锁(类型),自旋锁是线程没有获取到锁时的一种等待策略。自旋锁的提出背景由于在多处理器环境中某些资源的有限性,有时需要互斥访问(mutual exclusion),这时候就需要引入锁的概念,只有获取了锁的线程才能够对资源进行访问,由于多线程的核心是CPU的时间分片,所以同一时刻只能有一个线程获取到锁。那么就面临一个问题,那么没有获取到锁的线程应该怎么办?通常有两种处理方式:一种是没有获取到锁的线程就一直循环等待判断该资源是否已经释放锁,这种锁叫做自旋锁,它不用将线程阻.
2021-01-25 22:55:19
3067
原创 dubbo服务暴露的原理
前言使用dubbo也有一段时间了,一开始啃文档的时候都是做的书面笔记,现在搬运到博客来。基本概念consumer代表服务调用方,provider代表服务提供方,registry代表注册中心。当服务提供方启动时会将自己的信息(服务ip,port等)记录在注册中心,这样在调用方调用的时候,会先从注册中心获取到提供方的基本信息,然后发送网络请求给provider完成调用;同时consumer在启动的时候,会向注册中心订阅消息,这样就能在provider发生变更的时候获取到最新的信息,保..
2020-11-30 00:11:48
615
原创 说一说乐观锁及其使用场景
前言关于乐观锁在很多书中都有所提及,这里推荐《Java并发编程的艺术》以及《Java并发编程实战》。何为乐观锁乐观锁就是乐观的认为:每次去拿数据的时候都认为别人不会修改,觉得不值得上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于write_condition机制,其实都是提供的乐观锁。在Java中JUC包下面的原子变量类就是使用了乐观锁的一种实现方式CAS实现的(CAS.
2020-10-11 21:29:19
4927
1
原创 使用redis中的zset实现实时排行榜
前言redis在业务开发中会被频繁使用,zset是其中一种特殊用法,zset具排行榜的天然特性,我前几个月在一次开发中使用到了zset,就是因为涉及到要实现一个排行榜,那是我第一次用到zset,虽然之前都看过redis几种数据类型的数据结构及其使用方法,但是真正用起来的时候,还是有一些细节的东西要处理的。产品需求用户在某条赛道上的跑步数据排行榜,以用户完成赛道的最佳成绩(最快圈速)为排序,做出排行榜。当时产品给的需求是排行榜要实时变更,之前我们app里面也有其他业务的排行榜,但都是月排.
2020-10-06 17:21:56
4178
原创 实体类为什么要实现Serializable接口?必须吗?
前言国庆在家堕落好几天了,给自己充充电。序列化在rpc通信里面是避不开的一部分,可以把序列化这个操作简单看作是电话,A想跟B聊天,由于两个人都在家里,传播信息就需要媒介,序列化就相当于电话,A要跟B交流,就要通过电话互相发送消息。有个常见的误解就是,"所有实体类都要实现Serializable接口",其实实体类不一定要实现Serializable接口,只有JDK自带的序列化才需要这么做,使用json序列化就不需要了。一、什么是序列化和反序列化?序列化:将对象状态信息转化成可以存储或传输的形.
2020-10-05 23:46:07
2544
原创 注册中心ZooKeeper、Eureka、Nacos对比
前言对比之前先说一下CAP理论,因为这三个注册中心最主要区别就在这里。CAP理论CAP理论是分布式架构中重要理论一致性(Consistency) (所有节点在同一时间具有相同的数据) 可用性(Availability) (保证每个请求不管成功或者失败都有响应) 分隔容忍(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)关于P,在整个系统中某个部分,挂掉了,或者宕机了,并不影响整个系统的运作或者说使用,而可用性是,某个系统的某.
2020-09-06 23:24:44
10409
1
原创 TCP复习—— 重传、滑动窗口、流量控制、拥塞控制
重传机制超时重传重传机制的其中一个方式,就是在发送数据时,设定一个定时器,当超过指定的时间后,没有收到对方的ACK确认应答报文,就会重发该数据,也就是我们常说的超时重传。(TCP 会在以下两种情况发生超时重传:数据包丢失,确认应答丢失)快速重传快速重传的工作方式是当收到三个相同的 ACK 报文时,会在定时器过期之前,重传丢失的报文段。快速重传机制只解决了一个问题,就是超时时间的问题,但是它依然面临着另外一个问题。就是重传的时候,是重传之前的一个,还是重传所有的问题。为了解决不知..
2020-08-13 22:13:35
230
原创 使用Mongodb中的$nearSphere实现查询附近的元素
产品背景:需要根据客户端传过来的用户gps坐标查看附近1km是否有跑步路线。技术背景:该项目使用的数据库是mongodb。(内心背景:想顺便学习mongodb)经查阅mongodb相关文档,发现Mongodb中的$nearSphere很适合这个场景,于是经技术评审后决定采用$nearSphere来做。定义 $nearSphere 指定地理空间查询从最近到最远返回文档的点。 MongoDB 使用球面几何计算$nearSphere的距离。 $nearSphere需要地理空间索.
2020-07-28 14:56:09
2190
2
原创 分布式事务之最终一致性
实例描述比如有订单,库存两个数据,一个下单过程简化为,加一个订单,减一个库存。 而订单和库存是独立的服务,那怎么保证数据一致性。这时候我们需要思考一下,怎么保证两个远程调用“同时成功”,数据一致?请大家先注意一点远程调用最郁闷的地方就是,结果有3种,成功、失败和超时。 超时的话,成功失败都有可能。而超时的结果是无法预测的,超时之后可能成功也可能失败,如果超时重试成功,但是本地事务已经回滚,而消息却消费成功了,这时候就不一致了。一般的解决方案,大多数的做法是借助mq来做最终一致。(目前只有ro
2020-07-13 10:47:21
1002
原创 @Transactional跟@DS动态数据源注解冲突
背景前阵子写一个项目时,有个需求是要往3个库,3个表里插入数据,在同一个方法里,公司是用baomidou的@DS注解来实现配置动态数据源的。这是背景,然后呢,我在一个service方法里,就操作了这三张表,同时,我还加上了@Transactional注解,因为该方法是个save方法,我就加上了事务。伪代码如下:spring: datasource: dynamic: primary: A datasource: A: ...
2020-06-04 18:09:47
13354
7
原创 Netty学习(3) ——Netty组件介绍以及组件间的交互
Bootstrap、ServerBootstrapBootstrap意思是引导,一个Netty应用通常由一个Bootstrap开始,主要作用是配置整个Netty程序,串联各个组件,Netty中Bootstrap类是客户端程序的启动引导类,ServerBootstrap是服务端启动引导类。Future、ChannelFuture在Netty中所有的IO操作都是异步的,不能立刻得知消息是否被正...
2020-03-09 22:22:22
302
原创 Netty学习之零拷贝(OS零拷贝与Netty零拷贝)
前言:Netty作为异步事件驱动的网络框架,高性能主要来自于其I/O模型和线程处理模型,前者决定如何收发数据,后者决定如何处理数据。一、Netty高性能的原因总结 : 基于I/O多路复用模型 零拷贝(用户空间里的零拷贝) 基于NIO的Buffer 基于内存池的缓冲区重用机制 无锁化的串行设计理念 I/O操作的异步处理 提供...
2020-03-08 22:11:48
245
原创 说说spring的事务传播机制
背景:实习期间几次遇到事务方法,有一次本地测试时发现事务没有回滚,就把简单描述写在wx上,今天来给spring事务做个自我总结。1、why为什么会有事务传播机制?场景一: serviceA 方法调用了 serviceB 方法,但两个方法都有事务,这个时候如果 serviceB 方法异常,是让 serviceB 方法提交,还是两个一起回滚。 场景二:serviceA 方法调用了 ...
2020-03-07 16:03:25
2987
1
转载 什么是IO多路复用?
服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种:(1)同步阻塞IO(Blocking IO):即传统的IO模型。(2)同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。注意这里所说的NIO并非Java的NIO(New IO)库。(3)IO多路复用(IO Multiplexing):即经...
2020-02-14 00:03:03
1419
原创 Netty学习(1)——reactor模式以及reactor模式在netty中的应用
一、什么是reactor模式?reactor模式翻译过来叫做反应器模式,通常我们都直接叫做reactor模式。reactor模式是一种事件驱动模式,用于处理一个或者多个客户端发过来的请求,服务端会有一个处理器对到来的请求进行分离,并且将这些请求分发给对应的请求处理器进行处理。reactor的结构图大概如下图所示二、reactor模式的角色构成从上面的结构图可以看出,Reacto...
2020-02-13 15:54:02
295
原创 synchronized锁优化
在jdk6以后,synchronized已经有了很大的优化,显得不再笨重,所以一般如果我们对lock的优化并不那么好的情况下,都使用synchronized是最佳选择。从 JVM 规范中可以看到 Synchonized 在 JVM 里的实现原理,JVM 基于进入和退出 Monitor 对象来实现方法同步和代码块同步,但两者的实现细节不一样。代码块同步是使用 monitorenter 和 mon...
2020-02-05 23:25:03
221
原创 dubbo笔记(实习期间做做学习笔记)
注:本篇笔记比较杂乱,学到哪写到哪,没有顺序可言哦Dubbo里面有哪几种节点角色?1、provide:暴露服务的服务提供方2、consumer:调用远程服务的服务消费方3、registry:服务注册于发现的注册中心4、monitor:统计服务调用次数和调用时间的监控中心5、container:服务运行容器dubbo都支持什么协议,推荐用哪种?1、dubbo://(推荐...
2019-12-08 23:11:00
148
原创 线程的优先级与yield()、sleep()方法之间的关系
线程优先级从0-10,一般常用三个值表示0(最低) ,5(默认),10(最高)。线程的优先级并不是表示优先级高的线程会先执行,低的后执行,而是表示CPU切换到该线程的几率会增加。yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达...
2019-11-03 15:18:23
286
原创 通过javap反编译来看锁优化
public static void main(String[] args) throws InterruptedException { StringBuffer sb = new StringBuffer(); sb.append("a"); } public static String concatString(String s1, ...
2019-10-26 23:51:49
107
原创 IO多路复用和线程池哪个效率更高,更有优势?
多路复用的优势在于,当处理的消耗对比IO几乎可以忽略不计时,可以处理大量的并发IO,而不用消耗太多CPU/内存。这就像是一个工作很高效的人,手上一个todo list,他高效的依次处理每个任务。这比每个任务单独安排一个人要节省(雇人是要发工资的……)。典型的例子是nginx做代理,代理的转发逻辑相对比较简单直接,那么IO多路复用很适合。相反,如果是一个做复杂计算的场景,计算本身可能是个 指数复杂度...
2019-10-19 16:09:33
709
转载 springCloud统一配置(springcloud bus + webhooks)
前言微服务要实现集中管理微服务配置、不同环境不同配置、运行期间也可动态调整、配置修改后可以自动更新的需求,Spring Cloud Config同时满足了以上要求。Spring Cloud Config 分为Config Server和Config Client两部分,是一个可以横向扩展,集中式的配置服务器。spring boot config支持三种存储方式:本地资源、SVN、GIT。这里...
2019-08-08 19:27:35
245
转载 Syschronized的底层实现原理以及各种锁的理解
java中每个对象都可作为锁,锁有四种级别,按照量级从轻到重分为:无锁、偏向锁、轻量级锁、重量级锁。每个对象一开始都是无锁的,随着线程间争夺锁,越激烈,锁的级别越高,并且锁只能升级不能降级。java对象头 锁的实现机制与java对象头息息相关,锁的所有信息,都记录在java的对象头中。用2字(32位JVM中1字=32bit=4baye)存储对象头,如果是数组类型使用3字存...
2019-06-25 19:38:32
183
原创 JVM为对象分配内存的细节
Java调用new object()会创建一个对象,这个对象会被分配到JVM的堆中。那么这个对象到底是怎么在堆中保存的呢? 首先,new object()执行的时候,这个对象需要多大的空间,其实是已经确定的,因为java中的各种数据类型,占用多大的空间都是固定的(对其原理不清楚的请自行Google)。那么接下来的工作就是在堆中找出那么一块空间用于存放这个对象。 在...
2019-04-18 17:26:04
534
转载 同步IO、异步IO、阻塞IO、非阻塞IO之间的联系与区别
POSIX同步IO、异步IO、阻塞IO、非阻塞IO,这几个词常见于各种各样的与网络相关的文章之中,往往不同上下文中它们的意思是不一样的,以致于我在很长一段时间对此感到困惑,所以想写一篇文章整理一下。POSIX(可移植操作系统接口)把同步IO操作定义为导致进程阻塞直到IO完成的操作,反之则是异步IO按POSIX的描述似乎把同步和阻塞划等号,异步和非阻塞划等号,但是为什么有的人说同步IO...
2019-04-18 12:32:13
107
转载 为什么只需要一个eden而需要两个survivor?
在JVM的新生代内存中,为什么除了Eden区,还要设置两个Survivor区?1 为什么要有Survivor区先不去想为什么有两个Survivor区,第一个问题是,设置Survivor区的意义在哪里?如果没有Survivor,Eden区每进行一次Minor GC,存活的对象就会被送到老年代。老年代很快被填满,触发Major GC(因为Major GC一般伴随着Minor GC,也可以...
2019-03-20 13:19:40
184
原创 springMVC在tomcat中的初始化
在spring Web中,需要初始化IOC容器,用于存放我们注入的各种对象。当tomcat启动时首先会初始化一个web对应的IOC容器,用于初始化和注入各种我们在web运行过程中需要的对象。当tomcat启动的时候是如何初始化IOC容器的,我们先看一下在web.xml中经常看到的配置:<context-param> <param-name>contextConfig...
2019-03-06 15:34:03
812
1
原创 springMVC处理请求流程及原理
1、SpringMVC 的运行流程 · 用户发送请求至前端控制器DispatcherServlet ·DispatcherServlet收到请求调用HandlerMapping处理器映射器。 ·处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。 ·Dis...
2019-02-28 21:57:59
1258
原创 Java内存模型总结(《深入理解java虚拟机》读后感)
近几天看了《深入理解java虚拟机》与《java并发编程的艺术》两书,感触良多,趁脑热写下博文。 多核 CPU,多线程:每个核都至少有一个 L1 缓存。多个线程访问进程中的某个共享内存,且这多个线程分别在不同的核心上执行,则每个核心都会在各自的 Cache 中保留一份共享内存的缓冲。由于多核是可以并行的,可能会出现多个线程同时写各自的缓存的情况,而各自的 Cache 之间的数据就有可...
2019-02-16 16:08:21
158
原创 解决并发编程中原子性、有序性和一致性的几个方法。
JMM 是一种规范,是解决由于多线程通过共享内存进行通信时,存在的本地内存数据不一致、编译器会对代码指令重排序、处理器会对代码乱序执行等带来的问题。目的是保证并发编程场景中的原子性、可见性和有序性。下面我们就再来看下,在 Java 中,分别使用什么方式来保证。 原子性在 Java 中,为了保证原子性,提供了两个高级的字节码指令 Monitorenter 和 Monitorexit...
2019-02-16 15:14:19
631
1
原创 spring aop实现身份认证
1、AOP核心概念1、横切关注点对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点2、切面(aspect)类是对物体特征的抽象,切面就是对横切关注点的抽象3、连接点(joinpoint)被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器4、切入点(pointcut)对...
2018-11-21 15:46:47
989
原创 chrome插件Restlet client安装(项目开发利器,模拟http请求)
官网是 https://restlet.com/modules/client/能翻墙的话就在官网下载。不能翻墙则点击下面链接下载。链接: https://pan.baidu.com/s/13yh5Eg0epEV2t975SnaSvw 提取码: rb8e 下载成功后是个crx文件,打开chrome,右上角,更多工具,扩展程序,然后将开发者模式选中 将刚刚下...
2018-11-06 20:38:24
3797
3
原创 大三笔记(layui弹出层完成数据更改后重载表格)
重载本级表格: layer.confirm('真的删除行么', function(index){ deleterow(data.student_id);//逻辑操作 layer.msg("删除成功");//提示 obj.del(); //删除行 layer.close(index); table.reload('ldh',{...
2018-10-28 13:46:03
6152
原创 大三笔记(ajax传递json对象给controller,controller封装为java对象后存入数据库)
首先来看一个注解@RequestBody 1、@requestBody注解常用来处理content-type不是默认的application/x-www-form-urlcoded编码的内容,比如说:application/json或者是application/xml等。一般情况下来说常用其来处理application/json类型。 2、 通过@requestBody...
2018-10-25 20:23:02
2229
原创 大三笔记(mvc:annotation-driven配置与中文乱码问题)
<mvc:annotation-driven/>:这个类主要是用来向工厂中注册了RequestMappingHandlerMapping BeanNameUrlHandlerMappingRequestMappingHandlerAdapterHttpRequestHandlerAdapterSimpleControllerHandlerAdapterExc...
2018-10-25 20:03:17
931
原创 大三笔记(ssm项目中使用layui进行分页)
本篇文章较为简单,实现的功能是分页。下面贴代码。<script src="layui.js" charset="utf-8"></script><!-- 注意:如果你直接复制所有代码到本地,上述js路径需要改成你本地的 --><script>layui.use('table', function(){ var table =...
2018-10-18 20:11:05
1457
3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人