分布式设计-Redis集群-Mysql集群-Cloud
分布式系统的概念分布式系统是建立在网络之上的软件系统,拥有软件特性,所以分布式系统具有高度内聚性,和透明性。是建设于网络之上的高层软件,而不是硬件。
分布式系统特点分布式系统是多个服务器通过网络互联而构建的松耦合系统,其具备以下特点:
分布式:分布式由多台计算机组成,在地域上是独立分散的,可以分散在一个单位,一个城市,一个国家,或是全球范围内。整个系统的统一功能是分散在多个节点上实现的,因而分布式系统具有数据处理的分布式特性。
自治性:分布式系统各个节点包含自己独有的cpu和内存,具备独立的处理数据能力。一般来说每个节点是对等的,没有主次之分,可以自治的进行任务处理,还可以通过网络传输信息,协同完成任务处理。
并行性:一个大的任务可以按规则划分到多个计算节点上进行独立的子任务支持,体现了并行性。
全局性:分布式系统必须存在一个单一的,全局的通信机制,使得任何一个进程都能和其他进程通信,并且不区分本地通信和远程通信。在一个分布式集群中,往往所有机器具有统一的系统调用能力。
在不同的抽象层次上来说,分布式系统中每一个物理机,虚拟机,docker镜像,独立进程都可以认为是一个节点。
特有 ...
SPI机制
什么是SPI机制SPI(Service Provider Interface),是JDK内置的一种 服务提供发现机制,可以用来启用框架扩展和替换组件,主要是被框架的开发人员使用,比如java.sql.Driver接口,其他不同厂商可以针对同一接口做出不同的实现,MySQL和PostgreSQL都有不同的实现提供给用户,而Java的SPI机制可以为某个接口寻找服务实现。Java中SPI机制主要思想是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要,其核心思想就是 解耦。
当服务的提供者提供了一种接口的实现之后,需要在classpath下的META-INF/services/目录里创建一个以服务接口命名的文件,这个文件里的内容就是这个接口的具体的实现类。当其他的程序需要这个服务的时候,就可以通过查找这个jar包(一般都是以jar包做依赖)的META-INF/services/中的配置文件,配置文件中有接口的具体实现类名,可以根据这个类名进行加载实例化,就可以使用该服务了。JDK中查找服务的实现的工具类是:java.util.ServiceLoader。
MYSQL 深度分页问题的解决思路
深度分页问题描述分页语法LIMIT row_count; 返回前 row_count 条数据LIMIT offset, row_count; 返回 从 offset 行开始,接下来的 row_count 行数据LIMIT row_count OFFSET offset; 返回 从 offset 行开始,接下来的 row_count 行数据
为什么深度分页会变慢?设置一个 表结构
CREATE TABLE account ( id int(11) NOT NULL AUTO_INCREMENT COMMENT '主键Id', name varchar(255) DEFAULT NULL COMMENT '账户名', balance int(11) DEFAULT NULL COMMENT '余额', create_time datetime NOT NULL COMMENT '创建时间', update_time datetime NOT NULL ON UPDATE CURRENT_TIMEST ...
MySQL-实战-窗口函数
窗口函数MySQL8 窗口函数是一种特殊的函数,它可以在一组查询行上执行类似于聚合的操作,但是不会将查询行折叠为单个输出行,而是为每个查询行生成一个结果。窗口函数可以用来处理复杂的报表统计分析场景,例如计算移动平均值、累计和、排名等。它展现的主要威力在于「它能够让我们在不修改原有语句输出结果的基础上,直接添加新的聚合字段」。
语法解析window_function_name ( [argument1, argument2, ...] ) OVER ( [ PARTITION BY col1, col2, ... ] [ORDER BY col3, col4, ...] [ ROWS | RANGE frame_start AND frame_end ])
window_function_namewindow_function_name 函数可以是聚合函数或者非聚合函数。MySQL8 支持以下几类窗口函数,
序号函数:用于为窗口内的每一行生成一个序号,例如 ROW_NUMBER(),RANK(),DENSE_RANK() 等。
分布函数:用于计算窗口内的每一行在整个分区中的相 ...
Linux 命令记录
本文是为了巩固自己的基本能力,记录自己使用Linux的常用命令,日积月累,避免每次遇到问题都需要反复去查阅。
之前面试的时候,面试官给我了一些建议,希望我多学习一些Linux的相关操作,我记得重点的内容是 着重于Linux在对于项目开发运维方面需要用到的一些技能,比如有
如何检测系统资源占用。
如何快速的从日志中找到自己需要查看的内容。
如何通过分析工具,比如分析栈帧或者Dump日志来快速的定位到线上问题。
…
本文的目的包括但不仅限于以上,作为一个程序员,学习使用Linux是我的必经之路。
tar.gz 文件的解压tar.gz 文件是 Linux 中常见的压缩文件类型,它是通过 tar 进行打包后,再使用 gzip 进行压缩生成的。要解压这个文件,通常会使用 tar 命令,并结合相应的参数来操作。
参数说明
参数
含义
备注
-x
解压缩(extract)
解压缩打包文件(必须参数)
-z
通过 gzip 进行解压缩
用于处理 .gz 格式的压缩文件
-v
显示详细的解压缩过程
可以看到解压缩的文件名,方便查看过程(可选)
-f
指定文件名
后面需要跟上 ...
分库分表-入门
分库分表分库分表是企业里面针对常见的针对高并发、数据量大的场景下的一种技术优化方案
分库,分表,分库分表所谓”分库分表”,根本就不是一件事儿,而是三件事儿,他们要解决的问题也都不一样。
这三个事儿分别是”只分库不分表”、”只分表不分库”、以及”既分库又分表”。
什么时候分库?分库主要解决的是并发量大的问题。因为并发量一旦上来了,数据库就会成为瓶颈。因为数据库的连接数是有限的,虽然可以调整,但是也不是无限调整的。
当数据库的读或者写的QPS过高,导致数据库连接数不足了的时候,就需要考虑分库了,通过增加数据库实例的方式来提供更多的可用数据库链接,从而提升系统的并发度。
比较典型的分库的场景就是我们在做微服务拆分的时候,就会按照业务边界,把各个业务的数据从一个单一的数据库中拆分开,分表把订单、物流、商品、会员等单独放到单独的数据库中。
有的时候可能会需要把历史订单挪到历史库里面去。这也是分库的一种具体做法
什么时候分表?分库主要解决的是并发量大的问题,那分表其实主要解决的是数据量大的问题。
假如你的单表数据量非常大,因为并发不高,数据量连接可能还够,但是存储和查询的性能遇到了瓶颈了,你做 ...
Nginx
Nginx是什么Nginx是一个高性能的 HTTP 和反向代理服务器,特点是占用内存少,并发能力强,事实上Nginx的并发能力确实在同类型的网页服务器中表现较好。
Nginx 专为性能优化而开发,性能是其最重要的要求,十分注重效率,有报告 Nginx 能支持高达 50000 个并发连接数
Nginx的功能
正向代理
正向代理:局域网中的电脑用户想要直接访问网络是不可行的,只能通过代理服务器来访问,这种代理服务就被称为正向代理。
反向代理
反向代理:客户端无法感知代理,因为客户端访问网络不需要配置,只要把请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据,然后再返回到客户端。
客户端通过Nginx来透明的调用后台服务器,Nginx来选择具体的Worker
负载均衡
当Nginx反向代理了多个同类型实例的时候,选择一个可以最大化并发量或者效率的服务器调用方式,来将请求路由到对应的Worker上,就是负载均衡
动静分离
根据用户请求的区别,将动态页面和静态页面的处理交给不同的服务器,加快解析的速度,降低单个服务器路由的压力。
高可用
Nginx 的配置文件user ...
海量数据处理-案例
从大量的URL中找出相同的URL给定a、b两个文件,各存放50亿个URL,每个URL各占64B,内存限制是4G。如何找出a,b两个文件中共同的URL
假设每个URL占64B,50亿个URL文件的大小为320G,无法直接读取到内存中进行处理
解决方法
分治处理
将大文件分解为小文件,通过处理小文件,来保证内存不会溢出。
本题可以将a中的每个URL进行hash(URL) % 1000,得到取模后的hash值 i,将URL保存到对应的 ai 文件中。对于 b 文件,采取相同的处理策略,这样可以保证,共同的URL一点保存在相同hash值对应的ai、bi文件中,然后遍历得到的所有文件,得到全部共同的URL。
前缀树
本题的瓶颈是内存不足以存储巨量的数据,可以换一种存储的思路。根据URL的特点可以知道,大部分的URL的前面几个字符都是相同的,可以使用前缀树来减少内存的使用量。同时提升查询的效率。
从大量的数据中找出高频词有一个1GB大小的文件,文件中的每一行是一个词,每个词的大小不超过 16B,内存的限制是 1MB,要求返回频数最高的 100个词语。
解决方法
分治处理
本题依然是内存不 ...
Netty-复习
浅谈Stream在计算和编程领域,stream(流)通常指的是一系列数据的传输方式。流是数据的持续序列,允许程序在数据没有完全加载或没有完全存储的情况下进行处理。流的使用在处理大数据集、实时数据传输或资源有限的环境下尤为重要。
本质上,流只是一种对于数据的处理手段,相当于给出了接口,没有给出具体的实现。
常见的流有以下几种
输入输出流(I/O Stream)
I/O流是编程中常见的一种流操作,用于数据的输入和输出。数据可以是文件、网络通信、设备、内存等。I/O流分为两类:
字节流(Byte Stream):以字节为单位处理数据,适合处理二进制文件,如图片、音频等。常见类:InputStream、OutputStream。
字符流(Character Stream):以字符为单位处理数据,适合处理文本数据。常见类:Reader、Writer。
网络流(Network Stream)
网络流用于在网络中传输数据。它通常涉及传输控制协议(TCP)或用户数据报协议(UDP)。通过使用网络流,可以实时传输数据,如视频、音频或文件。
视频和音频流
在多媒体应 ...
JVM调优-入门
为什么要调优 ?最近几天在和朋友一起玩我的世界服务器,服务器是我之前购买的用于部署项目的2c2g的阿里云,闲置无用,便拿来当作服务器,在部署期间遇到过很大问题,但因为我是Java选手,部署方面的报错,调用Jar包的参数等还是能看明白,倒也算不上问题。
真正的问题在于正式游玩的时候,虽然服务器标称是2c2g,但通过SSH连接后显示实际的物理内存只有1.7g,阿里云服务器自带的服务器监控进程和系统本身还需要占用一定内存,实际可用的内存仅有1.5g左右,在游玩期间多次遭遇服务器卡死但没崩溃,服务器直接崩溃等等场景。
作为一个Java选手,平时其实就在烦劳,如何将所学知识用于实际,这一次的问题很明显,Minecraft Server是一个Java进程,总结下来就是,如何最大化的利用内存空间,让Java进程运行的更加稳定,使用同样的内存,得到更高的性能等等。
调优调优,调的是什么,优化的是什么?说到JVM,这里可以顺便思考思考,JVM的作用?总结下来,无非以下几点
将编译好的字节码解释为机器码
透明化内存的管理,自动的分配、回收内存
为Java程序提供运行环境,加载各种类
屏蔽平台的差异,实现 ...