- 博客(34)
- 收藏
- 关注
原创 ubuntu 开启ssh踩坑之旅
若为inactive,表示未开启仅应用底层规则,相当于允许所有端口通过;我当前是一个普通用户,需要使用sudo命令;ubuntu中没有sshd命令,只有ssh,指的就是sshd。注意:错误信息是参考,比如密码错误日志不一定是密码错误。实时查看日志,尝试连接时此处会实时打印相应日志;如果修改过密码,命令。更新系统安装包列表,没有更新安装包。若开启防火墙了,需要允许ssh端口通过。// -y 表示所有的问题选yes。// 更新系统软件包列表和源信息。需要先输入当前密码,再设置新密码。// 设置密码(普通用户)
2025-07-17 13:41:14
523
原创 mysql 散记:innodb引擎和memory引擎对比 sql语句少用函数 事务与长事务
隐式字符编码转换,比如:t1的字符集是utf8mb4,t2的字符集是utf8;长事务会导致undo log很大,innodb_undo_tablespaces = 2(2个独立的表空间文件), 方便回滚清理。读(select …查询语句定义的虚拟表,相当于持久化的查询语句别名。如果调用时函数作用在参数上就不影响索引选择,但函数作用在列上,就会导致索引失效。时只是做了记录,到执行第一条读写语句时才真正开启事务,分发事务ID。innodb引擎是索引组织表(B+树),memory引擎是堆组织表(数组)
2025-07-11 18:20:30
614
原创 mysql 数据备份与数据恢复
在start slave之前,先执行change replication filter replicate_do_table=(tbl_name),让临时库只同步误操作的表;如果时间过了太久,线上备库没有完整的binlog,我们可以把缺的binlog从binlog备份中找到塞到线上备库里,然后建立主备关系。注意:mysqldump是单线程的、而且回放binlog时不仅只回放这个表而是全部,所以会比较慢。在从binlog中取出0点后的日志,应用误删数据前的日志和误删数据后(找对应的GTID)的日志。
2025-07-11 16:43:14
294
原创 mysql的性能优化:组提交、数据页复用、全表扫描优化、刷脏页
后来引入online DDL:插入临时表时,记录操作日志到row log中,重建表完成后重放,此时重建表是在引擎层(inplace)完成的 // 不需要重建整个表,二十在原表数据文件上直接修改。为了防止数据丢失:sync_binlog=1,innodb_flush_log_at_trx_commit=1 事务提交立即写盘(redo log与binlog 配置 “双1”)。0关闭,SSD(固态硬盘)不用开,因为SSD刷的快,不开可以减少sql语句执行等待的时间。共享空间中,即使删表,空间也不会回收。
2025-07-11 16:26:10
515
原创 mysql中的自增ID
id=10, auto_increment=11,如果这时删除id=10的数据,auto_increment=11,如果此时插入数据,新数据的id=11(// 注意:表中id不是连续的);select不像insert…用完会重置到0,但mysql分配线程ID时加了逻辑限制要求唯一:重置0之后,mysql会遍历thread_id_counter,直至找到一个没有被正在用的thread_id,分配给新线程。也有步长是2的情况,比如双主的主备结构,一个机器的自增ID用奇数,一个机器的自增ID用偶数,步长都是2。
2025-07-11 16:23:27
493
原创 mysql join语句、全表扫描 执行优化与访问冷数据对内存命中率的影响
由于join buffer优化,导致被驱动表被多次扫描,就算lru 有young区、old区,热数据也有被顶掉的风险。所以慎用BLJ,最好在被驱动表上建索引,如果仅临时操作一次,建索引比较浪费,可以考虑使用临时表。按照MMR的思路,NLJ本来是从t1一条一条取数据去t2 a索引上找的,我们可以每次多取点(看join buffer的大小)到join buffer上排个序再一起MRR,去a索引上找。增加old区,因为全表扫描的冷数据不会变频繁访问,所以一般就在old区,对young区正常业务的缓存影响减小。
2025-07-10 19:52:55
803
原创 mysql 可用性的保障机制:主讲主从复制机制
同时,控制binlog_group_commit_sync_delay、binlog_group_commit_sync_no_delay_count 多攒点binlog一起提交,通过延迟,增加并发量。两个主节点,你复制我的日志,我复制你的日志,但怎么区分出来我复制你的日志是你执行了的的新日志,不是我传给你的我的日志呢(我不需要复制我的日志,循环复制)不过有个问题:一组事务这个粒度很大,而且同时只有一组事务committing完成在从库复制,要等这组复制完再进行下一组的复制,有空白期,并发能力不够。
2025-07-09 23:40:14
878
原创 mysql 故障检测与处理
一主多从,主库A挂了,找出新的主库B后就要同步位点。因为原来节点B也是A的从库,本地记录的A的位点。但相同的日志,A的位点和B的位点是不同的。比如:延迟从库被选为新主库,就会在主库删除数据宕机后,其他库的数据比延迟从库多,就会报错停下来需要人工处理,判断一下是误删还是正常删除再恢复主从关系。如果B在算差值时,发现有从库需要的日志但在B上没有,认为有问题,直接返回错误:Slave has more GTIDs than the master。一主多从,主库A挂了,找出新的主库B后就要同步数据(主从切换)。
2025-07-09 23:35:14
630
原创 mysql count(*)、order by、group by的执行逻辑
针对方案二,随机取三个字段就是:随机个最大、最小行数(N最小,M最小,R中间),取出limit N, M-N+1这些行,在里面拿出这三行数据。sort buffer大小(sort_buffer_size)不够,就需要存到磁盘上,存在多个文件中,多个文件分别完成排序后再进行归并排序。对于只需要几个返回值,不需要全量排序,innodb使用优先队列算法,扫描所有数据和堆上的数据对比,堆上只放最大的三个。问题:主键ID不连续,可能有空洞。而且随机概率不平均,比如ID排布 1,2,3,8,9,4000,40001。
2025-07-09 16:08:18
559
原创 mysql 索引
change buffer主要节省的是写操作时需要随机读磁盘的IO消耗,redo log主要节省的是写时需要随机写磁盘的IO消耗(转为顺序写)。唯一索引找到就返回,普通索引找到下一个不满足的就返回,所以普通索引比唯一索引查找次数的多。当name,age都需要独立索引,还需要联合索引时,推荐创建age单独索引,(name, age)联合索引。二级索引的叶子节点上存这主键索引,主键索引越小(比如int < varchar),二级索引的检索效率越好。原则:尽可能少的创建索引,索引(数据块*)的大小尽可能小。
2025-07-08 20:58:46
590
原创 mysql中的锁
同时当前线程也只能读t1,不能写t1,可以写t2;执行alter table t add c int写操作前,判断前面是否有长事务(大查询),选择一:等待长事务执行完成;此时,整个表不能读写,等待sessionA、sessionB的完成;如果需要写热点表,虽然数据量不大,但请求频繁,需要设置任务超时时间,改不了也不要影响其他语句,等有空再改;超时时间不好设置,太短容易误伤业务,太长也不好,都等待很长时间,都没执行 //mysql中的锁:全局锁,表锁、元数据锁(MDL),行锁、间隙锁等。
2025-07-08 19:00:05
1280
原创 mysql 一条语句的执行流程
write_pos是当前记录的位置,write_pos到check_point的绿色部分还能写入,其余位置是新的写入。复用连接的问题(长连接问题):连接在断开时才会释放占用资源,而不是用完就释放;在流程图的时机B崩溃:redo log处于prepare状态,写入binlog完成:服务重新启动时,认为事务提交成功,回放事务,将redo log prepare状态改为commit。在流程图的时机A崩溃:redo log处于prepare状态,未写入binlog: 服务重新启动时,认为事务提交失败,回滚事务。
2025-07-08 17:31:20
770
原创 go web框架实现与使用
Server定义、路由树、context上下文、AOP方案(Middleware)、静态资源服务与文件处理、页面渲染template、Session、优雅退出。测试代码:web/test/graceful_shutdown_test.go 注意:该代码必须放在main函数下运行,test文件下无法监听到退出信号。支持路由:静态路由、参数路由(/a/:id)、正则匹配、动态路由(通配符 /a/*),路由命中优先级按照前面的顺序。测试代码:web/test/server_route_test.go。
2025-06-19 00:37:34
947
原创 go orm框架 支持分库分表查询
ORM框架支持基于Builder模式构建SQL查询,利用reflect与unsafe技术处理结果集,同时具备元数据维护、中间件集成、链式调用、事务管理和分库分表查询能力。duplicateKey语句: on conflict columnName do update set col1=exclued.col1。duplicateKey语句:on duplicate key update col1=values(col1)维护数据结构(如User)和数据库中相应表、字段的关系。quoter -> 双引号。
2025-06-18 22:34:59
630
原创 go 并发队列、优先级队列、延迟队列
好处:b.queue = b.queue[1:]会引起内存频繁分配,ringBuffer复用固定资源。等待时使用for,而不是if // 广播唤醒多个,但只有一个抢到了锁,其他需要重新等待枪锁。好处: ringBuffer使用固定内存,可能实际不需要,链表支持动态连接。ringBuffer比链表的优势:支持复杂操作,如随机访问。由于sync.cond没有超时控制,所以自行设计cond。ringBuffer替代[]*T。链表替代ringBuffer。使用cond进行超时阻塞控制。
2025-06-17 15:17:28
455
原创 go 服务注册与发现
注册中心连接不上服务端会进行重试,若多次重试连接不上,就认为服务端挂了,通知客户端。可能是因为客户端和服务端中有防火墙,当服务端连接不上时,客户端需要从本地的可用节点列表中移除相应的服务实例;从可用性的角度考虑,客户端继续服务,并尝试重新连接注册中心,这段时间使用缓存数据。若是服务端主动续约,没有心跳的情况:取决于租约超时时间和注册中心租约超时重试机制。从一致性的角度考虑,客户端立即终止服务调用,直到与注册中心恢复连接。若是注册中心主动与服务端保持心跳的情况:取决于心跳重试的次数和间隔。
2025-06-09 19:55:14
964
原创 go 连接池
在简单tcp服务中,每次请求耗费一个连接net.dial()。所以我们可以考虑复用连接,实现连接池。说明:仅简单测试,未提供完备测试用例。
2025-06-09 14:29:54
244
原创 go 缓存
一般情况下,击穿不会有问题,访问一次db就能回写redis;key数量超大时,需要限制,比如限制轮询key的个数或者轮询时长。问题:定时轮询不能访问到所有key,所以有过期key没处理,不能单独定时轮询。大量goroutine同时访问一个key时,singleflight会让其他的原地等待,只有一个访问db。存在第三方比如bloomFilter,先确认db上是否hasKey,存在再请求db。穿透:大量不存在的key访问redis不存在,打到db上。击穿:key不在缓存中,但在db中。
2025-06-03 16:32:31
379
原创 go 任务池
任务池用来管理并发任务,没有任务池面临的问题:并发任务来一个开一个goroutine。无缓冲缓冲小了会阻塞任务提交;缓冲过大会导致资源浪费。快任务、慢任务分开放在两个任务池中配置、处理。// 这篇文章我喜欢他的场景示例和数据对比。task pool中task介绍。// todo: 压缩图片上传。
2025-05-30 13:43:30
321
原创 go 消息队列 涉及channel、ring buffer
文章主要是针对消息队列的思考,消息队列核心实现使用了channel、ring buffer和map结构。文章开篇介绍了channel的实现原理,然后是对消息队列的分析与实现,其中消息缓冲使用ring buffer存储,所以在文章第三部分介绍了ring buffer。
2025-05-29 15:33:19
346
原创 go 文件上传系统
文件上传系统是前后端分离项目,实现普通文件上传、大文件分片上传功能;大文件分片上传提供断点续传、并发上传等能力,通过分片md5、文件md5验证完整性。
2025-04-28 09:58:56
252
原创 go 用户身份认证的核心机制
readme&源码: https://gitee.com/luyue_zhang/sso_oauth2/blob/master/single_sign_on/readme.md。readme&源码: https://gitee.com/luyue_zhang/sso_oauth2/blob/master/oauth2/readme.md。readme&源码: https://gitee.com/luyue_zhang/sso_oauth2/blob/master/sso/readme.md。
2025-04-08 10:12:52
236
原创 单点登录&OAuth2.0
在多系统共存环境下,一个系统登录后,其他系统无需登录;即一处登录后获得所有系统信任。全局独一份内容,比如是否登录存中央session中;个性信息存在自己的服务中。说明:此处代码实现分别存储session的sso。多设备指手机、笔记本、电脑等,需要分别登录。负载均衡、熔断限流、来源验证 // 最好网关做。鉴权:是合法用户的你有哪些权限。
2025-04-02 17:11:11
346
原创 Cookie、Session和Token的关系和区别
Cookie是服务端发送给浏览器并储存在本地的一小段文本数据(通常<=4KB),浏览器后续请求自动携带该数据回传服务端核心作用会话跟踪:记录用户行为,如购物车商品身份认证:存储用户登录后的身份标识,如session_idSession是服务器为每个用户分配的唯一会话标识,存储用户登录状态或临时数据与cookie的关系服务端通过Cookie将session_id返回客户端客户端后续请求携带该id,服务端通过该id从内存或数据库中查找对应的会话数据为什么需要Session。
2025-04-02 16:58:17
464
原创 go 微服务架构
比如缓存模式下,正常情况下,缓存中查不到就查询数据库;当触发限流后,缓存中查不到可以返回默认值或错误。可以结合failover考虑,返回客户端302重定向,让客户端重新找一个可用节点。当触发限流后,服务接收到请求直接返回202,再异步处理请求。触发限流后直接返回固定响应这一步可以在服务拦截器里实现。故障检测触发限流,限流缓解故障影响、检测优化限流策略。微服务框架服务于微服务架构,核心:通信、治理。漏桶、令牌桶、固定窗口、滑动窗口。go 微服务框架-广播实现讲解。分而治之,独立部署、治理。
2025-03-20 18:36:45
415
原创 go 代码生成技术
编译器地址:https://github.com/protocolbuffers/protobuf/releases/tag/v3.19.4下载 win-64版本,把bin文件夹的路径放到环境变量path下相关教程:https://blog.youkuaiyun.com/weixin_51952373/article/details/123098967命令:go install github.com/golang/protobuf/protoc-gen-gogitee: https://gitee.com/luyue_
2025-03-17 14:59:24
356
原创 go 原子操作、加锁、MVCC多版本并发控制
MVCC是Mysql InnoDB用于进行数据并发访问控制的协议。MVCC主要是通过版本链实现的。在InnoDB引擎里面,每行都有额外两列:trx_id和roll_ptr。trx_id表示修改该行数据的事务ID。roll_ptr表示回滚指针。InnoDB引擎通过回滚指针将不同版本串联起来,构成版本链。这些串联起来的历史版本,存在undolog里面。当某一事务发起查询时,MVCC会根据事务的隔离级别生成相应的read view, 返回合适的数据。
2025-02-26 11:15:10
518
原创 批量清除本地分支
在多个项目频繁切换、快速迭代过程中,我们在本地开发环境创建过许多feature、bugfix分支没有清理。我们期望能够提供一键清空本地无用分支的脚本。核心:批量操作+自定义指令。
2023-08-29 17:13:43
217
1
原创 flex布局实现等比5个盒子--logo配置组件
1. 整体使用弹性布局,整体宽度高度由空间大小决定2. 5个box等比展示3. 按钮使用固定高度,绝对底部4. title、img、description按内容大小自动分配空间
2023-08-01 14:55:38
385
1
原创 事件循环与任务队列
JS单线程意味着它同一时间只能做一件事,所有的任务需要排队。而CPU的处理速度比I/O设备快很多,等待I/O设备是不合理的,所以同步任务在主线程调用栈中调用,异步任务在任务队列中排队。当调用栈清空,就去任务队列里拿一个过来task,反复这个过程。
2023-01-04 21:34:32
130
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人