自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Java之上

微信公众号:Java之上

  • 博客(38)
  • 收藏
  • 关注

原创 【Java面试眼前一亮小技巧】Redis单线程有什么问题呢?

前言Redis作为常用的缓存方案,在Java面试中是必然会问的,那么在面试过程中有哪些知识点可以让面试官眼前一亮呢,今天我们就来讲一下Redis单线程的一些问题。面试模拟面试官:小伙子看你骨骼惊奇,必然是背八股文好手,问你几个Redis的问题吧,Redis为什么这么快来讲讲?这不简单!redis基于内存实现,不需要经过磁盘IO数据结构高效,动态字符串、跳表等数据编码合理,在不同长度使用不同的数据结构,比如说zset 对象中保存的元素个数小于及成员长度小于一定值使用 ziplist 编码,任意

2022-03-20 23:09:28 1509 1

原创 领域驱动设计落地方案

一、现实问题场景1需求评审产品大大:麻烦帮忙看一下xxx功能是什么逻辑,如果在xxx场景下能不能支持xxx我:稍等我看一下代码的具体实现一段时间后~我:之前代码是这样写的,xxx xxx,好像不行,但xxx这样改,可以支持场景2线上异常数据出现,技术支持让排查问题技术支持:入参xxx 出参xxx我:怎么会呢,这个入参怎么会走这段流程,按理说不应该走这边嘛,然后输出xxx二、问题原因技术实现对于产品大大来说是个黑箱,产品大大一般对于产品本身的大局规划有深度理解,但对于产品功能细节是如

2020-07-11 22:54:10 621

原创 领域驱动设计拙见

领域驱动设计并不是技术,而是一种思想,目的是为了降低业务代码复杂度。核心领域分层限界上下文(限界上下文这个名词有点唬人,按我个人理解其实就是领域的边界)一、领域二、分层三、限界上下文...

2020-04-23 23:14:18 401

原创 Tomcat NioEndpoint.Poller和Netty NioEventLoop OP_READ实现对比

一、Tomcat NioEndpoint.PollerNioEndpoint.Poller#run while(true) 处理监听到的感兴趣事件(SelectionKey#interestOps(int))NioEndpoint.Poller#processKey 迭代处理发生的事件2.1 unreg(sk, attachment, sk.readyOps()); 取消注册 sock...

2020-03-26 23:08:51 315

原创 响应式编程学习

Reactor一、概念响应式宣言We want systems that are Responsive, Resilient, Elastic and Message Driven.四个关键字:Responsive:即时响应性,系统尽可能及时响应。Resilient:回弹性,系统在出现故障时保持响应。通过复制,包含,隔离和委派来实现弹性。故障包含在每个组件中,使组件彼此隔离,从而确保...

2019-12-29 14:46:02 404

原创 RocketMQ延迟消息

一、Producer 延迟消息发送Message#setDelayTimeLevelpublic void setDelayTimeLevel(int level) { this.putProperty(MessageConst.PROPERTY_DELAY_TIME_LEVEL, String.valueOf(level));}二、Broker 保存消息CommitLog#p...

2019-11-17 20:28:25 667

原创 alibaba/COLA事件总线EventBus实现

很多时候我们会遇到这类场景,比如说“发生某件事情时”、“当什么产生变化时”、“如果什么状态变更时”,我们可以通过观察者模式来解耦,在领域驱动设计也称为领域事件。下文分析 https://github.com/alibaba/COLA 的实现方式。事件总线,以 EventBus#fireAll 方法为例,该方法会根据参数 EventI 获取具体的 EventHandler 并执行。EventHu...

2019-10-08 20:41:22 3666 1

原创 领域驱动设计基本概念学习

领域驱动设计整体架构Presentation Layer:表现层,负责显示和接受输入;Application Layer(Service):应用层,很薄的一层,只包含工作流控制逻辑,不包含业务逻辑;Domain Layer(Domain):领域层,包含整个应用的所有业务逻辑;Infrastructure Layer:基础层,提供整个应用的基础服务;定义实体-Entity,DDD...

