本次说明只涵盖mac的操作

  • command + w 删除当前页面
  • command + option + -> or <- 进行页面左右切换
  • command + 数字跳转到对应的页面
  • command + shift + t 恢复关闭的页面

linux

正则表达式

image.png

背景

在生产环境中,我们使用了 pymysql 和 DBUtils.PooledDB 来管理 MySQL 数据库连接池。由于业务量激增,新增了多个业务实例,最终导致 MySQL 集群以及本地实例的连接数被打满,无法建立新的请求连接。经过排查,发现根本原因是 pymysql 默认开启事务,所有的 SQL 操作(包括查询)都会自动开启事务,并且不会自动提交,导致事务长时间占用连接,无法释放。

问题原因

1. 默认事务行为
  • pymysql 默认 autocommit=False: pymysql 默认不自动提交事务,也就是说,每执行一次 SQL 操作(包括查询)都会启动一个事务。如果在业务代码中没有显式调用 commit() 或 rollback(),那么这个事务就一直处于挂起状态。
2. 连接池连接占用
  • 事务不释放连接: 当一个连接处于挂起事务状态时,即使执行的是查询操作,该连接也不会被释放回连接池。随着大量任务的执行,长时间未提交的事务不断占用连接池中的连接,最终导致连接数打满。
3. 业务实例增加导致压力骤增
  • 新增业务实例后,同时发起的大量请求进一步加剧了连接数的压力,最终导致 MySQL 集群无法创建新的请求连接。

python debug配置

python以模块的方式进行debug

背景:

正常python文件进行debug时,可以直接运行,但是遇到一个python的框架项目,直接运行或者debug都会报错server包不存在(server是一个文件夹,下面并没有init文件,但存在多个业务文件,以及程序入口文件)

排查

  1. 经过一定的排查发现,项目需要以模块的方式进行运行(python -m server.server)这里的server.server对应的是server下的server.py文件
  2. 这时debug时,肯定也需要以模块的方式进行运行,但这里发现,直接使用program的方式是无法直接运行的,需要进行调整,经过一系列研究,发现需要将program调整为module,具体参考如下:

接口的理解

在 Go 语言中,只要一个类型实现了某个接口,那么它就可以作为该接口的实例被使用

go
package main import "fmt" // 定义一个接口 Speaker type Speaker interface { Speak() } // 定义一个结构体 Dog type Dog struct{} // 让 Dog 实现 Speak 方法 func (d Dog) Speak() { fmt.Println("汪汪汪!") } // 定义一个结构体 Cat type Cat struct{} // 让 Cat 实现 Speak 方法 func (c Cat) Speak() { fmt.Println("喵喵喵!") } // 定义一个通用的说话函数 func MakeSpeak(s Speaker) { s.Speak() // 只要是实现了 Speaker 接口的类型都能调用 } func main() { dog := Dog{} cat := Cat{} // Dog 和 Cat 都实现了 Speaker 接口,因此可以作为 Speaker 传入 MakeSpeak(dog) MakeSpeak(cat) }

相关信息

json.dumps进行字符串转json转换以及序列化的时候,一定要增加ensure_ascii=False参数,否则的话,默认会转化为ascii字符

相关信息

结合golang讲解面向对象的接口隔离原则

核心思想

  • 不应该强迫客户依赖他们不使用的方法

目的

  • 避免定义“臃肿”的接口
    • 接口应该尽量小而专注
    • 每个接口只应该包含客户端所需要的方法
    • 避免接口中包含不相关的功能。

含义

  • 在设计系统时,如果一个接口包含了多个不相关的功能
  • 依赖这个接口的类就会被迫实现接口中它并不需要的方法
  • 这样不仅会导致不必要的复杂性,还会让系统变得更加脆弱,难以维护。

一句话总结

  • 我们应该将接口拆分成多个更细化的、职责单一的接口,确保每个接口只包含客户端真正需要的方法

开闭原则

定义

开闭原则是面向对象设计中的一个核心原则,它的内容是:

软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。

也就是说,当需求变化时,我们应该能够通过扩展现有的代码来实现新的功能,而不是修改现有的代码。这样可以减少现有功能的变动,避免引入新的错误,并且能够提高代码的可维护性和可扩展性。

解释

对扩展开放

意味着我们可以通过添加新的代码来扩展现有功能,而不是修改原有的代码。扩展可以通过继承、实现接口等方式来实现。

对修改封闭

指的是已有的代码不应该被修改,因为修改现有代码容易引入错误,并且可能影响到系统的其他部分。相反,我们应该通过扩展的方式来增强功能。