【青训营X豆包MarsCode】第五课-TOS 对象存储实战
TOS 对象存储实战对象存储基本介绍抖音背后的存储发/刷抖音背后有何流程?背后有何种存储需求?
短视频生产/消费
片源系统–>审核系统–>推送系统
片源系统:用户上传的原始视频文件。
审核系统:对视频内容进行审核和检测。
推送系统:审核通过后,视频被推送至用户推荐流。
存储需求:海量、便宜、易用
为什么对象存储为什么需要对象存储呢?
海量数据:抖音每天生成海量的短视频文件。
高性价比:存储系统需要具备高效的数据存储能力,同时成本需控制在合理范围内。
易用性:存储系统需要简单易用,能够高效支持数据上传、下载以及检索等操作。
存储系统:单机存储、单机数据库、分布式数据库、分布式存储
单机存储(单机文件/KV):文件系统、Key-Value 存储
单机数据库(少量(半)结构化数据):关系型数据库、非关系型数据库
分布式数据库(大量(半)结构化数据):关系型数据库、非关系型数据库
分布式存储(大数据计算中间结果/视频/图片):分布式文件系统、对象存储
分布式存储:分布式文件系统HDFS、对象存储TOS
对象存 ...
【青训营X豆包MarsCode】第四课-Redis-大厂程序员是怎么用的
Redis-大厂程序员是怎么用的Redis是什么为什么需要Redis,Redis的基本工作原理
Redis:开源的、高性能的、支持多种数据结构的Key-Value数据库。不仅是一个缓存系统,还是一个持久化的数据库,能够在内存中高效地进行读写操作。
背景:数据量增加、读写数据压力的不断增加(如秒杀、抢购、社交平台的点赞、评论等),传统关系型数据库(如 MySQL)往往无法满足高并发的需求,可能导致响应时间过长、系统崩溃等问题。Redis 的出现提供了一个高效的解决方案。
高性能读写操作: Redis 是一个内存数据库,通过内存存储数据,读取速度极快,尤其在处理大量并发请求时表现优异。
数据持久化:虽然 Redis 是一个内存数据库,但它支持两种持久化机制:RDB 快照和AOF(追加日志)。这使得 Redis 即使在系统重启或故障时,也能恢复数据。
单线程执行:Redis的命令由单一线程处理,避免了多线程带来的复杂性和性能瓶颈。在单线程下实现高并发处理,避免了多线程并发时可能出现的锁竞争、死锁等问题。虽然单线程看似是性能瓶颈,但 Redis 使用了非常高效的事件驱动机制,能够在一个线程内处 ...
【青训营X豆包MarsCode】第三课-带你认识存储 & 数据库
带你认识存储 & 数据库经典案例一条数据从产生,到数据流动,最后持久化的全生命周期
用户脑子 =》 后端服务器 =》 数据库 (《=》其他系统)
数据的持久化
注册“小明”,检查是否存在(合法性),用数据架构组织数据(修改内存),写入硬件(写入存储介质)
潜在问题
Q、数据库怎么保证数据不丢?
数据库通常使用事务日志和多副本存储来保证数据可靠性。即使发生故障,也能通过日志恢复数据。
Q、数据库怎么处理多人同时修改的问题?
数据库通过事务的隔离性和锁机制来确保并发访问的正确性。
Q、为什么用数据库,除了数据库还能存到别的存储系统吗?
数据库提供更强的数据管理能力(如事务、索引、高效查询),但对于特定场景,也可以使用文件系统、分布式存储等替代。
Q、数据库只能处理结构化数据吗?
不是,关系型数据库擅长处理结构化数据,而非关系型数据库可以处理半结构化或非结构化数据(如JSON、图像)。
Q、有哪些操作数据库的方式,要用什么编程语言?
常用SQL操作关系型数据库,或使用数据库的SDK(Java、Python、Go等)与其交互;非关系型数 ...
【青训营X豆包MarsCode】第二课-深入浅出RPC框架
深入浅出 RPC 框架RPC 框架分层设计基本概念RPC (Remote procedure call 远程函数调用)是一种通过网络调用远程服务的方法,使程序可以像调用本地函数一样调用分布式系统中位于远程服务器上的函数。
函数映射、数据转换成字节流、网络传输
函数映射
在客户端调用一个远程函数时,如何将该调用正确映射到服务端对应的函数
服务注册,函数唯一标识符id,接口定义语言(IDL)
本地和远程是不同的进程,不共享内存
数据转换成字节流
将函数的参数和返回值序列化为可以通过网络传输的字节流格式
序列化(Serialization):将参数和返回值转换为字节流。
常用格式:JSON、XML(文本格式,易读但较慢);Protocol Buffers、Thrift、Avro(二进制格式,高效但不易读)。
反序列化(Deserialization):将接收到的字节流还原为原始数据。
序列化工具:
JSON:简单易用,语言无关,但性能不高。
Protocol Buffers(Protobuf):高效二进制序列化,适合高性能 RPC。
Thrift:序列化与 RPC 框架结合,支持多语言 ...
【青训营X豆包MarsCode】第一课-Go 语言基础语法
Go 语言基础语法走进 Go 语言基础语法时间处理时间相关的函数,以及时间的格式化
now := time.Now()fmt.Println(t)fmt.Println(t.Format("2006-01-02 15:04:05"))
数字解析将字符串转成int:strconv.ParseInt(字符串,进制,精度位数) 或者 strconv.Atoi(字符串)(自动识别)
func main() { n, _ := strconv.ParseInt("111", 10, 64) fmt.Println(n) // 111 n2, _ := strconv.Atoi("123") fmt.Println(n2) // 123}
进程信息当我们在命令行中输入 go run example/20-env/main.go a b c d 时,os.Args可以获取到输入的参数 a b c d。
fmt.Println(os.Getenv(“PATH”))打印了环境变量 PATH 的值,它通 ...
Ubuntu双系统安装
Ubuntu双系统安装鉴于Linux在的种种便利,最近打算装一个Ubuntu,虽然之前使用VMware装过Ubuntu的虚拟机,但是由于未知原因(可能是内存不够,同时运行Windows和Ubuntu比较吃力),我的Ubuntu虚拟机运行得比较卡顿,于是想干脆装个双系统好了。
准备材料:U盘(最好8G以上,不要有文件,到时候需要格式化,文件会损坏)
省流:将U盘作为Ubuntu启动盘,在空余的磁盘空间安装Ubuntu系统
安装过程如下
制作启动U盘下载Ubuntu.iso文件
官网:https://ubuntu.com/download/desktop
镜像网:https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/
选择合适的版本,注意选择 标记LTS 的版本,表示长期支持(比如24.04,22.04之类的)
下载写入工具(比如rufus、win32diskImager),这里使用win32diskImager
下载地址:https://sourceforge.net/projects/win32diskimager/
选择U盘,写入U ...
【7天用Go从零实现】Web框架Gee教程(2)
7天用Go从零实现Web框架Gee教程(2)本文参考:https://geektutu.com/post/gee.html
好的,让我们继续往下看
Day2 上下文先看看文件结构吧
│ go.mod│ main.go│└─gee context.go gee.go go.mod router.go
这里是对gee框架进一步拆解模块化,分为context,gee,router,重点看看context,就是其实就是将Request和Response进行了封装,顶多将常用的Path、Method、StatusCode拎出来了而已, 噢,还有内部的方法,写响应的String、JSON、Data、HTML各种格式。
type Context struct { // origin objects Writer http.ResponseWriter Req *http.Request // request info Path string Method string // response info StatusCo ...
【7天用Go从零实现】Web框架Gee教程(1)
7天用Go从零实现Web框架Gee教程(1)本文参考:https://geektutu.com/post/gee.html
研究这个教程的时候,我刚刚开始学习用Go,觉得单纯看语法学习效率较低,而且容易遗忘,所以就打算边看边学,顺便学习Web框架相关的知识,之前用过爬虫,但还只是浅尝辄止,稀里糊涂,我想学习Web框架也有助于对爬虫的理解。
对于初步使用Go语言搭建Web应用的人来说,Gin框架无疑是最常见的,我也不例外,之前也用Gin写了一个简单的TODOList, 而Gee框架是一个简化的类Gin框架,适合帮助初学者理解Web框架。
写这篇博客的时候我已经看到了Day3,到Day3的时候项目已经逐渐变得稍微复杂起来,而且出现了单测这个之前有所耳闻的概念,脑子里有些混乱了,于是打算停下来复盘一下,顺便写篇博客。
Day0 序言框架有简化开发的作用,避免了不必要的繁复操作,同时框架提供了很多额外的功能,像是动态路由、中间件等等
Day1 HTTP基础这篇包括了三个Web应用版本,由最基础逐渐复杂起来(虽然整个教程就是这样一个常见的“合理的”难度梯度)
base1这里主要就是要了解net ...
Hexo博客日志(2)
本博客的报错和解决在使用博客的过程中, 也出现了不少问题,虽然在日志(1)中也写了两个报错,而在这里就写写出现的报错我感觉可以单独写一篇,在写这篇博客的时候我可能还没有解决这些错误,会有我的探索过程
目前出现的最大的问题就是在博客本地仓库修改过之后,进行提交会报错,这种错误我之前也遇到过,一般都是通过推倒重来,重新搭建博客解决的,但这终究不是长久之计,于是想着深入了解报错的原因
首先我打算查看一下本地仓库和远程仓库的提交记录,看两者出了什么差错
//查看本地提交记录git log//查看远程仓库提交记录git log origin/main
看了两边的提交记录之后确实差得很大,甚至就没有重合的部分,可能是我之前由于某种原因清除了本地的原因,既然完全不同,那还是重建仓库好了,这边也是,由于.deploy_git文件夹是用于存储文件以及git提交的文件夹,我本来想过删除本地的提交记录,但是好像不可行,于是我就干脆删除该文件夹,重新放入初始的.deploy_git文件夹,使用hexo g在.deploy_git文件夹中重新生成文件,推送,就好了。
总结一下,两边进程不同步,初始化.depl ...
二叉树迭代遍历
二叉树迭代遍历本文参考:代码随想录 (programmercarl.com)
二叉树的遍历使用递归是相当简单优雅的,但如何使用迭代实现?
对于二叉树的遍历,我将它想象成对一个二叉树结构洞穴的探索,冒险者就是实时锚点cur,而栈则是冒险者经过某些路口在地图上标记的信息
前序遍历(中左右)
class Solution {public: vector<int> preorderTraversal(TreeNode* root) { stack<TreeNode*> st; vector<int> result; if (root == NULL) return result; st.push(root); while (!st.empty()) { TreeNode* node = st.top(); // 中 st.pop(); resul ...