2019-09-04 21:30:33 265

原创 Socket 和 SocketChannel 的 FileDescriptor

SocketImpl 和 SocketChannelImpl 都持有了 FileDescriptor,抽空看了一下底层有没有差别,发现其实是没有区别的。以 Windows 为例最终都调用了 winsock2.h 的 WINSOCK_API_LINKAGE SOCKET WSAAPI accept(SOCKET s,struct sockaddr *addr,int *addrlen); 函数。...

2019-08-21 19:13:45 1209

原创 Netty 4.x线程模型源码分析

Netty 线程池的类比较多,首先感受一下两大类 EventExecutor 和 EventExecutorGroup 的类继承结构。EventExecutor比较重要的就是两类SingleThreadEventLoop 派生出了一系列的 EventLoop,常用的就是NioEventLoop,每个SingleThreadEventLoop 都是一个单独的线程DefaultEventEx...

2019-07-21 21:10:17 248

原创 从框架源码看责任链实现

一、Servlet Filter1. ApplicationFilterFactory 创建 ApplicationFilterChain,并将 Filter 添加进去ApplicationDispatcher#invoke(ServletRequest, ServletResponse, State)private void invoke(ServletRequest request, S...

2019-06-25 18:54:16 300

原创 桥方法和注解

关于桥方法的定义见 https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.4.5在阅读一些框架时经常会看到调用org.springframework.core.BridgeMethodResolver#findBridgedMethod获取源方法。以前没有关注到这个点,最近自己在postProcessAft...

2019-06-19 20:34:08 698

原创 《MySQL实战45讲》个人总结

一、知识点未完成二、参数配置transaction-isolation:推荐配置为READ-COMMITTED。binlog_format参数format定义优点缺点statement记录的是修改SQL语句日志文件小,节约IO,提高性能准确性差,对一些系统函数不能准确复制或不能复制,如now()、uuid()等row(推荐)记录的是每行实际数据的变...

2019-06-06 14:30:54 7073

原创 秒杀系统设计

秒杀系统设计秒杀其实主要解决两个问题,一个是并发读,一个是并发写返回报文数据要尽量少请求数要尽量少合并 CSS 和 JavaScript 文件,把多个 JavaScript 文件,把多个 JavaScript 文件,在 URL 中用逗号隔开路径要尽量短要缩短访问路径有一种办法,就是多个相互强依赖的应用合并部署在一起,把远程过程调用(RPC)变成 JVM 内部之间的方法调用依赖要尽量...

2019-05-23 19:33:32 477

原创 Spring AbstractApplicationContext#refresh初始化过程

ContextLoaderListener.contextInitialized()ContextLoader.initWebApplicationContext()configureAndRefreshWebApplicationContext()AbstractApplicationContext.refresh()obtainFreshBeanFactory()AbstractRe...

2019-05-16 21:45:09 455

原创 从CompletableFuture学习Dubbo 2.7.x 全链路异步

