框架源码专题-MySQL-8、SQL优化
https://segmentfault.com/a/1190000040598165 1. 优化步骤概览1.1. 查看 SQL 执行频率1.2. 定位低效率执行 SQL1.3. explain 分析执行计划1.4. show profile 查看 SQL 耗时1.5. trace 分析优化器执行计划2. 执行频率2.1. show status like ‘Com_______’1show status like 'Com_______'; 当前连接全局 3. 定位低效 SQL3.1. show processlist 慢查询日志在查询结束以后才记录,所以在应用反映执行效率出现问题的时候查询慢查询日志并不能定位问题,可以使用 show processlist 命令查看当前 MySQL 在进行的线程,包括线程的状态、是否锁表等,可以实时地查看 SQL 的执行情况,同时对一些锁表操作进行优化。 3.2. 慢查询日志 4. explain- 查看执行计划4.1. explain 4.2. type查询执行的类型,描述了查询是如何执行的。所有值的顺序从最优到最差排序 ...
Mybatis
1. 什么是 Mybatishttps://www.bilibili.com/video/BV1MT4y1k7wZ/?spm_id_from=..search-card.all.click&vd_source=c5b2d0d7bc377c0c35dbc251d95cf204 1.1. 是什么 1.2. 解决的问题%%▶6.🏡⭐️◼️【🌈费曼无敌🌈⭐️第一步⭐️】◼️⭐️-point-20230419-1501%%❕ ^f9rguv 2. 组成架构%%▶7.🏡⭐️◼️【🌈费曼无敌🌈⭐️第一步⭐️】◼️⭐️-point-20230419-1502%%❕ ^coqkl4 https://github.com/zzyandzzy/mybatis-book/tree/%E4%B8%80%E7%BA%A7%E7%BC%93%E5%AD%98%E8%A3%85%E9%A5%B0%E8%80%85 2.1. 重要组件 简单执行器simpleExecutor,每次执行 SQL 都要预编译 SQL 语句。 可重用执行器ReuseExecutor,同一 SQL 语句执行只需要预 ...
框架源码专题-Redis-6、缓存穿透-缓存击穿-缓存雪崩
1. 缓存穿透 一个一定不存在缓存及查询不到的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。 1.1. 产生原因Key 在缓存和数据库中都不存在 1.2. 解决方案1.2.1. 对空值进行缓存 如果一个查询返回的数据为空(不管是数据是否不存在),我们仍然把这个空结果(null)进行缓存,设置空结果的过期时间会很短,最长不超过五分钟 1.2.2. 设置白名单 -bitmap-过滤恶意请求使用 bitmaps 类型定义一个可以访问的名单,名单 id 作为 bitmaps 的偏移量,每次访问和 bitmap 里面的 id 进行比较,如果访问 id 不在 bitmaps 里面,进行拦截,不允许访问。 缓存-Redis-1、基本原理 1.2.3. 采用布隆过滤器-过滤对不存在的数据的请求缓存-Redis-7、案例落地实战 (布隆过滤器(Bloom Filter)是 1970 年由布隆提出的。它实际上是一个很长的二进制向量 (位图) 和一系列随机映射函数(哈希函数)。 布隆过滤器 ...
框架源码专题-Redis-5、案例落地实战
1. 键值设计 [[Redis高级篇之最佳实践.md]] 2. 布隆过滤器 -BloomFilter%%▶1.🏡⭐️◼️【🌈费曼无敌🌈⭐️第一步⭐️】◼️⭐️-point-20230502-1633%%❕ ^o440ad 2.1. 是什么布隆过滤器(Bloom Filter)是 1970 年由布隆提出的。它实际上是一个很长的 二进制向量 和 一系列随机映射函数 。布隆过滤器可以用于 检索一个元素是否在一个集合中 。它的优点是 空间效率和查询时间都比一般的算法要好的多 ,缺点是有一定的 误识别率和删除困难 。 可以理解为:有个二进制的 集合 ,里面存放的 0 和 1,0 代表不存在,1 代表存在,可以通过一些定义好的 方法 快速判断元素是否在集合中。内部逻辑如下图展示 2.2. 作用 由于布隆过滤器的特性,能够判断一个数据 可能在集合中 ,和一个数据 绝对不在集合中 ,所以他可以用于以下场景 网页 URL 的去重(爬虫,避免爬取相同的 URL 地址) 垃圾邮件的判别 集合重复元素的判别 查询加速(比如基于 key-value 的存储系统) 解决缓存穿透,使用 BloomFi ...
框架源码专题-Redis-4、原理进阶
1. Redis 使用单线程含义主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,Redis 在处理客户端的请求时包括获取 (socket 读)、解析、执行、内容返回 (socket 写) 等都由一个顺序串行的主线程处理,这就是所谓的“单线程”。这也是 Redis 对外提供键值存储服务的主要流程。 但 Redis 的其他功能,比如持久化 RDB、AOF、异步删除、集群数据同步等等,其实是由额外的线程执行的。 Redis 命令工作线程是单线程的,但是,整个 Redis 来说,是多线程的; 2. 单多线程演进变化2.1. 单多线程版本发展历史Redis 的版本很多 3.x、4.x、6.x,版本不同架构也是不同的,不限定版本问是否单线程也不太严谨。 版本 3.x ,最早版本,也就是大家口口相传的 redis 是单线程。 版本 4.x,严格意义来说也不是单线程,而是负责处理客户端请求的线程是单线程,但是开始加了点多线程的东西 (异步删除)。 2020 年 5 月版本的 6.0.x 后及 2022 年出的 7.0 版本后,告别了大家印象中的单线程,用一种全新的多线程来解 ...
分布式专题-11、ELK-ES
1. 什么是 elasticsearchelasticsearch 是一个开源的分布式搜索引擎,可以用来实现搜索、日志统计、分析、系统监控等功能,底层是基于 lucene 来实现的。Lucene 是一个 Java 语言的搜索引擎类库,是 Apache 公司的顶级项目。 1.1. 特性 第一、采用 Master-slave 架构,实现数据的分片和备份 第二、使用 Java 编写,并对 Lucene 进行封装,隐藏了 Lucene 的复杂性 第三、能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据 第四、ES 提供的 Restful API,不仅简化了 ES 的操作,还支持任何语言的客户端提供 API 接口,另外 Restful API 的风格还实现了 CURD 操作、创建索引,删除索引等功能。 1.2. 什么是 elastic stack(ELK) 是以 elasticsearch 为核心的技术栈,包括 beats、Logstash、kibana、elasticsearch 2. 倒排索引倒排索引的概念是基于 MySQL 这样的正向索引而言的。 2.1. 正 ...
框架源码专题-Redis-3、缓存过期删除与淘汰策略
1. 删除策略1.1. 定时删除 (自动过期)单单依靠使用设置的过期时间,到期立即删除。可以理解为立即删除策略 Redis 不可能时时刻刻遍历所有被设置了生存时间的 key,来检测数据是否已经到达过期时间,然后对它进行删除。立即删除能保证内存中数据的最大新鲜度,因为它保证过期键值会在过期后马上被删除,其所占用的内存也会随之释放。但是立即删除对 cpu 是最不友好的。因为删除操作会占用 cpu 的时间,如果刚好碰上了 cpu 很忙的时候,比如正在做交集或排序等计算的时候,就会给 cpu 造成额外的压力,让 CPU 心累,时时需要删除,忙死。。。。。。这会产生大量的性能消耗,同时也会影响数据的读取操作。 总结:对 CPU 不友好,用处理器性能换取存储空间(拿时间换空间) 1.2. 惰性删除 (被动检查) 数据到达过期时间,不做处理。等下次访问该数据时,如果未过期,返回数据; 发现已过期,删除,返回不存在。 惰性删除策略的缺点是,它对内存是最不友好的。 如果一个键已经过期,而这个键又仍然保留在数据库中,那么只要这个过期键不被删除,它所占用的内存就不会释放。在使用惰性删除策略时,如果 ...
经验专题-Bean拷贝-1、原理对比
1. 特性https://segmentfault.com/a/1190000040106844 https://cloud.tencent.com/developer/article/1624695 Spring.BeanUtils:是浅拷贝,不支持深拷贝 Apache.BeanUtils:是浅拷贝,不支持深拷贝 BeanCopier:是浅拷贝,不支持深拷贝。BeanCopier 的实现原理跟 BeanUtils 截然不同,它不是利用反射对属性进行赋值,而是直接使用 cglib 来生成带有的 get/set 方法的 class 类,然后执行。由于是直接生成字节码执行,所以 BeanCopier 的性能接近手写 BeanUtils 和 BeanCopier 都是功能比较简单的,需要属性名称一样,甚至类型也要一样。 Dozer:是深拷贝。Dozer 的实现原理本质上还是用反射/Introspector 那套 Orika:是深拷贝。底层使用 Javassist 生成字节码 JMapper:未知 MapStruct:是浅拷贝,不支持深拷贝。MapStruct 是一个自动 ...
分布式专题-7、远程调用-F'ei'g'n
1. Feign 与 OpenFeign 与 RibbonFeign 内置了 Ribbon 作为负载均衡实现OpenFeign 基于 Feign 增加了对 SpringMVC 注解的支持 a、他们底层都是内置了 Ribbon,去调用注册中心的服务。b、Feign 是 Netflix 公司写的,是 SpringCloud 组件中的一个轻量级 RESTful 的 HTTP 服务客户端,是 SpringCloud 中的第一代负载均衡客户端。OpenFeign 是 SpringCloud 自己研发的,在 Feign 的基础上支持了 Spring MVC 的注解,如@RequesMapping 等等。是 SpringCloud 中的第二代负载均衡客户端。c、Feign 本身不支持 Spring MVC 的注解,使用 Feign 的注解定义接口,调用这个接口,就可以调用服务注册中心的服务 OpenFeign 的@FeignClient 可以解析 SpringMVC 的@RequestMapping 注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。 2. Feig ...
分布式专题-8、网关-GateWay
1. 分类 面对互联网复杂的业务系统,基本可以将服务网关分成两类:流量网关和业务网关。流量网关:跟具体的后端业务系统和服务完全无关的部分,比如安全策略、全局性流控策略、流量分发策略等。业务网关:针对具体的后端业务系统,或者是服务和业务有一定关联性的部分,并且一般被直接部署在业务服务的前面。业务网关一般部署在流量网关之后,业务系统之前,比流量网关更靠近系统。我们大部分情况下说的 API 网关,狭义上指的是业务网关。并且如果系统的规模不大,我们也会将两者合二为一,使用一个网关来处理所有的工作 2. 作用 3. 跨域问题12345678910111213141516171819spring: cloud: gateway: # 。。。 globalcors: # 全局的跨域处理 add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题 corsConfigurations: '[/**]': allowedOrigi ...

