让 AI 节约你的每一分钟

<
>

代码提交规范之 Conventional Commits

Conventional Commits:让您的Git历史更加清晰和有意义 引言 在软件开发中,良好的版本控制实践是维持项目健康和可持续发展的关键。一个清晰、一致的提交历史不仅可以加强团队合作,还能提高代码的可维护性。本文将介绍 Conventional Commits 规范,一种帮助您实现这一目标的提交信息格式规范。 什么是 Conventional Commits? Conventional Commits 是一个轻量级的、社区驱动的提交信息格式规范。它的核心目的是使提交信息更加可读和易于理解。遵循这一规范,可以让您的 Git 历史成为一个清晰的故事,而不仅仅是代码的变更记录。 核心要点 清晰的类型定义:规定了一系列预定义的提交类型,如 feat, fix, docs, 等,每种类型对应不同的代码更改目的。 可选的范围:允许在提交类型后指定影响范围,增加了额外的上下文信息。 描述性的消息:鼓励编写简短且具有描述性的信息,概括提交的主要内容。 如何使用 Conventional Commits? 使用 Conventional Commits 的基本格式如下: markdownCopy code &lt;type&gt;[optional scope]: &lt;description&gt; [optional body] [optional footer] 提交类型(Types) feat:新功能 fix:修复 Bug docs:文档更新 style:代码样式调整(不影响代码运行) refactor:代码重构 perf:性能提升 test:测试相关 chore:日常琐事(如依赖管理) 示例 gitCopy code feat(auth): 添加 JWT 认证支持 - 实现 JWT 生成和验证 - 更新认证中间件以支持 JWT 关闭问题 #123 在这个示例中,feat 表明这是一个添加新功能的提交,auth 是这次更改的范围,后面紧跟着的是对提交内容的简短描述。接着是一个更详细的解释,最后是相关问题链接。 Conventional Commits 的好处 提高可读性:清晰的提交历史使新团队成员更容易理解项目进展。 自动化工具友好:可以被用于自动化生成变更日志和版本控制。 改善协作流程:明确的提交类型和格式有助于代码审查和团队协作。 结语 Conventional Commits 规范为软件开发提供了一种简单而高效的提交历史管理方法。它的简洁性和自解释性使得项目维护变得更加容易。采纳这一规范,将为您的项目带来长期的好处。

代码提交规范之 Conventional Commits

引言 在软件开发中,良好的版本控制实践是维持项目健康和可持续发展的关键。一个清晰、一致的提交历史不仅可以加强团队合作,还能提高代码的可维护性。本文将介绍 Conventional Commits 规范,一种帮助您实现这一目标的提交信息格式规范。 什么是 Conventional Commits? Conventional Commits 是一个轻量级的、社区驱动的提交信息格式规范。它的核心目的是使提交信息更加可读和易于理解。遵循这一规范,可以让您的 Git 历史成为一个清晰的故事,而不仅仅是代码的变更记录。 可参考链接:https://www.conventionalcommits.org 核心要点 清晰的类型定义:规定了一系列预定义的提交类型,如 feat, fix, docs, 等,每种类型对应不同的代码更改目的。 可选的范围:允许在提交类型后指定影响范围,增加了额外的上下文信息。 描述性的消息:鼓励编写简短且具有描述性的信息,概括提交的主要内容。 如何使用 Conventional Commits? 使用 Conventional Commits 的提交注释基本格式如下: &lt;type&gt;(&lt;scope&gt;): &lt;description&gt; &lt;body&gt; &lt;footer&gt; 格式描述如下: &lt;type&gt;:提交类型,用于说明本次提交的类别,常见类型包括: feat:新功能 fix:修复 Bug docs:文档更新 style:代码风格样式调整(不影响代码运行) refactor:代码重构 perf:性能提升(performance的缩写) test:测试相关 chore:其他无关紧要的改动(单词是琐事的意思) (&lt;scope&gt;):可选,用于进一步细化提交类型,例如 feat(login) 表示登录功能的新功能。 &lt;subject&gt;:简短描述本次提交的主要内容,建议不超过 50 个字符。 &lt;body&gt;:可选,提供更详细的提交描述,可以包含以下内容: 修改原因 修改内容 影响范围 相关测试 &lt;footer&gt;:可选,包含额外的元信息,例如: 关联的 Jira 问题编号 提交者 评审者 示例 feat(auth): 添加 JWT 认证支持 - 实现 JWT 生成和验证 - 更新认证中间件以支持 JWT 关闭问题 #123 在这个示例中, feat 表明这是一个添加新功能的提交,auth 是这次更改的范围,后面紧跟着的description是对提交内容的简短描述。 接着body是一个更详细的解释。 最后footer是相关问题的结果。
use_cache

