获得徽章 1
#青训营笔记创作活动#
2月11日 day18

通过对缓存的合理、充分利用,可以大大的增强我们的系统承压性能、提升产品的用户体验。例举恰当使用场景:对于一些变更频率比较高的数据,采用集中式缓存,这样可以确保数据变更之后所有节点都可以实时感知到,确保数据一致;对于一些极少变更的数据(比如一些系统配置项)或者是一些对短期一致性要求不高的数据(比如用户昵称、签名等)则采用本地缓存,大大减少对远端集中式缓存的网络IO次数。
展开
评论
#青训营笔记创作活动#
2月9日 day17

秒杀系统有9个细节,分别是瞬时高并发、页面静态化(CDN)、秒杀按钮、读多写少、缓存问题、库存问题、分布式锁、mq异步处理、以及如何限流。
展开
评论
#青训营笔记创作活动#
2月8日 day16

- 大数取模运算是不可逆的,因此他人无法暴力解密。但是结合欧拉定理,我们可以选取出合适的p(公钥), q(私钥), N(用于取模的大数),让原本不可逆的运算在特定情况下,变得有那么点“可逆”的味道。数学原理决定了我们用公钥加密的数据,只有私钥能解密。反过来,用私钥加密的数据,也只有公钥能解密。
- HTTPS相当于HTTP+TLS,目前主流的是TLS1.2,基于TCP三次握手之后,再来TLS四次握手。
- TLS四次握手的过程中涉及到两对私钥和公钥。分别是服务器本身的私钥和公钥,以及CA的私钥和公钥。
- TLS四次握手背起来会挺难受的,建议关注三个随机数的流向,以此作为基础去理解,大概就能记下来了。
展开
评论
#青训营笔记创作活动#
2月5日 day15
直接使用关系型数据库会限制网站的访问速度,所以在客户端与数据层之间就加了一个缓存层来分担请求压力。Redis就是一款优秀的缓存中间件,它是一个开源的、键值对型的数据存储系统。使用C语言编写,遵守BSD协议,可基于内存也可持久化的日志型数据库,提供了多种语言的API,被广泛用于数据库、缓存和消息中间件。并且支持多种类型的数据结构,用于应对各种不同的场景。可存储多种不同类型值之间的映射,支持事务,持久化,LUA脚本以及多种集群方案等。
展开
评论
#青训营笔记创作活动#
2月4日 day14

数据库索引非常多样化,比如有聚簇索引、非聚簇索引、唯一索引、主键索引、联合索引、全文索引、单列索引、多列索引、复合索引、普通索引、二级索引、辅助索引、次级索引、有序索引、B+Tree索引、R-Tree索引、T-Tree索引、Hash索引、空间索引、前缀索引等等。MySQL可以通过CREATE、ALTER、DDL三种方式创建一个索引,通过索引可以帮助表进行快速检索目标数据。
展开
评论
#青训营笔记创作活动#
2月1日 day13

数据库索引是MySQL的核心功能之一,引入索引机制后:
1,可以提升数据的检索效率,数据量越大效果越明显。
2,通过创建唯一索引可以确保数据表中的数据唯一性,无需额外建立唯一约束。
3,在使用分组和排序时,同样可以减少SQL查询的分组和排序时间。
4,连表查询时,基于主外键字段上建立索引,可以带来十分明显的性能提升。
5,索引默认是B+TREE有序结构,基于索引字段做范围查询效率会明显提高。
6,从MySQL整体架构而言,减少了查询SQL的执行时间,提高了整体数据库吞吐量。
但同时也会带来弊端:
1,建立索引会产生本地磁盘文件,需要额外的空间存储索引数据,磁盘占用率会变高。
2,写入数据时需要维护索引结构,增删改数据时,都需要额外操作索引。
3,写入数据时维护索引需要额外的时间开销,执行写SQL时效率和性能会降低。
展开
评论
#青训营笔记创作活动#
1月29日 day12

