Skip to content

博文

✍️

Article

LSM-Tree 如何加速随机写

引言

LSM-Tree(Log Structured Merge Tree),它是一种分层、有序、面向磁盘的数据结构。主要利用了磁盘批量的顺序写性能远胜于随机写的特性,对数据的操作均采用追加方式,不进行删除和更新。但是该设计在大大提升了写性能的同时降低了读性能。

Article

mysql 实战经验

  • 写sql时一律使用小写
  • 建表时先判断表是否已存在 if not exists
  • 所有的列和表都加comment
  • 字符串长度比较短时尽量使用char,定长有利于内存对齐,读写性能更好,而varchar字段频繁修改时容易产生内存碎片
  • 满足需求的前提下尽量使用短的数据类型,如tinyint vs int, float vs double, date vs datetime
  • default null有别于default"和default 0
  • is null, is not null有别于!=",!=0
  • 尽量设为not null
    • 有些DB索引列不允许包含null
    • 对含有nul的列进行统计,结果可能不符合预期
    • null值有时候会严重拖慢系统性能
Article

从根上理解Redis

基础

数据结构

String

SDS: 简单动态字符串

相较于c的字符串,有三点优点:

  1. 不仅可以存储文本数据,还可以存储二进制数据,因此可以存储音频视频等。
  2. 内部len属性记录了长度,时间复杂度o(1)
  3. 安全,拼接字符串不会发生溢出,空间不够会自动扩容。
Article

从根上理解mysql

从根上理解mysql

前置知识

mysql的连接

mysql的连接方式有三种:TCP,IP和命名管道与共享内存 ,unix

  • 对于服务器中的环境,一般采用tcpip进行维护,其默认绑定3306端口号。mysql服务器默认监控3306端口,当然你可以考虑可以改
  • 对于window除了上面的这个方式也可以考虑使用命名管道和共享内存
  • 对于unix系统,我们可以考虑使用unix域套接字进行通信
Document

MongoDB

基本概念

无模式数据库

​很多NoSQL数据库有无模式的共同点。若要在关系型数据库中存储数据,首先必须定义模式,也就是用一种预定义结构向数据库说明要有哪些表格,表中有哪些列,每一列都存放何种类型的数据。必须先定义好模式,然后才能存放数据。 相比之下,NoSQL数据库的数据存储就比较随意。键值数据库可以把任何数据存放在一个键的名下。文档数据库实际上也如此,因为它对所存储的文档结构没有限制。在列族数据库中,任意列里面都可以随意存放数据。你可以在图数据库中新增边,也可以随意向节点和边中添加属性。

Document

python argparse 模块

简介

argparse是python用于解析命令行参数和选项的标准模块,用于代替已经过时的optparse模块。argparse模块的作用是用于解析命令行参数。

Document

python collections 模块

Counter

Counter是一个dict子类,主要是用来对你访问的对象的频率进行计数。 常用方法:

  • elements():返回一个迭代器,每个元素重复计算的个数,如果一个元素的计数小于1,就会被忽略。
  • most_common([n]):返回一个列表,提供n个访问频率最高的元素和计数
  • subtract([iterable-or-mapping]):从迭代对象中减去元素,输入输出可以是0或者负数
  • update([iterable-or-mapping]):从迭代对象计数元素或者从另一个 映射对象 (或计数器) 添加。
Article

函数的堆栈调用过程

引言

在现代程序开发中,理解函数调用栈的工作原理是非常重要的,尤其在调试和优化代码时。函数的调用不仅是一个逻辑的执行过程,它背后还涉及到内存管理、寄存器操作、汇编指令的生成以及栈帧的动态维护。通过分析函数调用栈,开发者能够深入了解程序的底层运行机制,识别并解决性能瓶颈或潜在的错误。下面,我们通过一个简单的 C++ 代码示例,从汇编指令的角度详细解读函数的调用过程

Article

进程虚拟地址空间划分