缓存简介

缓存 简介 简而言之,即是数据存储的缓冲区。使用缓存之后,可以减轻访问数据库的压力,显著的提升系统的性能。 使用缓存的一般流程如下: 缓存通常有两种: 服务器主集本身的内存缓存,也就是我们说的二级缓存。 相比于缓存中间件性能更好。但只能应用于本机,若系统分布式部署,会存在数据不一致的问题。 缓存中间件,比如:Redis、Memcached等 适用于分布式缓存,解决分布式数据一致性问题 有些业务场景,分布式缓存和二级缓存可以一起使用 缓存带来的问题 1. 缓存雪崩 缓存雪崩指的是当某一个时间段出现大规模的缓存失效的情况,此时大量的并发请求直接命中在数据库上面,导致数据库压力巨大,甚至宕机。 分析 造成缓存雪崩的关键在于在同一时间段大量的key失效。出现这个问题的可能性:1. 缓存宕机。2. 采用了相同的过期时间。 解决方式 过期时间采用随机值 若真的发生了缓存雪崩,使用熔断机制。当流量到达一定阈值,直接返回“系统拥挤”之类的提示,防止过多的请求打在数据库上。至少能保证一部分用户是可以正常使用,其他用户多刷新几次也能得到结果。 提高数据库的容灾能力,可以使用分库分表,读写分离的策略。 防止Redis缓存宕机导致缓存雪崩的问题,可以搭建Redis集群,提高Redis的容灾性。 2. 缓存击穿 缓存击穿指的是大量并发集中访问某一个 key,突然这个 Key 缓存失效了,导致大并发一时间全部命中在数据库上。 与缓存雪崩对比 缓存雪崩是大量的 key 失效导致的 而缓存击穿是大规模访问一个失效的 key 导致的 分析 关键在于某个热点 key 失效了,导致大并发集中打在数据库上。 所以要从两个方面解决,第一是否可以考虑热点key不设置过期时间,第二是否可以考虑降低打在数据库上的请求数量。 解决方式 若业务允许,对热点 key 可以设置永不过期 使用互斥锁。当缓存失效时,只有拿到锁才可以查询数据库,降低了在同一时刻命中在数据库上的请求。 可以对 Key 进行加锁 相应的,加锁会导致系统性能降低。 3. 缓存穿透 假如请求的 key 是在缓存中是不存在的,那缓存查不到就会去数据库查询。如果有大量这样的请求,这些请求像“穿透”了缓存一样直接命中在数据库上,这种现象就叫做缓存穿透。 分析 关键点是缓存中查不到 Key,这些 key 是不存在的 PS:说明了边界安全的重要性。应该做好参数检验,外界不可信 解决方式 把无效的Key存入缓存。如果缓存查不到,数据库也查不到,可以把这个 Key 值存入缓存,并设置value=&ldquo;null&rdquo;,当下次再通过这个Key 查询时就不需要再查询数据库。 弊端是,假如传进来的这个不存在的Key值每次都是随机的,那这种做法无意义。 使用布隆过滤器。布隆过滤器的作用是某个 key 不存在,那么就一定不存在,它说某个 key 存在,那么很大可能是存在(存在一定的误判率)。因此,可以在缓存之前再加一层布隆过滤器,在查询的时候先去布隆过滤器查询 key 是否存在,如果不存在就直接返回。

进程管理工具之 pm2

PM2 参考:https://mp.weixin.qq.com/s/S8Gw2XzuflnN2QMSVXhLhg 场景 node 应用跑的时候突然抛了个错,崩溃了,是不是需要重新跑起来?这时候是不是就需要另一个进程来自动做重启这件事情? node 应用的日志默认输出在控制台,如果想输出到不同的日志文件,是不是可以让另一个进程获取 node 应用的输出,然后写文件来实现? node 是单线程的,而机器是多个 cpu 的,为了充分利用 cpu 的能力,我们会用多个进程来跑 node 应用,来提高性能。这种通用逻辑是不是也可以放到一个单独进程里来实现? node 运行时的 cpu、内存等资源的占用,是不是需要监控?这时候是不是可以让另一个进程来做? 线上的 node 应用不只是跑起来就行了,还要做自动重启、日志、多进程、监控这些事情。 简介 pm2 是 process manager,进程管理,它是第二个大版本,和前一个版本差异很大,所以叫 pm2. pm2 的主要功能就是进程管理、日志管理、负载均衡、性能监控这些。 安装 npm install -g pm2 基本命令 pm2 start main.js pm2 start &lt;pid&gt; pm2 stop main.js pm2 logs pm2 log &lt;pid&gt; PM2 start 参数 -i num 就是启动 num 个进程做负载均衡 pm2 start app.js -i max 根据CPU核数启动进程的个数 动态调整进程数 pm2 scale main 3 把集群调整为 3 个进程

