自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(117)
  • 收藏
  • 关注

原创 Protobuf 通信协议

在移动互联网时代,手机流量、电量是最为有限的资源,而移动端的即时通讯应用无疑必须得直面这两点解决流量过大的基本方法就是使用高度压缩的通信协议,而数据压缩后流量减小带来的自然结果也就是省电:因为大数据量的传输必然需要更久的网络操作、数据序列化及反序列化操作,这些都是电量消耗过快的根源当前即时通讯应用中最热门的通信协议无疑就是 Google 的 Protobuf 了。

2024-04-30 14:47:04 670

原创 数据库分库分表

如果存储的数据过多,查询效率会大大降低,如何去解决这个问题?1,限定数据的范围:禁止不带任何限制数据范围条件的查询语句,这样就不用查询整个数据库2,范式优化(垂直拆表):优化为 BC 范式,删除重复数据,或者单纯的拆字段3,水平拆表:保持数据表结构不变,通过某种策略将存储的数据分片。这样每一片数据分散到不同的表或者库中4,读写分离:主读副写,配置一下来实现 mysql 的主从复制今天介绍的重点就是垂直拆表(拆字段)和水平拆表(拆数据)

2024-03-24 13:35:55 247

原创 抽象方法与设计模式

真正的屎山不是初级程序员写的巨量胶水代码,而是没学明白抽象的程序员写的大量设计模式耦合形成的。你甚至不理解为什么当初的创作者需要使用到这个设计模式,不知道从哪开始读之前的代码,甚至在心中咒骂之前的作者无数遍。为了不让我们的后者觉得我们的水平很差,学好设计模式是很重要的设计模式代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决本文会列出几个常用框架以及 jdk 中使用的设计模式。

2024-02-20 21:20:22 1342

原创 权限系统设计

普通的系统无非 CRUD,那系统如何控制一个用户该看到哪些数据、能操作哪些功能?日常开发中最常用到 RBAC 和 OAuth2 这两种访问控制和授权方案。

2024-02-13 14:21:27 681

原创 Java 语法糖

语法糖指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用带有语法糖的代码一般不能直接翻译为汇编语言,JDK 需要将语法糖先翻译成直接支持的编程语言,然后执行正常的转换为汇编语言的操作。在 java 中,翻译语法糖的任务被交给了前端编译器。

2024-02-07 17:46:25 899 1

原创 Java 序列化

序列化机制可以让对象地保存到硬盘上,减轻内存压力的同时,也起了持久化的作用;也可以让 Java 对象在网络传输。一般我们可以使用 java 自带的序列化机制和 json 来就行序列化。以下讲解一下序列化相关概念。

2024-01-24 20:24:07 857

原创 excel 各种用法

函数的第四个参数填 TURE 或者 FALSE,意思为模糊查找和精确查找,这里选择 FALSE,点击回车即可实现两个表格关联。函数第一个参数设置成 sheet1 中的 A 列(如果数据很多,可以直接选中 A 列)函数的第三个参数填需查找条件所在列数,实例中查找名字,但返回的城市在第二列,所以就填2。实现两个 sheet 间的关联需要用 vlookup 函数实现。函数的第二个参数选中 sheet2 中的 A 列和 B 列。

2024-01-18 17:43:18 973

原创 Java 图片文件上传下载处理

做这玩意给我恶心坏了。

2023-12-18 22:05:23 945

原创 分布式 id

2,自增 ID:不管是数据库自增还是MP自增,分布式数据库中总是要存放一定范围的数据,使用自增策略可能会导致不同数据库存放同一id的问题。雪花算法是一个比较常见的生成分布式 id 的方式,它会生成一个 8 字节的数据,通过确保每段数据在空间与时间上唯一来确定最终数据的唯一。接下来 41bit 代表时间戳,这个是毫秒级的时间,存放时间戳的差值(当前时间-固定的开始时间),41位的时间戳可以使用69年。4,雪花算法:生成一个64bit的id,也就是long类型的数字,长度适中并且方便快捷。

