为了提高程序运行的性能,现代CPU在很多方面对程序进行了优化。例如:CPU高速缓存。尽可能避免处理器访问主内存的时间开销,处理器大多会利用缓存以提高性能。内存,可以看做是 CPU 和 磁盘之间的缓存 CPU与内存的处理速度也不一致,出现 L1&L2 Cache网络处理数据库引擎的各种BufferGUI的Double Buffer(双缓冲)1 多级缓存L1 Cache(一级缓存)CPU第一层高速缓存,分为数据缓存和指令缓存。一般服务器CPU的L1缓存的容量通常在32- - 4096
1 数据缓存设计结构1.1 一级缓存Session会话级别的缓存,位于表示一次数据库会话的SqlSession对象之中,即本地缓存。一级缓存是MyBatis内部实现的一个特性,用户不能配置,默认自动支持,用户无定制权利。1.2 二级缓存Application应用级别的缓存,生命周期长,跟Application的生命周期一样,即作用范围为整个Application应用。缓存架构2 工作机制2.1 一级缓存的工作机制一级缓存是Session级别,一般一个SqlSession对象会使用一
纯Java开源缓存框架,配置简单、结构清晰、功能强大,是一个非常轻量级的缓存实现,Hibernate里面就集成了相关缓存功能。Ehcache架构图核心概念cache manager缓存管理器,以前只允许单例,现在可多实例cache缓存管理器内可放置若干cache,存放数据的实质,所有cache都实现了Ehcache接口,这是一个真正使用的缓存实例。通过缓存管理器的模式,可在单个应用中轻松隔离多个缓存实例,独立服务于不同业务场景需求,缓存数据物理隔离,同时需要时又可共享。el
计算机的总线比如最常见的USB:Universal Serial Bus,提供了对外连接的接口,不同设备可以通过USB接口进行连接,连接的标准也促使外围设备接口的统一。其它的还有 PCI、ISA、Thunderbolt 总线等。都是为了解决不同设备之间的通信。试想,如果没有总线,新增了输入设备后,为了维持通信又得加一堆线路。有了 I/O 总线后分类片内总线芯片内部的总线,寄存器与寄存器之间,寄存器与控制器、运算器之间。高集成度芯片内部的信息传输线。系统总线数据总线双向传输各
怎么使用这些套接字格式完成连接的建立?1 服务端准备连接1.1 创建套接字要创建一个可用的套接字,需要使用下面的函数:int socket(int domain, int type, int protocol)domainPF_INET、PF_INET6以及PF_LOCAL等,即套接字类型typeSOCK_STREAM字节流,对应TCP;SOCK_DGRAM数据报,对应UDP;SOCK_RAW原始套接字。protocol原本用来指定通信协议,但现在基本废弃。因为通过前
我们已经知道,在网络编程中,为了避免频繁的在用户空间与内核空间拷贝数据,通常会直接从内核空间中申请内存,存放数据,在Java中,把内核空间的内存称之为直接内存,nio包中的ByteBuffer的allocateDirect方法,就是帮助我们申请直接内存的,代码如下所示:public static ByteBuffer allocateDirect(int capacity) {return new DirectByteBuffer(capacity);}在上述代码片段中,返回的是一个DirectBy
现实的业务,非常复杂。即使同一事物,在多个业务下意义可能完全不同。比如【商品】:在商品详情页语境指【商品基本信息】在下单页语境指【购买项】在物流页面语境又是【被运送的货物】DDD 核心思想就是让正确的领域模型发挥作用。DDD 指导开发将不同子业务单元划分为不同子领域,在各个子领域内部分别建模应对业务的复杂性。1 背景经典的MVC开发,因为初期业务也比较简单,为光速上线, 综合考虑成本和风险,经常创建一个大模型,各个模块都想着直接复用这同一模型。但随业务发展,各子领域的逻辑越来越复杂,对该大模
"标准"答案GET使用URL或Cookie传参,POST则将数据放在body中GET的URL会有长度上的限制,POST的数据可以非常大POST比GET安全,因为数据在地址栏上不可见这都是一些经典面试材料抄袭的"经典"的答案,没有一点权威意义,不一提,今天我们就从官方RFC文档一探究竟GET 和 POST 是由 HTTP 协议定义的在HTTP协议中,Methods和Header是不相干的两个概念,使用哪个Method与应用层的数据如何传输是没有关系的Methods 定义译文 :
主键 id 必须写在 PO 类中。
最近开发全栈项目时,前端有个数据行可以被随便修改,所以必须给他一个标识记录该数据行,即向MySQL数据库中插入一条记录后,需要获取此条记录的主键id值返回给前端。原代码 <insert id="insertArticle" parameterType="Article">insert into article(title,create_date,content,name)values(#{articleTitle},#{articleCreateDate},#{articleConten
普通HTML标签写法<a class="link" href="https://github.com/facebook/react">React<a>在js中手动生成相同dom的写法var a = document.createElement('a')a.setAttribute('class', 'link')a.setAttribute('href', 'https://github.com/facebook/react')a.appendChild(documen
9 TTL机制9.1 什么是TTLTTL(Time To Live),即生存时间RabbitMQ支持消息的过期时间,在消息发送时可以进行指定RabbitMQ支持为每个队列设置消息的超时时间,从消息入队列开始计算,只要超过了队列的超时时间配置,那么消息会被自动清除9.2 管控台演示新增一个Q新增一个交换机绑定Q中也显示了相关的绑定信息发送消息10s后,消息被清除为0...
10 死信队列机制10.1 什么是死信队列DLX - 死信队列(dead-letter-exchange)利用DLX,当消息在一个队列中变成死信 (dead message) 之后,它能被重新publish到另一个Exchange中,这个Exchange就是DLX.10.2 死信队列的产生场景消息被拒绝(basic.reject / basic.nack),并且requeue = false消息因TTL过期队列达到最大长度10.3 死信的处理过程DLX亦为一个普通的Exchange
每一个整合spring框架的项目中,总是不可避免地要在web.xml中加入这样一段配置。<!-- Spring配置文件开始 --><context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:spring-config.xml </param-value></co.
完全同步的AbstractRefreshableApplicationContext.getBeanFactory,可能导致大量线程阻塞:在运行具有大量CPU 核的Tomcat的大型服务器上,由于同步块,在getBeanFactory()中看到大量线程阻塞。这是因为我们使用XmlWebApplicationContext,并且在Web请求期间每次查找bean时都需要bean工厂。在Web应用程序之外,我们还使用GenericXmlApplicationContext拥有另一个上下文,而这个上下文没.
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。我们将通过创建 5 个对象来画出 20 个分布于不同位置的圆来演示这种模式。由于只有 5 种可用的颜色,所以 color 属性被用来检查现有的 Circle 对象。介绍意图:运用共享技术有效地支持大量细粒度的对象。主要解决:在有大量对象时,有可能会
1 定义将抽象部分与它的实现部分分离,使之任意删减,而无需受其它约束2 结构Abstraction: 定义抽象类的接口,维护一个指向Implementor类型对象的指针,将Client的请求转发给它的Implementor.RefinedAbstraction扩充由Abstraction定义的接口.定义了基于基本操作的较高层次的操作RefinedAbstraction: 扩充由Abstraction定义的接口而得的 抽象类Implementor: 定义实现类的接口.仅提供基本操作Concr
某个资源的唯一地址通过获取java.net.URL实例获取协议名、资源名路径等信息
使用git时,push到远端后发现commit了多余的文件,或者希望能够回退到以前的版本。先在本地回退到相应的版本:git reset --hard <版本号>使用 --hard 参数会抛弃当前工作区的修改使用 --soft 参数的话会回退到之前的版本,但是保留当前工作区的修改,可以重新提交如果此时使用命令:git push origin <分支名>会提示本地的版本落后于远端的版本;为了覆盖掉远端的版本信息,使远端的仓库也回退到相应的版本,需要加上参数–force
Mock 是单元测试中常见的一种技术,模拟在应用中不容易构造或复杂的对象,从而把测试与测试边界以外的对象隔离。编写自定义的 Mock 对象需要额外编码工作,同时也可能引入错误。EasyMock 提供了根据指定接口动态构建 Mock 对象的方法,避免了手工编写 Mock 对象。本文将展示如何使用 EasyMock 进行单元测试,并对其原理进行分析。Mock 对象与 EasyMock 简介单元测试与 Mock 方法单元测试是对应用中的某一个模块的功能进行验证。在单元测试中,我们常遇到的问题是应用
背景ssh连接至云服务器时,提示以下错误:原因是第一次使用SSH连接时,会生成一个认证,储存在客户端的known_hosts中。可使用以下指令查看:ssh-keygen -l -f ~/.ssh/known_hosts由于服务器重新安装系统了,所以会出现以上错误。解决方案ssh-keygen -R 服务器端的ip地址重新连线,出现以下提示:输入yes确认即可连线成功。...
最近想使用云服务器来部署自己的web应用。利用yum install nginx安装了nginx后,用命令service nginx start 启动时,出现错误如下找到nginx的配置文件:vim /etc/nginx/conf.d/default.conf## The default server#server { listen 80 default_server; listen [::]:80 default_server; ser
#目录#安装(CentOS6.8)下载、解压并编译cd redis-2.8.0make##编译好的二进制文件在src目录里。运行Rediscd src启动占用窗口启动在后台,不占用窗口##你可以使用内置的客户端与Redis互动:$ src/redis-cliredis> set foo barOKredis> get foo"bar"Redis单实例配置redis.conf配置文件单实例服务端启动redis-serverredis-serv
sendfile on;sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件对普通应用,必须设为on如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptimetcp_nopush on;数据包累积到一定大小后再发送。允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用。keepalive_timeout 60;客户端连接服务器的超时时间。.
下载安装yum install nginx安装成功后默认的网站目录为: /usr/share/nginx/html默认的配置文件为:/etc/nginx/nginx.conf自定义配置文件目录为: /etc/nginx/conf.d/启动 nginx验证启动成功输入云服务器的公网 ip 即可看到欢迎页,80 端口默认的不需要显式添加是什么是一款轻量级Web服务器,也是一款反向代理服务器能干什么可直接支持 rails和php程序可作为http反向代理服务器
现在互联网应用(网站/App)的整体流程,可概括如图用户请求从界面(浏览器/App)到网络转发、应用服务再到存储(数据库或文件系统),然后返回到界面呈现内容。如图1所示,缓存的使用可以出现在1~4的各个环节中,每个环节的缓存方案与使用各有特点。1 缓存特征缓存是一个数据模型对象,有它的一些特征1.1 命中率命中率=返回正确结果数/请求缓存次数命中率问题是缓存中的一个非常重要的问题,它是衡量缓存有效性的重要指标。命中率越高,表明缓存的使用率越高。1.2 最大元素(或最大空间)缓存中可以存放
有时想编写只有静态方法和静态字段的类。这种类很不好,因为有些人滥用在OOP 语言编写面向过程的程序,但确有用途。可用 java.lang.Math 或 java.util.Arrays 这种类,把基本类型的值或数组类型的方法组织起来。还可以用于对以 java.util.Collections 的方式,把实现特定接口的对象上的静态方法组织起来。( Java 8,可以将这些方法放入接口中,假设是你自己编写的可以修改)。最后,这些类还可把 final 类上的方法组织,因为不能将它们放在子类。这样的工具类不是
(1)方法1:git fetch origin(2)方法2(代码还需要):git push origin(3)方法3 (代码不需要):git reset --hard origin/$branch参考:https://blog.csdn.net/Thousa_Ho/article/details/73350703https://stackoverflow.com/questions/16288176/your-branch-is-ahead-of-origin-master-by-3-commit
见名知义,消息队列主要就是用来发送和接收处理消息,但它的作用可不仅解决应用间通信问题。1 消息队列的现实由来在工厂我们随处可见各种传送带,很多道工序都替代了人工一次次极大耗费劳动力的往返运动,而把一套业务分成若干部分,各流程之间传输所需材料即可。用编程思想,我们可以认为是传送带的发明解决了上下游工序间的“通信”问题。传送带的使用着实提高社会必要劳动生产时间,让人类工业社会效率显著提升。但就真的百利无一害了吗?我们会发现每道工序生产速度并不相同。有时上游的材料刚传送过来,工人可能正在处理上批材料,没
保证消息的百分百投递成功2.1 Producer 的可靠性投递2.1.1 要求保证消息的成功发出保证MQ节点的成功接收发送端收到MQ节点(Broker) 确认应答完善的消息补偿机制在实际生产中,很难保障前三点的完全可靠,比如在极端的环境中,生产者发送消息失败了,发送端在接受确认应答时突然发生网络闪断等等情况,很难保障可靠性投递,所以就需要有第四点完善的消息补偿机制。2.1.2 解决方案2.1.2.1 方案一:消息信心落库,对消息状态进行打标(常见方案)将消息持久化到DB并设置状.
Copyright © 2005-2025 51CTO.COM 版权所有 京ICP证060544号