- 博客(121)
- 资源 (2)
- 收藏
- 关注
原创 设计模式 -- 策略模式+Spring Bean代替if/else
设计模式 – 策略模式+Spring Bean代替if/else策略模式一、什么是策略模式策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。二、策略模式的结构策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:“准备一组算法,并将每一个算
2020-10-18 19:42:30 1606 9
转载 try-catch-finally的字节码原理
Java 中有一个非常重要的内容是 try-catch-finally 的执行顺序和返回值问题,其中 finally 一定会执行,但是为什么会这样?下面看下 try-catch-finally 背后的实现原理。
2023-08-01 21:46:01 330
原创 Redis - Bitmap
操作String数据类型的key所存储的字符串指定偏移量上的位,返回原位置的值节省空间通过一个bit位来表示某个元素对应的值或者状态,其中key就是对应元素的值。实际上8个bit可以组成一个Byte,所以是及其节省空间的效率高setbit 和 getbit的时间复杂度都是O(1),其他位运算效率也高不在意业务数据本质上位只有0和1的区别,所以用位做业务数据记录,就不需要在意value的值、位图不是特殊的数据结构,它的内容其实就是普通字符串,也就是 byte 数组。
2023-07-28 23:20:21 533
原创 String 的 switch-case 实现原理
前面我们已经知道 String 的 switch-case 实现原理 依据 case 值的稀疏程度,分别由两个指令 - tableswitch 和 lookupswitch 实现,但是这两个指令都支持整型, 如何让 String 类型的值 也支持 String 的 switch-case 实现原理。可以看到34 行在 hashCode 冲突的情况下,编译器的处理不过是多一次调用字符串 equals 判断相等的比较。看到这里可以能会发现, 字符串的 hashCode冲突要怎么样解决。
2023-07-28 22:53:51 647
原创 HTTP报文首部
HTTP协议的请求和响应报文中必定包含 HTTP 首部。 首部内容为客户端和服务器分别处理请求和响应锁需要的信息。有4中类型的首部字段: 通用首部字段、请求首部字段、响应首部字段和实体首部字段请求报文和响应报文两方都会使用的从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、响应内容相关优先级信息从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息针对请求报文和响应白问的实体部分使用的首部。补充了资源内容更新时间等于实体有关的信息645
2022-11-07 22:41:25 2408 1
原创 MySQL全文索引
MySQL全文索引简介全文索引(也称全文检索)是目前搜索引擎使用的一种关键技术。它能够利用「分词技术「等多种算法智能分析出文本文字中关键字词的频率及重要性,然后按照一定的算法规则智能地筛选出我们想要的搜索结果。通过数值比较、范围过滤等就可以完成绝大多数我们需要的查询,但是,如果希望通过关键字的匹配来进行查询过滤,那么就需要基于相似度的查询,而不是原来的精确数值比较。全文索引就是为这种场景设计的。全文索引可以支持各种字符串内容搜索(包括 char、varchar、text)也支持自然语言和布尔搜索,在
2022-04-07 15:58:27 1520
原创 Redis - 主从同步
Redis - 主从同步Redis 主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其它从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行读写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整对消息发布记录。同步对读取操作对可扩展性和数据冗余很有帮助有了主从,当 master 挂掉的时候,让从库过来接管,服务就可以继续,否则 master 需要经过数据恢复和重启的过程,这种可能会拖很长的时间,影响
2022-04-05 16:53:13 1977
原创 Redis - HyperLogLog
Redis - HyperLogLogRedis 在2.8.9版本添加了 HyperLogLog 结构在介绍HyperLogLog之前,我们先思考一个常见的业务问题:如果开发一个大型网站,要记录每个网页每天的UV数据,我们应该如何实现呢?如果统计PV那非常容易,给每个网页一个独立的Redis计数器就可以了,这个计数器的key后缀加上当天的日期。这样来一个请求,incrby一次,最终就可以统计出所有的PV数据。但是UV不一样,它要去重,也许我们可以想到一个简单的方案,为每个网页创建一个set集合来存储当
2022-04-05 16:43:06 944
原创 Redis - LRU
Redis -LRU当 Redis 内存超出物理内存时,内存的数据会开始喝磁盘产生频繁的交换(swap)交换会让 Redis 的性能急剧下降,对于访问量比较频繁的 Redis 来说这样龟速的存取效率基本上等于不可用。在生产环境下我们是不允许 Redis 出现交互行为的,为了限制最大使用内存,Redis 提供了配置参数 maxmemory 来限制最大内存当实际内存超出 maxmemory 时,Redis 提供了集中可选策略策略介绍no-eviction当内存不足以容纳新写入数据时
2022-04-05 16:23:23 1112
原创 MySQL如何执行关联查询
MySQL如何执行关联查询MySQL中关联一次意义比较广泛,并不仅仅是一个查询需要到2个表匹配才叫关联,而是任何一个查询都是一次关联,每一个查询,片段(包括子查询单表的查询)都可能是关联当前 MySQL 关联执行策略很简单:MySQL 对任何关联都执行嵌套循环关联操作,即 MySQL 现在一个表中循环取出单条数据,然后再嵌套到下一个表中寻找匹配的行,依次下去,直到找到所有表中匹配的行为止。然后根据各个表匹配的行,返回查询中需要的各个列。MySQL 会尝试在最后一个关联表中找到所有匹配的行,如果最后一个关
2022-04-04 21:25:17 2806 1
原创 一条SQL查询语句是如何执行的
一条SQL查询语句是如何执行的当希望 MySQL 能够以更高的性能查询时,最好的办法就是弄清楚 MySQL 是如何优化和执行查询的mysql> select * from test where id = 10;如上,MySQL 执行了一条查询的过程,MySQL到底做了什么客户端发送一条查询给服务器服务器先检查缓存,如果命中缓存,则立刻返回存储在缓存中的结果。否则进入下一阶段服务器端进行 SQL 解析、预处理、再由优化器生成对应的执行计划MySQL 根据优化区生成执行计划,调用存储引
2022-04-04 17:40:19 1428
原创 MySQL高性能索引策略
高性能索引策略正确地创建和使用索引是实现高性能查询的基础。高效地选择和使用索引有很多种方式,其中有些是针对特殊案例的优化方法,有些则是针对特定行为的优化。独立的列我们通常会看到一些查询不当地使用索引,或者使得 MySQL 无法使用已有的索引。如果查询的列不是独立的,则 MySQL 就不会使用索引。独立的列是指索引列不能是表达式的一部分,也不能是函数的参数。例如,下面查询无法使用索引select actor_id from where sakila.actor where actor_id + 1
2022-04-03 17:44:12 602
原创 MySQL数据类型优化
MySQL数据类型优化良好的逻辑设计和物理设计是高性能的基础,MySQL 支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要。不管存储哪种类型的数据,下面几个简单的原则都有助于做出更好的选择。选择最小数据类型一般情况下。尽量使用可以正确存储数据的最小数据类型。更小的数据类型通常更快,因为它们占用更少磁盘、内存和 CPU 缓存,并且处理时需要的 CPU 周期也更少选择简单数据类型简单数据类型操作通常需要更少的 CPU 周期,例如,整型比字符操作代价更低,因为字符集和校对规则(排序
2022-03-30 22:14:07 870
原创 使用show profiles分析SQL性能
使用show profiles分析SQL性能show profiles 是在 MySQL 5.1 之后的版本引入的,来源于社区中的 Jeremy Cole 的贡献,默认是禁用的,但是可以通过服务器变量在会话(连接级别)动态的修改。mysql> set profiling=1;然后再服务器上执行的所有语句,都会测量其耗费的时间和其他一些查询执行状态变更的数据。该参数开启后,后续执行的SQL语句都将记录其资源开销,诸如IO,上下文切换,CPU,Memory等等。根据这些开销进一步分析当前SQL瓶颈
2022-03-28 22:50:55 203 1
原创 MySQL事务
MySQL事务MySQL 事务主要用于处理操作量大,复杂度高的数据。事务就是一组原子性的 SQL 查询,或者说是一个独立的工作单元。如果数据库引擎能够成功地对数据库应用该组查询的全部语句,那么久执行该组查询。如果其中有任何一条语句因为崩溃或其他原因无法执行,那么所有语句都不会执行,也就是说,事务内的语句,要么全部执行成功,要么全部执行失败。ACIDACID 表示 原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)原子性(at
2022-03-24 22:54:00 892
原创 Redis - 慢查询
Redis - 慢查询Redis 的慢查询日志功能用于记录执行时间超过给定时长的命令请求,用户可以通过这个功能产生的日志来监视和优化查询速度。服务配置慢查询参数:slowlog-log-slower-than 选项指定执行时间超过多少微秒(1秒等于 1000000 微秒)的命令请求会被记录到日志上举例,如果这个选项值为100,那么执行时间超过100微秒的命令就会被记录到慢查询日志,如果这个选项为500,那么执行时间超过500微秒的命令就会被记录到慢查询日志slowlog-max-len 选
2022-03-22 22:30:13 2355
原创 MySQL并发控制
Mysql并发控制无论何时,只要有多个查询需要在同一时刻修改数据,都会产生并发控制问题,mysql可以在两个层面进行并发控制:服务器层和存储引擎层。mysql通过加锁实现并发控制:锁有两类:读锁:共享锁,即一个读锁不会阻塞其它读锁,多个用户可同时读取同一个资源,而不互相干扰。写锁:排他锁,即一个写锁会阻塞其它读写锁,在给定时间内,只有一个用户能执行写入。锁粒度:表级锁:锁定整张表行级锁:并发程度更高,但维护较麻烦,会增加系统开销,易产生死锁。行级锁只能在存储引擎级别实现,MyISAM存
2022-03-21 22:59:31 4090
原创 Neo4j - Neo4j概述
Neo4j - Neo4j概述Neo4j是由 Java 实现的开源 NoSQL 图数据库。Neo4j实现了专业数据库级别的图数据模型的存储。与普通的图处理或内存数据库不同,Neo4j 提供了完整的数据库特性,包括 ACID 事务的支持、集群支持、备份与故障转移等,这使其适合于企业级生产环境下各种应用。Neo4j 还提供了一些特殊的功能一个本地化的图数据库:Neo4j 自底向上构建成一个图数据库。它的体系结构旨在优化快速管理、存储和遍历节点和关系。在 Neo4j 中,关系是数据库中最重要的元素,它代表
2022-03-17 22:51:34 13457 1
原创 Redis - Pipeline
Redis - PipelineRedis 的 pipeline(管道)功能在命令行中没有,但 redis 是支持 pipeline 的,而且在各个语言的 client 都有相应的实现。由于网络开销延迟,就算 redis server 端有很强的处理能力,也会由于收到的 client 消息少,而造成的吞吐量小。当 client 使用 pipeliing 发送命令时 redis server 必须将部分请求放到队列中(使用内存),执行完毕后一次性发送结果;如果发送的命令很多的话,建议对返回结果加标签,当然这
2022-03-17 09:58:30 2528
原创 Redis - 通信协议
Redis - 通信协议Redis 的作者认为数据库系统的瓶颈不在于网络流量,而是数据库自身内部逻辑处理上。所以即使Redis 使用了浪费流量的文本协议,依然可以取得极高的访问性能。Redis 将所有数据都放在内存,用一个单线程对外提供服务,单个节点在跑慢一个 CPU 核心的情况下可以达到了 10w/s的超高 QPS。RESP(Redis Serialization Protocol)RESP 是 Redis 序列化协议的简写。它是一种直观的文本协议,又是在于实现异常简单,解析性能极好。Redis
2022-03-17 09:35:07 1370
原创 Nginx解决个别接口CORS跨域
前端Ajax或Axios等XMLHttpRequest请求一个第三方的接口时,会出现跨域问题。简单请求与复杂请求的差别是复杂请求会自动发出一个 OPTIONS 的预检请求,当请求得到确认后,才开始真正发送请求。综上,我们要解决两个问题:OPTIONS 请求的正确响应跨域请求正确响应解决方案只需在Nginx侧过滤掉OPTIONS请求,不转发给第三方接口,直接在Nginx就返回前端。前端就会认为OPTIONS请求成功了继续发送POST请求,此时Nginx将此次的POST请求真正转发给第三方接口
2022-03-13 23:38:48 4912
原创 Neo4j - 图数据基础
图数据基础图数据库介绍图数据库(Graph Database) 是基于图论实现的一种新型 NoSQL 数据库。它的数据存储结构和数据查询方式都是以图论为基础的。图论中图的基本元素为节点和边,在图数据库中对应的就是节点和关系。在图数据库中,数据与数据之间的关系通过节点和关系构成一个图结构并在此结构上实现数据库的所有特性,如对图数据对象进行创建、读取、更新、删除等操作,还有处理事务对能力和高可用性等。图数据库模型图数据要具体存储到图数据库中,最终落实为具体到数据文件,自然就涉及特定到图数据模型,即如
2022-03-08 23:53:21 537
原创 Redis - Info指令
Redis - Info指令在使用 Redis 时,时常会遇到很多问题需要诊断,在诊断之前需要了解 Redis 的运行状态,通过强大的 Info 指令,可以清晰地知道 Redis 内部一系列运行参数。Info 指令显示的信息非常繁多,Server: 服务器运行的环境参数Clients: 客户端相关信息Memory: 服务器运行内存统计数据Persistence: 持久化信息State: 通用数据统计Replication: 主从复制相关信息CPU: CPU使用情况commandstat
2022-03-06 22:49:42 1236
原创 Neo4j - 初识图数据库
初识图数据库什么是图数据库(graph database)随着社交、电商、金融、零售、物联网等行业 的快速发展,现实社会织起了一张庞大而复杂的关系网,传统数据库很难处理关系运算。大数据行业需要处理的数据库之间的关系随数据量几何增长,而关系型数据库暴露出一些它始终无法解决问题,其中最主要的是数据建模中的一些缺陷和问题,以及在大数据下和多服务器之上进行水平伸缩的限制,急需一种支持海量复杂关系运算的数据库,图数据库应运而生图数据结构由可以通过关系连接的节点(离散对象)组成。图由两个元素组成节点关系
2022-02-27 15:16:38 626 7
原创 Redis - GEO
Redis - GEORedis 在 3.2版本以后增加了地理位置 GEO 模块, 意味着我们可以使用 Redis 来实现摩拜单车 【附近的Mobike】、美团和饿了么 【附近的餐馆】这样的功能来。用数据库来算附近的人地图元素的位置数据使用二维的经纬度表示,经度范围【-180,180】,纬度范围【-90,90】,纬度正负以赤道为界,北正南负,经度正负以本初子午线(英国格林尼治天文台) 为界,东正西负。比如比如掘金办公室在望京 SOHO,它的经纬度坐标是 (116.48105,39.996794),都是
2022-02-26 16:30:27 624
原创 TCP - 首部
TCP - 首部这篇文章来讲讲 TCP 报文首部相关的概念,这些头部都是支撑TCP复杂功能的基石我们通过网络抓包 Wireshark 来抓一个TCP包源端口、目标端口计算机上的进程要和其他进程通信是要通过计算机端口的,而一个计算机端口某个时刻只能被一个进程占用,所以通过指定源端口和目标端口,就可以知道是哪两个进程需要通信。源端口、目标端口是用16位表示的,可推算计算机的端口个数为2^16个(源IP,源端口,目的IP,目的端口) 四元组确定唯一一个TCP连接;(IP,端口)也称为一个插口(soc
2022-02-20 17:39:32 4058
原创 wireshark抓包
wireshark抓包通过 wireshark 抓包查看 ping www.baidu.com 发送的包通过 ping 命令,实际上发送了n次 ICMP 数据包打开 wireshark 选择对应的网卡,执行完需要抓包的操作,如 ping www.baidu.com ,为避免其他影响,可以通过在过滤栏设置过滤条件进行数据包列表过滤...
2022-02-14 16:45:33 1695
原创 Java获取时间几月第几周
import java.time.*;import java.util.Calendar;import java.util.Date;import java.util.Locale;/** * @author yxl * @version 1.0 * @date 2021/12/06 */public class WeekUtil { /** * 根据时间获取月的第几周 * @param sourceTime * @return */
2021-12-14 18:17:38 1302
原创 缓存穿透解决方案-布隆过滤器
文章目录1. 什么是布隆过滤器2. 布隆过滤器原理介绍3. 布隆过滤器使用场景4. 手写布隆过滤器5. 利用Google开源的Guava中自带的布隆过滤器6. Redis中的布隆过滤器1. 什么是布隆过滤器布隆过滤器(Bloom Filter)是一个叫做Bloom 于1970年提出的。我们可以把它看做由二进制向量(或者说位数组)和一系列随机映射函数(哈希函数)两部分组成的数据结构。相比于我们平时用的 List 、Map 、Set 等数据结构,它占用看见更少并且效率更高。但是缺点是其返回的结果是概率性的,
2021-08-10 18:30:48 523 1
原创 排序算法 - 计数排序
文章目录概念:案例:计数排序优缺点概念:计数排序不是一个比较排序算法,该算法于1954年由 Harold H. Seward提出,通过计数将时间复杂度降到了O(N),利用数组下标来缺的元素的正确位置案例:假设数组中有10个随机数,取值范围0~10,要求用最快的速度把这20个证书从小到大进行排序考虑到这些整数只能够在 0、1、2、3、4、5、6、7、8、9、10 这11个数中取值,取值范围有限。所以,可以根据这有限的范围,建立一个长度为11的数组,数组下标从0-10,元素初始值全为0假设1
2021-06-24 15:39:44 367 1
原创 排序算法 - 堆排序
文章目录1. 什么是堆堆排序1. 什么是堆堆的本质上是一种完全二叉树,它分为两个类型最大堆: 最大堆的任何一个父节点的值,都大于或等于它左、右孩子节点的值最小堆: 最小堆的任何一个父节点的值,都小于或等于它左、右孩子节点的值堆的根节点叫做 堆顶最大堆和最小堆的特点决定了 最大堆的堆顶是整个堆中的最大元素,最小堆的堆顶就是整个堆中的最小元素该数组从逻辑上讲就是一个堆结构,我们用简单的公式来描述一下堆的定义就是:大顶堆:arr[i] >= arr[2i+1] &&a
2021-06-20 23:36:08 318 1
原创 JVM垃圾收集器与内存分配策略
文章目录概述1. 内存分配与回收策略1.1 对象优先在Eden分配1.2 大对象直接进入老年代概述说起垃圾收集器 (Garbage Collection,下文简称GC),Java 内存区域的各个部分,其中 程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭,栈中的栈帧随着方法的进入和退出而有条不紊执行着出栈和入栈操作。每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,因此 这几个区域的内存分配和回收都具备确定性,在这个区域内就不需要过多的考虑如何回收的问题,当方法结束或者线程结束时
2021-06-02 15:02:54 741 2
原创 排序算法 - 快速排序
简介同冒泡排序一样,快速排序也属于交换排序,通过元素之间的比较和 交换位置来达到排序的目的。不同的是,冒泡排序在每一轮中只把1个元素冒泡到数列的一端,而快速排序则在每一轮挑选一个基准元素,并让其他比它大的元素移动到数列一边,比它小的元素移动到数列的另一边,从而把数列拆分成两个部分。...
2021-05-13 00:58:51 1171 9
原创 排序算法 -鸡尾酒排序
简介鸡尾酒排序是冒泡排序的一种,又称为来回排序。它比冒泡排序要高级点, 冒泡排序的每一个元素都可以像小气泡一样,根据自身大小,一点一点地向着数组的一侧移动。算法的每一轮都是从左到右来比较元素,进行单向的位置交换。而鸡尾酒排序元素比较和交换过程是双向的。举例,有数组 int[] array={5,8,6,3,9,2,1,7};第一趟排序:从左往右第一次排序:5 和 8 比较,5 小于 8 ,位置不变: 5,8,6,3,9,2,1,7第二次排序:8 和 6 比较,8 大于 6 ,交换位置
2021-05-10 17:49:42 344 1
原创 排序算法 - 冒泡排序
文章目录简介简介冒泡排序是一种非常主流的排序算法,冒泡排序的英文(Bubble sort),它是一种基础的交换排序。原理 : 比较两个相邻的元素,将值大的元素交换至右端。思想: 把相邻的元素两两比较,当一个元素大于右侧相邻元素时,交换他们的位置。当一个元素小于或等于右侧相邻元素时,位置不变。举例说明:要排序数组:int[] array={5,8,6,3,9,2,1,7};第一趟排序:第一次排序:5 和 8 比较,5 小于 8 ,位置不变: 5,8,6,3,9,2,1,7第二次排
2021-05-07 15:27:08 362
原创 Java内存区域
文章目录一 概述二 运行时数据区域2.1 程序计数器2.2 Java 虚拟机栈2.3 本地方法栈2.4 堆2.5 方法区2.5.1 方法区和永久代的关系2.5.2 常用参数2.5.3 为什么将永久代(PermGen)替换为元空间(MetaSpace)呢?2.6 运行时常量池2.7 直接内存三 HotSpot 虚拟机对象3.1 对象的创建3.1.1 类加载检查3.1.2 分配内存3.1.3 初始化零值3.1.4 设置对象头3.1.5 执行 init 方法3.2 对象的内存布局3.3 对象的访问定位一 概述
2021-04-25 16:01:06 152
原创 AQS原理解析
文章目录1. AQS介绍2. AQS原理3. 源码分析AQS 模版方法模式加锁 (独占锁 )释放锁 (独占锁 )加锁 (共享锁)释放锁 (共享锁)1. AQS介绍 AQS 的全程为 (AbstractQueuedSynchronizer)这个类在 java.util.concurrent.locks 包下public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer im
2021-04-21 20:03:36 586
原创 JUC中的Atomic原子类
文章目录Atomic 原子类1. 原子类介绍2. 基本类型原子类3. 数组类型原子类Atomic 原子类1. 原子类介绍不可分割的一个操作是不可中断的,即使多线程的情况下也可以保证, 即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。原子类的作用和锁类似,是为了保证并发情况下线程安全,不过相比于锁,更有优势优势: 粒度更细,效率更高原子类纵览:类型ValueAtomic*基本类型原子类AtomicIntegerAtomicLon
2021-04-16 14:46:42 354 1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人