2023-11-17 17:49:22 769

原创 Java Stream 的使用

它的作用就是链式的对一组元素进行操作,它的操作分为中间操作或者最终操作两种,最终操作返回一特定类型的计算结果,而中间操作返回 Stream 本身,以下是常见的操作无状态:指元素的处理不受之前元素的影响有状态:指该操作只有拿到所有元素之后才能继续下去非短路操作:指必须处理所有元素才能得到最终结果短路操作:指遇到某些符合条件的元素就可以得到最终结果Stream 可以使用串行和并行来完成操作,串行操作是用一个线程依次执行,而并行操作使用了多线程,将 stream() 改为 parallelStream(

2023-11-14 22:40:41 230

原创 ES 数据库

熟悉 es 的同学都知道 es 一般有两种查询方式1,在 java 中构建查询对象,调用 es 提供的 api 做查询2,使用 json 调用接口做查询查询语句无非是将足够的信息丢给数据库,但是它却和 SQL 不一样有自己独立的查询方式。

2023-10-18 12:33:31 445

原创 程序的机器级表示

所有的高级语言,都会被计算机翻译为机器代码,然后再根据汇编代码生成可执行的机器代码。二进制的机器代码我们人类肯定是读不懂了,但是汇编代码还是可以简单了解一下的。CPU 的 PC、寄存器、缓存都是怎么工作的,计算机是如何寻址的等等问题,都可以通过汇编代码去了解。

2023-08-16 23:49:27 134

原创 Linux 常见问题解决思路

平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,它和 CPU 使用率并没有直接关系。一般来说单核 CPU 的 load 不应该大于1,同理,多核的 load 不应该大于核数。我们常见的负载高一般有这几种情况引起,一个是 cpu 密集型,使用大量 cpu 会导致平均负载升高。另外一个就是 io 密集型等待 I/O 会导致平均负载升高,但是 CPU 使用率不一定很高。还有就是大量等待 CPU 的进程调度也会导致平均负载升高,此时的 CPU 使用率也会比较高。

2023-08-16 23:48:17 129

原创 分布式架构的观测

在一个分布式应用中,如果出现了某个异常,那我们必然不可能只依靠 awk、grep 等命令来查看日志分析问题,往往分布式架构的一个异常都贯通多个节点,我们需要将多个节点联系起来排查问题。这就引出了分布式架构的可观测性,可观测性越高,排查问题越轻松

2023-08-08 22:57:59 430

原创 负载均衡 Load Balancing

对于电商平台而言,随着业务的不断发展壮大,网站访问量和数据量也随之急剧增长,该情况的产生给服务器带来了一定的负担。从用户体验层面而言,由于服务器端数据处理带来的时延,往往导致页面的响应速度过慢、操作流畅性受阻等问题。这在某种程度上甚至会潜在影响平台的成交量。提供高效率,高质量的服务成为亟待解决的问题。负载均衡策略的出现和发展成为缓解上述问题的有效途径现在的负载均衡一般被称做与,这里的四层说的是这些工作模式的共同特点都是维持一个 TCP 连接,而不是说它只工作在第四层,它只是一个统称。

2023-06-26 18:24:38 723

原创 Linux 常见命令

注意查看日志的时候不要一次性全部打印出来,可能压缩文件或者普通文件中的日志信息太多了,一次性打出来不知道要打到什么时候,而且就算打完了也没办法去看,因为太多了找不到自己需要的信息。Linux 的查看命令不能很好的支持查找想要的内容这一需求,虽然有些命令支持查找数据,比如在 more 中使用 / 加关键字可以跳转到那一行,开始这种查找不能找文件中包含关键字的全部行。他们都是Linux系统底层的机制,为了加速对磁盘的访问。Linux 中的打包文件一般是以.tar 结尾的,压缩的命令一般是以.gz 结尾的。

2023-05-09 16:44:19 719 1

原创 WebSocket 长连接

WebSocket 是一种网络传输协议,可在单个 TCP 连接上进行全双工通信,位于 OSI 模型的应用层早期,很多网站为了实现推送技术,所用的技术都是轮询(也叫短轮询)。轮询是指由浏览器每隔一段时间向服务器发出 HTTP 请求,然后服务器返回最新的数据给客户端。常见的轮询方式分为轮询与长轮询在这种情况下,HTML5 定义了 WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。

2023-04-13 22:00:34 1988

原创 CORS 跨域资源共享

浏览器一般使用 CORS(跨域资源共享)来处理跨域问题。同源导致了不同源数据不能互相访问,而在开发中我们很多时候需要用第一个页面的脚本访问第二个页面里的数据,所以制定了一些允许跨域的策略。

2023-04-03 21:42:03 342

原创 访问远程服务

为了将我们的系统设计的更加复杂一点,让它的功能更加多一些,让用户的体验更好一些,我们应该将单机的服务慢慢转换成分布式的系统,而分布式的系统有一个非常重要的前提条件:各个主机之间是如何交互的。

2023-03-25 11:18:46 298

原创 Python 学习

它将检查命令行,把每个参数转换为适当的类型然后调用相应的操作.在脚本中,通常 parse_args() 会被不带参数调用,而 ArgumentParser 将自动从 sys.argv 中确定命令行参数。ArgumentParser 可以通过 add_subparsers 的方式去创建子命令,用该方法获取的子构造器可以获取更多的子 parser,子 parser 的使用方式和 ArgumentParser 类似。== ‘main’: 的作用就是控制这两种情况执行代码的过程,在 if。进而当模块被直接执行时,

2023-03-22 15:56:07 351

原创 消息队列相关概念

在之前学习阶段没有重视过这个中间件,因为之前觉得这玩意很鸡肋,在一次项目中使用到了,感觉在特定的环境下该中间件还是挺好用的,现在深入了解一下消息队列就是我们常说的 MQ,英文叫 Message Queue,是作为一个单独的中间件产品存在的,独立部署引入一个新的技术产品,肯定是要考虑为什么要用它呢?消息队列也不列外,说到为什么要用,还真是因为它能在某些场景下发挥奇效。例如:解耦,异步,削峰,这三个词你也听说过吧,那下面就就从这三个好处出发,讲讲到底什么是解耦,异步,削峰。

2023-03-15 23:31:17 105

原创 RestTemplate 相关使用

在项目中,当我们需要远程调用一个 HTTP 接口时,我们经常会用到 RestTemplate 这个类。这个类是 Spring 框架提供的一个工具类,异常好用,其他框架中提供的 rest 调用或多或少借鉴了这个思路该类提供三组接口getForObject — 这类方法是常规的 Rest API(GET、POST、DELETE 等)方法调用。

2023-02-28 16:30:50 751

原创 IDEA 插件推荐

在写 Java 代码的时候,我们可能会出现 Jar 包的冲突的问题,这时候就需要我们去解决依赖冲突了,而解决依赖冲突就需要先找到是那些依赖发生了冲突,当项目比较小的时候,还比较依靠 IEDA 的【Diagrams】查看依赖关系,当项目比较大依赖比较多后就比较难找了,这时候就需要一款 IDEA 插件实现快速解决依赖冲突了。完全的个性化定义,规则由你设置。在开发中,经常会有这样的场景,给一个 JSON 例子,然后定义成对象类,来和前端进行联调测试,如果 Json 很长,会浪费很多时间在编写对象类上。

2023-02-20 22:41:04 555

原创 对象之间的映射与转换

在开发的时候经常会有业务代码之间有很多的 JavaBean 之间的相互转化,比如 PO/DTO/VO/QueryParam 之间的转换问题,本文总结一下各种转换方法。

2023-02-01 16:10:27 396

原创 运维监控常见指标含义

在看监控指标的时候,需要额外了解一些统计分析的概念。

2022-12-28 11:38:39 931

转载 转载:PostgreSQL 更新数据时 HOT优化

在 PostgreSQL 中,当更新一行数据时,实际上旧行并没有删除,只是插入了一行新数据。如果这个表其他列上有索引,而更新的列上没有索引,因为新行的物理位置发生变化,因此需要更新索引,这将导致性能下降。为了解决这个问题,PostgreSQL 引入了 Heap Only Tuple(HOT)技术,如果更新后的新行和旧行位于同一个数据块内,则旧行会有一个指针指向新行,这样就不用更新索引了,通过索引访问到旧行数据,进而访问到新行数据。要了解 HOT 技术,先来看一下 PostgreSQL 的数据块结构。如下图:

2022-12-05 19:39:35 356

原创 网络安全相关

在写后端代码时,公司的自动检测对某个方法报了如下警告:发现了潜在的 XSS。它可用于在客户端的浏览器中执行不需要的JavaScript易受攻击的代码:如何避免这种情况:Encode.forHtml 方法就是对 html 的元素做转义,比如 < 转义为 < 等一时兴起了解了一下 xss 的相关概念,防御 xss 攻击通常需要考虑 4 种情况: HTML、JavaScript、CSS(样式)和 URLXss 即(Cross Site Scripting)中文名称为:跨站脚本攻击。XSS的重点不在于跨站点,而

2022-12-05 11:22:27 1453

原创 XML 的使用

我们写 xml 大多是在 mybatis 的语句的时候,不可避免的会使用到小于号、与等符号,但是这些字符在 xml 中不能被正常解析,会出现以下错误以下是使用需要被转译的字符需要这么写是因为 xml 的解析器,假如您在 XML 文档中放置了一个类似 “

2022-11-17 21:18:30 386

原创 Java 中关于字符串处理的常用方法

子表达式的内容可以当成一个独立元素,即可以将它看成一个字符,可以在 () 中使用元字符。该方法用于拼接字符串,在原来的字符串中使用大括号与数字当做占位符,后面的参数可以接上若干的字符串,作为替换占位符的字符串。replaceAll() 方法使用给定的参数 replacement 替换字符串所有匹配给定的正则表达式的子字符串。我们还可以在正则中使用小括号来取字符串中原有的值,然后在替换的内容中使用 $1、$2 等等来取值。该方法在做字符串替换的时候非常方便,实际应用如下。

2022-11-07 10:45:22 1303

原创 Jackson 的各种使用

总结一下 java 中 json 的相互转换,以及 jackson 的部分底层原理。

2022-11-02 17:51:54 3943

原创 关于 boolean 类型的坑

但是包装类型都是以 get 开头。这种方式在某些时候是可以正常运行的,但是在一些 rpc 框架里面,当反向解析读取到 isSuccess 方法的时候,rpc 框架会“以为”其对应的属性值是 success,而实际上其对应的属性值是 isSuccess,导致属性值获取不到,从而抛出异常。二是所有的属性应该定义为包装类,因为基本数据类型有默认值,在数据库中,bool 类型可能有三个值,null、true、false。一是 bool 类型的属性不能使用 is 开头,二是在 POJO 中,不要使用基本数据类型。

2022-10-24 19:17:37 1648

原创 Shell 脚本

一,一定要写成 ./helloworld.sh ,而不是 helloworld.sh ,运行其它二进制的程序也一样,直接写 helloworld.sh ,linux 系统会去 PATH 里寻找有没有叫 helloworld.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 helloworld.sh 是会找不到命令的,要用./helloworld.sh 告诉系统说,就在当前目录找。

2022-10-13 21:36:39 420

原创 Redis 集群

主从复制指将主 Radis 的数据复制到其他从属 Radis 中,数据的复制只能从主机复制到从机,并且从机不可以写入数据主从复制的好处是读写分离已经容灾后快速恢复,主机读数据,从机写数据,因为大多数对数据库的操作都是读取数据,这么做可以减少服务器压力。

2022-10-12 19:28:45 765 1

原创 vue-admin-template 简单使用

出于安全原因,浏览器禁止Ajax调用驻留在当前原点之外的资源。例如,当你在一个标签中检查你的银行账户时,你可以在另一个选项卡上拥有EVILL网站。来自EVILL的脚本不能够对你的银行API做出Ajax请求(从你的帐户中取出钱!)使用您的凭据其中@CrossOrigin中的2个参数:origins: 允许可访问的域列表maxAge:准备响应前的缓存持续的最大时间(以秒为单位)

2022-09-30 15:52:10 453

原创 PostgreSQL 相关用法

pg 有很多自己的数据结构,比如 json。类型在使用上几乎完全一致,两者的区别主要在存储上,json数据类型直接存储输入文本的完全的拷贝,JSONB数据类型以二进制格式进行存储。除此之外,箭头还有可以有变种,->>表示取对应值文本的形式,可以理解为用->>取出来的值,都是字符串。注意,->拿的只是 json 对象的域,因此有很多操作符不能用,如果向map一样只取对象的值的话,还是尽量使用->>:用于将两个表的查询结果连接在一起,这里的连接不是联表的连接,而是纵向的连接,将两个查询结果合起来返回给用户。

2022-09-28 19:49:46 1302

原创 代码整洁之道

为了降低与优化代码维护的成本,我们制定了一系列的规则与框架,甚至这些框架中建议我们写出降低程序运行效率的代码为了写出简单易懂可维护的代码,为了成为更好的程序员,我们应该遵守以下的规则。

2022-09-22 20:28:12 216

原创 缓存相关问题

在进行写操作后如果有另外一个线程进行读操作,并且这个线程在缓存中没有找到,将未修改的数据放到catch中,脏数据只能自己过期或者下一次写操作时才可以去除,脏数据时间范围时间范围不确定性很大,比如。除了寻找数据是否有效以外,过滤器还可以对两组大量数据进行模糊比较以寻找相同的数据,这种查询虽然消耗了一些准确性,但时间复杂度和空间复杂度都大大优化了,之后可以对选出的数进行二次操作。判断一个元素是否存在于布隆过滤器的时,会使用这些hash函数映射出多个地址,如果映射出的地址中有0,说明这个元素不在过滤器中。

2022-09-21 12:20:37 308

原创 统一结果返回

统一返回数据格式没有固定的格式,只要能描述清楚返回的数据状态以及要返回的具体数据就可以。但是一般会包含状态码、返回消息、数据这几部分内容。全局统一返回结果,一般要包括全参构造、无参构造、getset方法等,可以配合enum使用,也可以单独使用,以下是一个单独使用的例子。枚举类已经做entity的属性,比如性别,星期等,都是更多的应用则是做统一结果返回。

2022-09-20 16:21:54 193

原创 Redis 数据结构、对象与数据库

如果前一个节点的长度大于等于254个字节,那么previous_entry_length的大小为5个字节,第一个字节会被设置为0xFE(十进制的254,这也是特殊标记,redis 读到这个254时就知道该节点是5字节的了),之后的四个字节则用于保存前一个节点的长度。字典这种数据结构在 redis 中被大量使用,除了用来表示数据库之外,字典还是hash 键的底层实现之一,当一个 hash 键包含的键值对比较多,又或者键值对中的元素是比较长的字符串时,Redis就会使用字典作为哈希键的底层实现。

2022-09-13 20:35:33 320

原创 ThreadLocal 原理以及使用

在ThreadLocalMap.set()方法的最后,如果执行完启发式清理工作后,未清理到任何数据,且当前散列数组中Entry的数量已经达到了列表的扩容阈值(len*2/3),就开始执行rehash()逻辑,也就是扩容处理。因为ThreadLocalMap的键为弱引用,值为强引用,每次GC后,键的指向都为null(因为ThreadLoacl被回收掉了,但是这个弱引用指针并没有被回收),值的指向对象依然没有被回收,产生了OOM问题。解决办法是在使用完毕后调用remove方法手动清除。碰撞处理使用动态寻址法。

2022-09-07 19:15:16 131

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除