- 博客(33)
- 问答 (4)
- 收藏
- 关注
原创 并发编程(1)
进程与线程 进程 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理IO的。 当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。 进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程(例如记事本、画图、浏览器等),也有的程序只能启动一个实例进程(例如网易云音乐、360 安全卫士等。 线程 一个进程之内可以分为一到多个线程。 一个线程就...
2022-05-14 19:48:34
299
原创 RabbitMQ的基本使用
同步和异步通讯 微服务间通讯有同步和异步两种方式: 同步通讯:就像打电话,需要实时响应。 异步通讯:就像发邮件,不需要马上回复。 1.同步通讯 我们之前学习的Feign调用就属于同步方式,虽然调用可以实时得到结果,但存在下面的问题: 总结: 同步调用的优点: 时效性较强,可以立即得到结果 同步调用的问题: 耦合度高 性能和吞吐能力下降 有额外的资源消耗 有级联失败问题 2.异步通讯 异步调用则可以避免上述问题: 我们以购
2022-05-11 08:12:59
10002
原创 Gateway网关的使用
为什么需要网关 Gateway网关是我们服务的守门神,所有微服务的统一入口。 网关的核心功能特性: 请求路由 权限控制 限流 架构图: 权限控制:网关作为微服务入口,需要校验用户是是否有请求资格,如果没有则进行拦截。 路由和负载均衡:一切请求都必须先经过gateway,但网关不处理业务,而是根据某种规则,把请求转发到某个微服务,这个过程叫做路由。当然路由的目标服务有多个时,还需要做负载均衡。 限流:当请求流量过高时,在网关中按照下流的微服务能够接受的速度来放行
2022-05-09 20:26:22
2780
原创 feign的使用
Feign是一个声明式的http客户端,官方地址:GitHub - OpenFeign/feign: Feign makes writing java http clients easier 其作用就是帮助我们优雅的实现http请求的发送。 Feign替代RestTemplate 1.引入依赖 我们在order-service服务的pom文件中引入feign的依赖: <dependency> <groupId>org.springframework.cloud&l
2022-05-09 18:54:33
1305
原创 Nacos配置管理
统一配置管理 当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。 Nacos一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新。 1.在nacos中添加配置文件 然后在弹出的表单中,填写配置信息: 注意:项目的核心配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。 2.从微服务拉取配置 微服..
2022-05-09 16:50:06
617
1
原创 Nacos注册中心
服务注册到nacos 1.引入依赖 在cloud-demo父工程的pom文件中的<dependencyManagement>中引入SpringCloudAlibaba的依赖: <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <ver
2022-05-09 15:11:04
175
原创 Eureka注册中心的使用
Eureka的结构和作用 问题1:order-service如何得知user-service实例地址? 获取地址信息的流程如下: user-service服务实例启动后,将自己的信息注册到eureka-server(Eureka服务端)。这个叫服务注册 eureka-server保存服务名称到服务实例地址列表的映射关系 order-service根据服务名称,拉取实例地址列表。这个叫服务发现或服务拉取 问题2:order-service如何从多个user-servi
2022-05-09 11:56:48
696
原创 Redis缓存穿透,缓存击穿,缓存雪崩
缓存穿透 缓存穿透是指查询一个数据库一定不存在的数据。 我们以前正常的使用Redis缓存的流程大致是: 1、数据查询首先进行缓存查询 2、如果数据存在则直接返回缓存数据 3、如果数据不存在,就对数据库进行查询,并把查询到的数据放进缓存 4、如果数据库查询数据为空,则不放进缓存 例如我们的数据表中主键是自增产生的,所有的主键值都大于0。此时如果用户传入的参数为-1,会是怎么样?这个-1,就是一定不存在的对象。程序就会每次都去查询数据库,而每次查询都是空,每次又都不会进行缓存。假如有人恶意
2022-05-05 16:50:17
159
原创 MP学习笔记
字段自动填充 需求描述: 项目中经常会遇到一些数据,每次都使用相同的方式填充,例如记录的creat_time,update_time等。 我们可以使用MyBatis Plus的自动填充功能,完成这些字段的赋值工作 1.在User表中添加datetime类型的新的字段 create_time、update_time 2.实体上增加字段并添加自动填充注解 @TableField(fill = FieldFill.INSERT) private Date createTime; //create_
2022-04-25 15:40:17
307
原创 ZooKeeper学习笔记
什么是zk? Zookeeper 是一个分布式的、开源的分布式应用程序的协调服务。 Zookeeper 提供的主要功能包括: 配置管理 分布式锁 集群管理 Zookeeper 数据模型 ZooKeeper 是一个树形目录服务,其数据模型和Unix的文件系统目录树很类似,拥有一个层次化结构。 这里面的每一个节点都被称为: ZNode,每个节点上都会保存自己的数据和节点信息。 节点可以拥有子节点,同时也允许少量(1MB)数据存储在该节点之下...
2022-04-25 09:16:00
340
原创 nginx入门使用
部署静态资源 Nginx可以作为静态web服务器来部署静态资源。这里所说的静态资源是指在服务端真实存在,并且能够直接展示的一些文件,比如常见的html页面、css文件、js文件、图片、视频等资源。 相对于Tomcat,Nginx处理静态资源的能力更加高效,所以在生产环境下,一般都会将静态资源部署到Nginx中。 将静态资源部署到Nginx非常简单,只需要将文件复制到Nginx安装目录下的html目录中即可。 反向代理 反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相
2022-04-21 21:32:52
248
原创 Dubbo学习笔记
Dubbo概念 •Dubbo是阿里巴巴公司开源的一个高性能、轻量级的 Java RPC 框架。 •致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案。 Dubbo架构 •Provider:服务提供方 •Container:服务运行容器 •Consumer:服务消费方 •Registry:服务注册与发现的注册中心 •Monitor:统计服务的调用次数和调用时间的监控中心 Zookeeper安装 •Dubbo官方推荐使用Zoo...
2022-04-21 21:17:25
1829
原创 使用ShardingJDBC实现读写分离
数据库准备工作 提前准备两台服务器,并且在服务器中安装MySQL,服务器的信息如下: 数据库 IP 数据库版本 Master 192.168.200.200 5.7.25 Slave 192.168.200.201 5.7.25 主库配置 1). 修改Mysql数据库的配置文件/etc/my.cnf 在最下面增加配置: log-bin=mysql-bin #[必须]启用二进制日志 server-id=200 #[必须]服务器唯一ID
2022-04-20 20:33:59
3105
原创 SpringCache框架的使用
介绍 Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能,大大简化我们在业务中操作缓存的代码。 Spring Cache只是提供了一层抽象,底层可以切换不同的cache实现。具体就是通过CacheManager接口来统一不同的缓存技术。CacheManager是Spring提供的各种缓存技术抽象接口。 针对不同的缓存技术需要实现不同的CacheManager: CacheManager 描述 EhCacheCacheManager
2022-04-20 20:10:05
1049
原创 Redis中的数据类型
Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型: 字符串(string):普通字符串,常用 哈希(hash):适合存储对象 列表(list):按照插入顺序排序,可以有重复元素 集合(set):无序集合,没有重复元素 有序集合(sorted set / zset):集合中每个元素关联一个分数(score),根据分数升序排序,没有重复元素 字符串string...
2022-04-18 20:46:51
233
原创 Linux常用操作
Linux目录结构 Linux系统中的目录有以下特点: A. / 是所有目录的顶点 B. 目录结构像一棵倒挂的树 Linux常用命令 常用命令演示 在这一部分中,我们主要介绍几个常用的命令,让大家快速感受以下Linux指令的操作方式。主要包含以下几个指令: 在执行Linux命令时,提示信息如果显示为乱码,如上图所示。这是由于编码问题导致,只需要修改Linux的编码即可,命令如下: echo 'LANG="en_US.UTF-8"' >> /etc/profile sourc
2022-04-18 15:48:04
1708
原创 Git常用操作
什么是Git Git 是一个分布式版本控制工具,通常用来对软件开发过程中的源代码文件进行管理。通过Git 仓库来存储和管理这些文件,Git 仓库分为两种: 本地仓库:开发人员自己电脑上的 Git 仓库 远程仓库:远程服务器上的 Git 仓库 使用Git能做什么 代码回溯:Git在管理文件过程中会记录日志,方便回退到历史版本 版本切换:Git存在分支的概念,一个项目可以有多个分支(版本),可以任意切换 多人协作:Git支持多人协作,即一个团队共同开发一个.
2022-04-16 21:49:20
554
原创 mysql读写分离
什么是读写分离? 读写分离,简单地说是把对数据库的读和写操作分开,以对应不同的数据库服务器。主数据库提供写操作,从数据库提供读操作,这样能有效地减轻单台数据库的压力。 一主一从 MyCat控制后台数据库的读写分离和负载均衡由schema.xml文件datahost标签的balance属性控 制。 schema.xml配置: 负责均衡的参数balance,取值有4种,具体含义如下: 在一主一从模式的读写分离中,balance配置1或3都是可以完成读写分离的。 server..
2022-04-02 17:55:55
839
原创 mysql主从复制
概述 主从复制是指将主数据库的DDL和DML 操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。 MySQL支持一台主库同时向多台从库进行复制,从库同时也可以作为其他从服务器的主库,实现链状复制。 MySQL主从复制的优点主要包含以下三个方面: 1.主库出现问题,可以快速切换到从库提供服务。 2.实现读写分离,降低主库的访问压力。 3.可以在从库中执行备份,以避免备份期间影响主库服务。 原理 MySQL主从复制的核心就是二进制日志,具.
2022-04-01 21:01:28
1007
原创 mysql日志
错误日志 错误日志是 MySQL 中最重要的日志之一,它记录了当 mysqld 启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,建议首先查看此日志。 该日志是默认开启的,默认存放目录 /var/log/,默认的日志文件名为mysqld.log 。查看日志位置: show variables like '%log_error%'; 二进制日志 二进制日志(BINLOG)记录了所有的DDL(数据定义语言)语句和DML(数据操纵语言)语句,但不包
2022-04-01 20:50:23
1171
原创 mysql事务原理
我们研究事务的原理,就是研究MySQL的InnoDB引擎是如何保证事务的四大特性的。 而对于这四大特性,实际上分为两个部分。 其中的原子性、一致性、持久化,实际上是由InnoDB中的两份日志来保证的,一份是redo log日志,一份是undo log日志。 而持久性是通过数据库的锁,加上MVCC来保证的。 redo log 重做日志,记录的是事务提交时数据页的物理修改,是用来实现事务的持久性。该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log
2022-04-01 16:15:20
941
原创 mysql中的锁
锁分类 MySQL中的锁,按照锁的粒度分,分为以下三类: 1.全局锁:锁定数据库中的所有表。 2.表级锁:每次操作锁住整张表。 3.行级锁:每次操作锁住对应的行数据。 全局锁 全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语句,已经更新操作的事务提交语句都将被阻塞。 其典型的使用场景是做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。 对数据库进行进行逻辑备份之前,先对整个数据库加上全局锁,一旦加了全局锁之后,其他的DDL..
2022-03-31 21:03:23
1860
原创 mysql触发器
什么是触发器? 在insert/update/delete之前(BEFORE)或之后(AFTER),触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性, 日志记录 , 数据校验等操作 。 使用别名OLD和NEW来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器还只支持行级触发,不支持语句级触发。 语法 案例 通过触发器记录tb_user表的数据变更日志,将变更日志插入到日志表user_logs中, 包含insert,.
2022-03-31 17:37:25
207
原创 mysql存储过程
是什么? 存储过程是事先经过编译并存储在数据库中的一段 SQL 语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的存储过程思想上很简单,就是数据库SQL 语言层面的代码封装与重用。 基本语法 变量 在MySQL中变量分为三种类型: 系统变量、用户定义变量、局部变量。 1.系统变量 系统变量是MySQL服务器提供,不是用户定义的,属于服务器层面。分为全局变量(GLOBAL)、会话变量(SESSION)。 .
2022-03-31 16:32:37
800
原创 mysql视图
什么是试图? 视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。 通俗的讲,视图只保存了查询的SQL逻辑,不保存查询结果。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。 语法: 创建视图:create or replace view 视图名 as select语句 [with local/cascaded check option]; 修改视图:create or replace v
2022-03-31 10:38:55
851
原创 sql优化
insert: 如果我们需要一次性往数据库表中插入多条记录,可以从以下三个方面进行优化。 1.批量插入数据 Insert into tb_test values(1,'Tom'),(2,'Cat'),(3,'Jerry'); 2.手动控制事务 3.主键顺序插入,性能要高于乱序插入。 大批量插入数据: 如果一次性需要插入大批量数据(比如: 几百万的记录),使用insert语句插入性能较低,此时可以使 用MySQL数据库提供的load指令进行插入。操作如下: 主键优化: 1.满..
2022-03-31 09:20:25
196
原创 mysql索引
什么是索引? 索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。 mysql支持的索引结构: 不同存储引擎对于索引的支持: B+Tree : 绿色框框起来的部分,是索引部分,仅仅起到索引数据的作用,不存储数据。 红色框框起来的部分,是数据存储部分,在其叶子节点中要存储具体的数据。 MySQ...
2022-03-31 08:56:34
249
原创 mysql存储引擎
mysql体系结构: 1.连接层 主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。 2.服务层 主要完成大多数的核心服务功能,如SQL接口,并完成缓存的查询,SQL的分析和优化,部分内置函数的执行。所有跨存储引擎的功能也在这一层实现,如过程、函数等。在该层,服务器会解析查询并创建相应的内部解析树,并对其完成相应的优化如确定表
2022-03-29 09:24:49
384
原创 mysql事务
什么是事务? 事务是一组操作的集合,被事务管理的这些操作要么同时成功,要么同时失败。 开启事务的两种方式: 1.设置事务提交方式为手动提交: set @@autocommit = 0; -- 张三给李四转账1000元 -- 1.查询张三账户时候大于1000元 select money from account where name = '张三'; -- 2.张三账户-1000元 update account set money = money - 1000 where name = '张三';
2022-03-29 08:24:46
377
原创 mysql多表查询
内连接查询: 定义:只查询交集 隐式内连接: 语法:select 查询字段 from 表1,表2 where 查询条件; -- 多表查询之隐式内连接 select emp.name,dept.name from emp,dept where emp.dept_id=dept.id; 显示内连接: 语法:select 查询字段 from 表1 inner join 表2 on 查询条件; -- 多表查询之显式内连接 select e.name,d.name from emp e inner
2022-03-28 17:55:57
797
原创 mysql字段约束
约束分类: 非空约束:NOT NULL; 唯一约束:UNIQUE; 主键约束:PRIMARY KEY; 外键约束:FORIGN KEY; 默认约束:DEFAULT; 检查约束:CHECK; 约束演示: create table user( id int primary key auto_increment comment '主键', name varchar(10) not null unique comment '姓名', age int comment
2022-03-28 16:01:29
470
原创 mysql中常用的函数
字符串函数 select concat('hello','mysql');将两个字符串拼接为一个字符串; select lower('HELLO');把HELLO转换为小写的hello; select upper('hello');把hello转换为大写的HELLO; select lpad('hello',10,'-');在字符串hello左侧拼接上“-”,最终输出为长度为10的字符串“-----hello”; select rpad('hello',20,'!');在字符串hello右侧拼接
2022-03-28 11:19:48
2946
空空如也
请问我编写的这个二分查找程序为啥没有任何输出呢?
2022-02-07
windows无法访问在linux上安装的docker中创建的nginx容器
2022-02-11
windows无法连接docker中创建的mysql、nginx、tomcat等服务
2022-02-10
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