Cache缓存
Cache缓存1. 缓存为了系统性能的提升,我们一般都会将部分数据放入缓存中,加速访问。而 db 承担数据落盘工作。
哪些数据适合放入缓存?
即时性、数据一致性要求不高的
访问量大且更新频率不高的数据(读多,写少)
举例:电商类应用,商品分类,商品列表等适合缓存并加一个失效时间(根据数据更新频率来定),后台如果发布一个商品,买家需要 5 分钟才能看到新的商品一般还是可以接受的。
伪代码如下:
data = cache.load(id);//从缓存加载数据If(data == null){data = db.load(id);//从数据库加载数据cache.put(id,data);//保存到 cache 中}return data;
注意:在开发中,凡是放入缓存中的数据我们都应该指定过期时间,使其可以在系统即使没有主动更新数据也能自动触发数据加载进缓存的流程。避免业务崩溃导致的数据永久不一致问题。
1.1 使用 Redis 作为缓存使用 redis 作为缓存可以大大减小对磁盘的压力,以及提升系统的性能,将那些读多写少且构建起来耗时的数据存入 redis ...
Elasticsearch学习
Elasticsearch暂时只学习个大概的语法,和了解 Elasticsearch
本篇基于 Elasticsearch 8.5.3 版本。
1. 概述1.1 什么是 ElasticsearchElasticsearch 是位于 Elastic Stack 中心的分布式搜索和分析引擎。Logstach 和 Beats 促进采集、合计以及充实你的数据并在 Elasticsearch 中存储它们。Kibana 允许你去交互式的探索、可视化和共享对数据的见解,以及监视这个栈(Elastic Stack)。Elasticsearch 是索引、搜索和分析的神奇所在。
Elasticsearch 为各种数据类型提供接近实时的搜索和分析。不论你有结构化或非结构化的文本、数字数据,还是地理空间数据,Elasticsearch 能以支持快速搜索的方式高效地存储和索引它。你可以以远超简单数据检索和聚合信息的方式去发现你数据中的趋势和模式。而且,随着你数据和查询量的增长,Elasticsearch 分布式的特性允许你的部署能随着它无缝地增长匹配。
虽然不是每个问题都是搜索问题,但 Elasticsear ...
JSR303
JSR303 数据校验1.概述1.1什么是JSRJSR是Java Specification Requests的缩写,意思是Java 规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。
1.2JSR-303 定义的是什么标准JSR-303 是JAVA EE 6 中的一项子规范,叫做Bean Validation,Hibernate Validator 是 Bean Validation 的参考实现 . Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现,除此之外还有一些附加的 constraint。
Bean Validation 中内置的 constaint
1.3为什么需要 JSR-303我们在编写业务代码时,常常会对用户输入的数据进行必要的参数校验,如果我们不做校验,系统很可能会产生空指针等异常,这些异常我们应当避免(是因为抛出异常代表发生了一个不可预知的危险操作 ...
NIO
NIONIO 与 BIO的区别BIOJava IO 核心就是流。流只能单向,要么输入,要么输出。只能选其一。
Java IO 就是典型的 BIO 模型,即面向流编程,一个流要么是输入,要么是输出。
BIO 是阻塞的,即在准备读取数据到数据返回期间需要等待内核将数据准备完毕,再通过 IO 阻塞传输到用户空间。
NIOJava NIO 与 BIO 不同,NIO 有三个核心组件 Channel、Buffer、Selector,在 NIO 中我们是面向块(block) 或是缓冲区(buffer) 编程的。与 Stream 不同的是,Channel 是双向的,流只能单向所以区分 In 和 Out,所以 Channel 打开后可以进行读取、写入或是读写。
NIO 是非阻塞的,在数据准备阶段不需要等待,需要启动一个线程一直监听内核是否将数据准备完毕,准备完毕后,监听线程通知 IO 线程阻塞读取数据(这一块还是阻塞的)。
由于 Channel 是双向的,因此它能更好地反映出底层操作系统的真实情况;在 Linux 系统中,底层操作系统的通道就是双向的。
NIO 核心组件介绍NIO 包含3个核心的组件 ...
Netty
Netty1. 概述
Netty 是由 JBOSS 提供的一个 java 开源框架。它是一个异步的、基于事件驱动的网络应用框架,开源快速开发高性能、高可靠性的网络 IO 程序。
Netty 主要针对在 TCP 协议下,面向 Clients 端的高并发应用。或者 Peer-to-Peer 场景下的大量数据持续传输的应用。
Netty 是一个 NIO 框架,将 Java 底层的 NIO API 再次做了一个封装和优化,简化和流程化了 NIO 的开发过程。可以帮助你快速、简单的开发出一个网络应用。
Netty 是目前最流行的 NIO 框架,Netty 在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用,知名的 Elasticsearch 、Dubbo(RPC) 框架内部都采用了 Netty。
2. 五种 I/O 通信模型在网络环境下,通俗地讲,将 I/O 分为两步:第一步是等待;第二步是数据搬迁。
如果想要提高 I/O 效率,需要将等待时间降低。因此发展出来五种 I/O 模型,分别是:阻塞 I/O 模型、非阻塞 I ...
SpringMVC之RequestContextHolder
SpringMVC 之 RequestContextHolder简介在业务编写中,常常会出现将 request 和 response 传来传去的场景,正常来说在 service 层是没有 request 的,然而直接从 Controller 传过来的话方法太粗暴了,而 SpringMVC 提供的 RequestContextHolder 可以在一个请求线程的中获取到 Request 并将其存储在底层的 ThreadLocal 中,避免了 Request 从头传到尾的情况。一般项目中,会对这个类进行再次封装,便于获取请求的相关信息,常见的比如用户信息。
原理剖析RequestContextHolder 基于 ThreadLocal 实现。
public abstract class RequestContextHolder { private static final boolean jsfPresent = ClassUtils.isPresent("javax.faces.context.FacesContext", Request ...
ARP
ARP(地址解析协议)简介计算机通信方式通过广播的方式。所有上层的数据包到最后都要封装到以太网头,然后通过以太网协议发送。在谈及以太网协议的时候,我们已经了解到,通信基于 MAC 地址的广播方式实现的,计算机在发送数据包时,获取自身的 MAC 地址是 容 易 的 , 获 取 目 标 主 机 的 MAC 地 址 , 需 要 通 过 ARP( Address Resolution Protocol,地址解析协议)来实现。
协议原理ARP 用于实现从 IP 地址到MAC地址的映射,即询问目标IP 地址对应的MAC地址,以广播的方式发送数据包,获取目标主机的MAC地址。我们通过一个案例来说明其具体通信原理,假设主机 IP 地址都已知。
主机A的 IP 地址为 10.1.20.64,MAC地址为 00:08:ca:xx:xx:xx;
主机B的 IP 地址为 10.1.20.109 ,MAC地址为 44:6d:57:xx:xx:xx。
当 主 机 A 要 与 主 机 B 通 信 时 , ARP 可 以 将 主 机 B 的 IP 地 址(10.1.20.109)解析成主机B的MAC地址,以下为工 ...
计算机网络
计算机网络基础篇TCP/IP 网络模型计算机与计算机之间要有统一的连接标准才能够完成相互通信,这个标准被称为互联网协议,而网络就是物理链接介质+互联网协议。按照功能不同,人们将互联网协议从不同维度分为 OSI 七层、TCP/IP 五层或 TCP/IP 四层,如下图所示
这个网络协议是分层的,每一层都有各自的作用和职责。
在 TCP/IP 五层模型中每层运行的常见设备如下图所示。
在 TCP/IP 四层模型中数据传输过程中每一层的封装格式:
网络接口层的传输单位是帧(frame),IP 层的传输单位是包(packet),TCP 层的传输单位是段(segment),HTTP 的传输单位则是消息或报文(message)。但这些名词并没有什么本质的区别,可以统称位数据包。
我们主要学习前三层,所以这里以 TCP/IP 四层模型来介绍。
应用层应用层位于 TCP/IP 模型的最上层,也是用户能直接接触到的,如电脑或手机上使用的应用软件都是在应用层上实现。
当两个不同设备的应用需要进行通信的时候,应用就把应用数据传输给下一层,也就是传输层。
所以,应用层只需要专注于为用户提供应 ...
操作系统
操作系统硬件结构该部分主要接收一些计算机中的硬件知识。
CPU 是如何执行程序的?冯诺依曼模型冯诺依曼模型定义了计算机基本结构的 5 个部分,分别是运算器、控制器、存储器、输入设备、输出设备。
运算器、控制器是在中央处理器里的,存储器就是我们常见的内存,输入输出设备则是计算机外接的设备,比如键盘、鼠标就是常见的输入设备,显示器、音响就是常见的输出设备。
存储单元和输入/输出设备要与中央处理器打交道的话,离不开总线。它们的关系如下。
下面,我们分别介绍内存、中央处理器、总线、输入输出设备。
内存我们程序在运行时的程序和数据都是存储在内存,存储的区域是线性的。
在计算机数据存储中,存储数据的基本单位是字节(byte),1 字节等于 8 位(bit)。每一个字节都对应一个内存地址
内存的地址都是从 0 开始编号的,然后自增排列,最后一个地址为内存总字节数 -1,这种结构好似我们程序里的数组,所以内存里读写任何一个数据的速度都是一样的。
中央处理器中央处理就是我们常说的 CPU,32 位和 64 位 CPU 最主要的区别在于一次能计算出多少字节数据:
32 位 CPU 一 ...
《Netty4核心原理与手写RPC框架实战》
《Netty4核心原理与手写RPC框架实战》读书笔记Java I/O 演进之路什么是 I/O在操作系统之中我们都知道在 UNIX 世界里一切皆文件,而文件呢就是一串二进制流而已,其实不管是 Socket,还是 FIFO、管道、终端。对计算机来说一切都是文件,一切都是流。在信息交换的过程中,计算机都是对这些流进行数据的收发操作,简称 I/O 操作(Input and Output)。
I/O 交互流程通过用户进程中的一次完整的 I/O 交互流程分为两阶段,首先是经过内核空间,也就是由操作系统处理;紧接着就是到用户空间,也就是交由应用程序。具体流程如下图所示。
I/O 有内存 I/O、网络 I/O 和磁盘 I/O 三种,通常我们说的 I/O 指的是后两者。如下图所示是 I/O 通信过程的调度示意。
五种 I/O 通信模型在网络环境下,通俗地讲,将 I/O 分为两步:第一步是等待;第二步是数据搬迁。
如果想要提高 I/O 效率,需要将等待时间降低。 ...