开发环境

系统环境 环境 python go node git、svn 编辑器 pycharm pro、webstome、goland、IntelliJ IDEA、 vscode typora sublime text 终端 Xshell git bash WSL、window terminal 工具 谷歌浏览器 VMware chatGPT postman、apifox、easydoc GripData、navicate、RedisInsight、mongosh、compass、pgAdmin、neo4j Desktop 百度网盘、阿里云盘 bandzip ide-eval-resetter、navicat cracker fileZilla、Xftp7 wireshark UML、亿图图示 utools microsoft To Do 配置 jetbrains全家桶编辑器配置 vscode编辑器配置 镜像 ubuntu-20.04-live-server 其他 WPS 有道 geek.exe、软媒全家桶exe snipaste wechat、Tim ToDesk、向日葵 KMPlayer 支付宝开放平台开发助手 vnc Viewer Linux环境 python node redis、mysql、postgre、mongodb、elasticsearch、clickhouse kafka、rabbitMQ git、 nginx、gunicorn、uWSGI ssh-server docker、portainer.io supervisor、pm2 jenkins vmware vsphere

社区网站之 discuzQ

discuz!Q 简介 快速搭建个人社区 doc: https://discuz.com/ api: https://developer.discuz.chat/#/api/get:_api_v3_check.user.get.redpacket 安装 linux下,推荐docker安装 https://discuz.com/docs/Linux%20%E4%B8%BB%E6%9C%BA.html 安装启动容器命令 docker run -d --restart=always -p 20080:80 -p 20443:443 -v ~/discuzQ/data/discuz:/var/lib/discuz -v ~/discuzQ/data/mysql-data:/var/lib/mysqldb -v ~/discuzQ/data/certs:/etc/nginx/certs ccr.ccs.tencentyun.com/discuzq/dzq:latest 初始化安装 Discuz! Q 访问 http://ip:port/install 并配置网站相关信息。 配置mysql ip 用户名密码 配置后台用户名密码admin admin123456 使用 安装后,访问即可,一个社区就出现啦!可以注册咯 http://ip:20080/ https://ip:20443/ 后台站点访问,用户名admin密码admin123456 http://ip:20080/admin https://ip:20443/admin/

数据库之 postgresql

postgreSQL 安装搭建 https://www.postgresqltutorial.com/postgresql-getting-started/install-postgresql-linux/ 指定版本安装 sudo apt-get install postgresql-13 配置 路径 ubuntu下: /etc/postgresql//main centOS下: /var/lib/pgsql/13/data/postgresql.conf postgres.conf pg数据库配置文件 包含设置data/hba/indet等目录,IP/port,最大连接数,认证,ssl,内存,磁盘等等 pg_hba.conf 客户端认证配置文件即host-based authentication:基于主机的认证 多种连接pg数据库的方式 pg_ident.conf 用户名称映射,可添加映射用户 用户名密码 设置可远程访问 启动关闭 systemctl start systemctl stop 访问 切换用户 sudo -i -u postgres 登入 psql -h 192.168.1.7 -p 5432 -U postgres -d testdb -W 密码 基本操作 数据库操作 1、列举数据库:\l 2、选择数据库:\c 数据库名 3、查看该某个库中的所有表:\dt 4、切换数据库:\c db_name 5、查看某个库中的某个表结构:\d 表名 6、查看某个库中某个表的记录:select * from apps limit 1; 7、显示字符集:\encoding 8、退出psgl:\q 表、库操作 查询 基本CURD insert update set delete from 条件查询 and or not in not in between and like group having order by 聚合 关联查询 inner join / join left join right join full outer join 全外连接 cross join 交叉连接 (笛卡尔积) Union查询 union

玩转 Github 搜索技巧