CompletableFuture<String> objectCompletableFuture = CompletableFuture.supplyAsync(() -> { try { Thread.sleep(2000L); } catch (InterruptedException e)...

2019-04-25 21:25:03 1427 2

原创 SocketOutputStream和SocketChannel write方法的区别和底层实现

Java直接内存原理提到了SocketChannel#write的实现原理。通过IOUtil#write将java堆内存拷贝到了直接内存,然后再把地址传给了I/O函数。那么 BIO 是怎么实现往socket里面写数据的呢?BIOSocket#getOutputStream()获得SocketOutputStream三个write方法最后都会调用native方法SocketOutputSt...

2019-04-04 20:37:35 2897

原创 RocketMQ消息存储学习

Linux I/O首先简单学习一下Linux I/O虚拟文件系统(VFS)Linux内核在底层文件系统接口上建立的一个抽象层,该抽象层能够支持各种不同文件系统。RocketMQ存储架构图图片来自Apache RocketMQ 中国开发者钉钉群陈厚道老师的PPT[1]《Linux内核设计与实现》...

2019-03-19 23:33:50 565

原创 分布式锁学习

Redis分布式锁Redis文档中描述了单实例实现分布式锁的正确方法://添加锁SET resource_name my_random_value NX PX 30000//释放锁if redis.call(&amp;quot;get&amp;quot;,KEYS[1]) == ARGV[1] then return redis.call(&amp;quot;del&amp;quot;,KEYS[1])else return 0end...

2019-03-16 21:46:10 330

原创 Java直接内存原理

直接内存https://www.ibm.com/developerworks/library/j-nativememory-linux/index.html

2019-02-23 15:39:27 8352 2

原创 《Linux性能优化实战》—倪朋飞,内存部分学习笔记

图片来自极客时间,如有版权问题,请联系我删除。扫码加入学习!内存映射Linux内核给每个进程提供了一个独立的连续虚拟地址空间(独立!可以将进程内存隔离)。每个进程的虚拟地址分为内核空间和用户空间。但内核空间,其实关联的都是相同的物理内存。进程用户态只能访问用户空间内存;内核态可以访问内核空间内存。内存映射就是将虚拟内存地址映射到物理内存地址,内核为每个进程都维护了一张页表,记录映射关系...

2019-02-02 20:17:31 6913 2

原创 《Linux性能优化实战》—倪朋飞,CPU部分学习笔记

图片来自极客时间,如有版权问题,请联系我删除。扫码加入学习!平均负载top或uptime命令load average: 0.63, 0.83, 0.88指的是系统可运行状态和不可中断状态的进程数。可运行状态指的是正在使用cpu或正在等待cpu的进程。不可中断状态指的是内核态关键流程中,比如说等待硬件设备I/O响应(ps命令D状态)。一般平均负载**大于cpu数量的70%**...

2019-02-02 20:16:48 5880 2

原创 dubbo服务引用

ReferenceBean实现了InitializingBean接口,Spring初始化时会调用afterPropertiesSet() public void afterPropertiesSet() throws Exception { if (getConsumer() == null) { /*省略代码,读取consumerConfig,然后...

2019-01-31 22:06:28 735

原创 dubbo服务暴露

ServiceBean#onApplicationEvent(ContextRefreshedEvent)ServiceBean#export()ServiceConfig#doExport()首先校验该service的配置是否为空,则加载dubbo:provider、dubbo:module、dubbo:application缺省配置,若还为空则加载dubbo.properties的配置。...

2019-01-20 20:35:42 1235

原创 dubbo的一次请求源码分析

调用某个服务首先会进入到动态代理。InvokerInvocationHandler#invoke(Object proxy, Method method, Object[] args)public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String methodN...

2018-12-18 22:18:16 526

原创 Linux内存模型与top命令的关系

概念就简单写一下,google和baidu都可以搜到。物理内存与虚拟内存物理内存是内存条上的空间。虚拟内存不同于物理内存,虚拟内存是操作系统对进程地址空间管理(process address space management)而设计的一个逻辑内存空间。虚拟内存通过页映射表(page table)映射到物理内存空间。我们程序中的指针其实就是虚拟内存空间中的地址。top命令参考链接VIR...

2018-12-16 16:20:33 422

原创 Redis高可用简介

常见redis部署方式由一下几种:单节点主从SentinelCluster代理(Twemproxy等)下面只分析Sentinel、Cluster、代理的高可用

2018-11-22 21:48:52 529

原创 [写着玩]理解multipart/form-data,构造http表单实现android图片上传

关于multipart/form-data,可参考https://blog.csdn.net/zshake/article/details/77985757客户端 参数解释,上传主方法private void submit() { Map&lt;String, Object&gt; params = new HashMap&lt;String, Object&gt;(); /...

2018-11-21 16:56:22 1691

原创 [InnoDB]Mysql加锁情况

innodb七种锁共享/排他锁(Shared and Exclusive Locks)1.共享锁(Shared Locks,S锁)2.排他锁(Exclusive Locks,X锁)可以一起读,读写/写写互斥。意向锁(Intention Locks)1.意向共享锁(intention shared lock,IS)2.意向排它锁(intention exclusive lock,IX)...

2018-11-19 20:37:27 948

原创 [InnoDB]性别字段为什么不适合加索引

表结构与数据id为主键,id为5,15,25,35…时sex=1sex=0,90000条数据;sex=1,10000条数据CREATE TABLE `people` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `sex` tinyint(1) unsi...

2018-11-01 21:06:12 9328 5

原创 dubbo+spring+maven+assembly+官方shell实现jar应用

项目地址 https://github.com/CongZhouArtist/dubbo-testdubbo版本2.6.4使用maven + assembly实现tar.gz打包使用官方start.sh实现脚本启动(其实使用com.alibaba.dubbo.container.Main运行spring环境)以dubbo-provider为例,目录树如下:assembly文件夹放了优...

2018-10-31 00:10:00 375

原创 HttpServletRequest.getParameter()源码分析

HttpServletRequest.getParameter(); debug看到HttpServletRequest这个类的实例其实是RequestFacade。 到tomcat源码中可以看到该类。 RequestFacade外观模式实现,包装了Request。 RequestFacade.getParameter(String name),该方法调用了Request的方法。 ...

2018-08-28 20:51:49 5648 3

原创 进程与线程的故事

早期计算机和现代的普通计算器是类似的,只有输入和输出的功能。输入一个指令,计算机计算后得出结果。显然每次输入一个指令得出结果是低效的,所以批处理系统诞生了。批操作系统可以把一系列的指令集保存在存储介质中,在执行任务是读取指令集然后运行得到结果。显然批处理系统一次只能运行一个任务,在读取存储介质中的数据时,CPU是空闲的。所以进程诞生了,用一个进程来执行一个任务。这样就可以在批操作系统上实现多...

2018-08-27 23:42:00 422

原创 redis安装,ubuntu 16.04

下载 wget http://download.redis.io/releases/redis-stable.tar.gz 解压 sudo tar -zxvf redis-stable.tar.gz cd redis-stable 编译 make安装,随意,也可以直接使用src下的文件执行。默认用bin_PROGRAMS宏的话,程序会被安装至/usr/local/bin这个目录。cd...

2018-08-21 23:11:05 195

原创 Spring实例化时各种初始化方法执行顺序

带序号的步骤来自Spring实战(第4版),红字为补充部分。1.Spring对bean进行实例化;Constructor构造方法2.Spring将值和bean的引用注入到bean对应的属性中;3.如果bean实现了BeanNameAware接口,Spring将bean的ID传递给setBean-Name()方法;4.如果bean实现了BeanFactoryAware接口,Sprin...

2018-08-15 19:26:46 5327

原创 通俗易懂的深度学习

简介深度学习是机器学习研究中的一个新的领域,其动机在于建立、模拟人脑进行分析学习的神经网络,它模仿人脑的机制来解释数据,例如图像,声音和文本。算法导论和机器学习的异同相同点:都是输入,计算,得到结果。差异:算法导论:以f(x)=w*x为例,其实就是人为的设定w的过程。但x是离散变量不是连续变量,不然就是高中数学题了。机器学习:以f(x)=w*x为例,是......

2018-07-18 17:25:31 2874

原创 Java 多线程NIO

 IO模型1. 阻塞IO如果数据没有准备就绪,就一直等待,直到数据准备就绪;整个进程会被阻塞。2. 非阻塞IO需不断询问内核是否已经准备好数据,非阻塞虽然不用等待但是一直占用CPU。3. 多路复用IO NIO多路复用IO,会有一个线程不断地去轮询多个socket的状态,当socket有读写事件的时候才会调用IO读写操作。用一个线程管理多个socket,是通过selector.select(...

2018-07-04 21:12:12 7881

原创 基于TensorFlow图像分类实现

train.py训练集图片文件名称中存在类型即可。根据需分类类型修改# 训练集生成和# 测试集生成代码块中的读取方式。import osimport numpy as npimport tensorflow as tffrom network import Networkfrom datagenerator import ImageDataGeneratorfrom datetime i...

2018-06-24 20:34:53 4524 22

空空如也

空空如也

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

TA关注的人

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