慢SQL的优化思路有:
1,慢查询日志记录慢SQL
2,explain分析SQL的执行计划
3,profile分析执行耗时
4,Optimizer Trace分析详情
5,确定问题并采用相应的措施


展开
评论
#青训营笔记创作活动#
1月28日 day11
SQL语句都诞生于客户端,有两种方式生成:开发者手动编写和ORM框架生成,通常mysql收到的大部分sql都是orm框架生成的。
生成后的sql在执行前,会先去连接池尝试获取一个连接对象,如果此时连接池有空闲连接,可以直接拿到复用,如果没有则先判断当前池中的连接数是否已达到最大连接数,如果满了则当前线程需要等待其他线程释放连接对象,没满则再创建一个数据库连接使用。
建立数据库连接会首先经过《TCP的三次握手过程》,网络连接建立成功后,等价于在MySQL创建了客户端会话,然后会验证客户端的用户名和密码,判断MySQL连接池是否有空闲线程,工作线程会先查询MySQL自身的用户权限表,获取当前登录用户的权限信息并授权。

执行SQL语句时,先将sql发送给sql接口,接口会对sql语句进行哈希处理,接口会在缓存中根据哈希值检索数据,如果缓存中有则直接返回数据。如果没有会将sql交给解析器,解析器会判断sql语句是否正确,正确则根据sql指定不同执行方案并选出最优执行方案。工作线程根据执行计划,调用存储引擎所提供的api获取数据,存储引擎根据api调用方的操作去磁盘中检索数据。发生磁盘io后,对于磁盘中符合要求的数据逐条返回给sql接口,sql接口会对所有的结果集进行处理并返回。


展开
评论
#青训营笔记创作活动#
1月26日 打卡day10
我们浏览器逛的某宝和某度是一个个的前端网页,前后端之间需要TCP协议建立连接,然后在TCP的基础上传输数据。然而TCP是基于数据流的协议传输时并不会为每个信息加入数据边界,因而产生“粘包”问题。于是在此基础上设计了HTTP协议,在你想看某个商品的具体信息时,前端会在HTTP请求中传入商品的id,后端返回的HTTP响应中返回商品的价格、商店名、发货地址等。
问题来了,如果发生异常情况,该如何回应呢?于是一套HTTP状态码被设计出来了:
200-一切正常
4xx客户端-401客户端没权限,404客户端请求了不存在的网页
5xx-服务器有问题,但不是服务端返回的状态码,是由网关返回的(常见的网关比如nginx)
当服务器发生异常时,nginx发送给服务器的TCP连接不能正常响应,nginx收到信息后,会返回5xx给客户端,5xx是由nginx识别出来并返回给客户端。但服务端本身并不会有5xx的日志信息。所以上游收到服务的502报错,自己的服务日志里并不会搜索到这条信息。

502是由网关代理nginx发出的,一般是指TCP的RST报文或四次挥手的FIN报文,RST报文的原因一般是服务器过早断开连接以及服务端应用进程崩了。

客户端和服务端之间加入nginx,可以起到反向代理和负载均衡的作用,客户端只管向nginx请求数据,并不关心这个请求具体由哪个服务器来处理。
展开
评论
#青训营笔记创作活动#
1月25日 打卡day9
优秀的后端应该具备的开发好习惯有:
1,注释尽可能写全面,写有意义的方法注释
2,项目拆分合理的目录结构
3,不在循环里调用、或者数据库操作、优先考虑批量进行。
4,封装方法形参
5,封装通用模版
6,封装复杂的逻辑判断条件
7,保持优化性能的嗅觉
8,可变参数的配置化处理
9,会总结并使用工具类
10,控制方法函数复杂度(函数不超过80行)
11,在finally块中对资源进行释放
12,把日志打印好
13,考虑异常,处理好异常
14,考虑系统、接口的兼容性
15,代码采取措施避免运行时错误
展开
评论
下一页
个人成就
文章被点赞 3
文章被阅读 1,764
掘力值 162
收藏集
1
关注标签
2
加入于