Github github官方文档 https://docs.github.com/cn/search-github/searching-on-github/searching-for-repositories 操作技巧 按s 快速定位到搜索栏 按t 将项目目录树以列全部呈现 按. 将项目在在线vscode中查看 搜索技巧 搜索仓库https://docs.github.com/cn/search-github/searching-on-github/searching-for-repositories 搜索指令如下 文档https://docs.github.com/cn/search-github in操作进行位置搜索 in:name 在标题中搜 如 golang in:name,表示标题中含有golang的 如python in:name in:description in:readme 组合使用: 逗号分开每个位置 如 vue in:name,description stars、fork stars:&gt;=2000 fork:&lt;5000 组合使用: 空格分开多个条件 高亮代码块进行共享 awesome 获取有关优秀项目、学习资料 awesome 内容 如awesome python 可获取大量关于python各个方面的资源 location、language location指定地区 language指定语言(常用)如language:c 高级搜索界面 UI界面搜索https://github.com/search/advanced Github API URL explore 官方根据你的习惯推荐 链接https://github.com/explore topics 不同的话题分类 https://github.com/topics 如数据库sql的,https://github.com/topics/sql 如go的,https://github.com/topics/go 如python的, https://github.com/topics/python 还有个很特殊的 awesome https://github.com/topics/awesome 提供优质资源 trending 搜索相关优质项目,还可以指定今天,本周,本月 https://github.com/trending 如搜索go https://github.com/trending/go 如搜索python https://github.

文档建设网站之 docify

docsify https://docsify.js.org/#/ 安装 npm i docsify-cli -g 搭建项目 docsify init ./docs 启动 docsify serve .\docs\

控制反转 IoC 与依赖注入 DI

控制反转 IoC 与依赖注入 DI 引入 讨论之前,先来简述一下软件对象中的耦合 在软件开发过程中,对象之间的耦合关系是一个常见的问题。传统的面向对象设计中,对象之间的依赖通常是硬编码在代码中的,这导致了代码的高耦合度和低灵活性。当一个对象依赖于另一个对象时,它通常会直接实例化或调用该对象,这使得两个对象之间的关系非常紧密,难以进行单元测试和代码重用。 例如,考虑一个电商网站的购物车功能。在购物车中直接实例化商品对象可能会导致购物车模块与商品模块之间的紧密耦合,使得如果需要修改商品类的实现或者替换为其他商品类时,就必须要修改购物车模块的代码。这种紧耦合的设计不仅使代码难以维护和扩展,还降低了代码的可测试性和可重用性。 将这个例子缩小到类对象之间的调用:对象 A 依赖于对象 B,那么对象 A 在初始化或需要调用 B 的时候,自己必须主动去创建对象 B 或者使用已经创建的对象 B。无论是创建还是使用对象 B,控制权都在自己手上。 为了解决这一问题,控制反转(IoC)和依赖注入(DI)应运而生。它们提供了一种解耦的方法,通过将对象之间的依赖关系转移到外部容器(loC 容器)或框架中管理,实现了对象之间的松耦合。 简言之,通过 IoC 与 DI,调用者将依赖对象的创建初始化逻辑从自身抽离解耦出来,调用者只负责声明调用,依赖对象只负责实现自己,而创建依赖对象的控制权交给了“第三方”(IoC容器) 控制反转 loC 案例:假设你现在需要与外部客户对接某业务,这个业务随着外部客户的不同,对接流程也不同,于是每个客户,都需要制定相应的业务对接流程,每当有了新的客户,不得不继续制定该客户的业务对接流程。显然,这严重耦合并依赖各个不同客户。最终你受不了了,自己制定一个对接方案,开发一个对接平台,各个客户必须遵守你制定对接方案才能进行业务对接,于是各个客户反过来依赖你的对接标准,反转了控制,倒置了依赖。 这个过程中,你就是调用者,客户就是依赖对象,你制定的标准、对接平台就是 IoC 容器。从调用者不得不自身一个个实现对接业务到将对接业务解耦到统一标准中的这一过程,可以理解为控制反转 控制反转是一种思想,其基本思想是:借助于“第三方”实现具有依赖关系的对象之间的解耦。 依赖注入 DI 以 python 代码为例 未使用依赖注入之前: class Dependency: def __init__(self): pass def operation(self): return &#34;Dependency operation&#34; class Client: def __init__(self): pass def do_something(self): # 手动创建 Dependency 对象 dependency = Dependency() return dependency.operation() 此时,若 Dependency 的初始化函数发生变化,Client 中手动创建 Dependency 对象的代码也需要改动!