引言

  • .text段(代码段):存放指令,只读。
  • .rodata段,即只读段,一般用来存放字符常量和const修饰的变量,只读。const char*p = "hello world", *p就是放在只读段,不可修改。
  • .data段存放已初始化的全局变量和已初始化的局部静态变量,且初始化的值不为0
  • .bss段存放未初始化的全局变量和未初始化的局部静态变量,或者初始化为0的全局变量和初始化为0局部静态变量。系统会把存放在该段的数据全都置为0,所以未初始化的全局变量或局部静态变量的值为0
Document

设计模式

1.单例模式代码设计

单例模式:一个类不管创建多少次对象,永远只能得到该类型一个对象的实例。

常用的:日志模块、数据库模块

饿汉式单例模式:还没有获取实例对象,实例对象就已经产生了

懒汉式单例模式:唯一的实例对象,直到第一次获取它的时候,才产生

饿汉式一定是线程安全的;但是会延长软件的启动时间

Article

Kafka

万字长文解析kafka:https://mp.weixin.qq.com/s/dOiNT0a_dRytwatzdrJNCg

kafka日志存储:https://zhuanlan.zhihu.com/p/65415304

消息队列

用途:不同服务server、进程process、线程thread之间进行通信。

使用消息队列的场景:

  1. 异步处理: 短信通知、终端状态推送、app推送、用户注册等 更快返回结果,减少等待,实现并发处理,提升系统总体性能。
  2. 流量控制:削峰 秒杀场景下的下单状态。使用消息队列隔离网关和后端服务,以达到流量控制和保护后端服务的目的。
  3. 服务解耦
  4. 发布订阅
  5. 高并发缓冲
Article

LRU Cache

Leetcode: https://leetcode.cn/problems/lru-cache/description/

146. LRU 缓存

问题描述

请你设计并实现一个满足  LRU (最近最少使用) 缓存 约束的数据结构。

实现 LRUCache 类:

  • LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存
  • int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
  • void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 key-value 。如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字。

函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。

Article

二叉树中的最大路径和

  1. 我们使用递归方法遍历树的每个节点。
  2. 对于每个节点,我们计算: a) 包含该节点和左子树的最大路径和 b) 包含该节点和右子树的最大路径和 c) 包含该节点及其左右子树的路径和
  3. 我们持续更新全局最大路径和(maxSum)。
  4. 函数返回当前节点能够贡献的最大值(节点值加上左子树或右子树中的较大者)。
  5. 这种方法的时间复杂度是O(N),其中N是树中的节点数,因为我们需要访问每个节点一次。空间复杂度在最坏情况下(树完全不平衡)是O(N),在最好情况下(树完全平衡)是O(log N),这是由于递归调用栈的开销
Article

缺失的第一个正数

题目

给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。

请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。

Article

下一个排列

题目

整数数组的一个 排列  就是将其所有成员以序列或线性顺序排列。

  • 例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3][1,3,2][3,1,2][2,3,1] 。

整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。

  • 例如,arr = [1,2,3] 的下一个排列是 [1,3,2] 。
  • 类似地,arr = [2,3,1] 的下一个排列是 [3,1,2] 。
  • 而 arr = [3,2,1] 的下一个排列是 [1,2,3] ,因为 [3,2,1] 不存在一个字典序更大的排列。

给你一个整数数组 nums ,找出 nums 的下一个排列。

必须 原地修改,只允许使用额外常数空间。

Article

岛屿数量

题目

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

Article

K个一组翻转链表

题目

给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。

k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

Tutorial

c++基础

基础语法

inline内联函数

在编译过程中,没有函数的调用开销了,在函数的调用点直接把函数的代码进行展开处理了。

不是所有的inline都会被编译器处理成内联函数,比如“递归”。

inline只是建议编译器把这个函数处理成内联函数。

debug版本上,inline是不起作用的;inline只有在release版本下才能出现。符号表中不生成符号了。

Article

c++对象优化

引言

  1. 函数参数传递过程中,对象==优先按引用传递==,不要按值传递
  2. 当函数返回对象的时候,应该==优先返回一个临时对象==,而不要返 回一个定义过的对象
  3. 接收返回值是对象的函数调用的时候,==优先按初始化的方式接收==,不要按赋值的方式接收

2024 - future