获得徽章 1
- #青训营笔记创作活动#
2月23日 Day43
今日学习:同步原仓库的修改
在你开发的过程中,可能会有其他开发同学已经把自己的PR merge到main分支了。
那么这时候我们就把修改merge到自己的开发分支。
添加原始仓库作为upstream仓库
git remote add upstream [HTTPS]
获取原始仓库的变更
git fetch upstream
合并更改
git merge upstream/main
解决冲突并push到自己的开发分支
Step3:Fix原仓库维护者提出的建议
提完PR之后,我们需要确保所有单测和校验能通过。
同时也会有原仓库的维护人提出一些建议,需要我们去solve
单测需要补全
文档需要补充
代码实现逻辑有问题
等等开发并推送远端分支
通常开发需要包括实现代码、单测、README等
在完成了一些开发时,我们可以开始git 一键三连
git status
git add [YOUR FILE]
git commit -m [YOUR COMMIT MESSAGE]
git push origin [YOUR BRANCH]
单测结合github action
一般开源库都会结合github action进行单测流水线化,目录中会有.github/workflows/xxx.yml等文件,通过这些文件可以在提出pr、push等阶段进行校验。
因此,我们也需要更改这些文件,确保能执行自己的单测。展开评论点赞 - #青训营笔记创作活动#
2月22日 Day42
今日学习:Debug
快速执行到某个位置
有时候我们的断点没有设置在某个位置,但是也不想设置在哪个位置; 在Debug的时候想让程序直接运行到那个位置,怎么处理?
第一种方式: 鼠标移动到对应的行数,然后按下run to cursor按钮
第二种方式:直接点击文件旁边的数字即可,运行到对应的行哪里
回退重新开始执行
在一些复杂的链路中,方法调用很长,手一抖结果代码又运行了几行,这个时候想去重新开始执行这个断点怎么办?
常规操作是再模拟发出个请求,重新进入断点; 但其实Idea已经提供了对应的方式,直接撤回当前的帧即可,断点会重新进入方法开始执行。
在Frame的位置点击撤回按钮,就会重新进入这个方法开始运行展开评论点赞 - #青训营笔记创作活动#
2月21日 Day41
今日学习:表分区有什么好处?
与单个磁盘或文件系统分区相比,可以存储更多的数据。
对于那些已经失去保存意义的数据,通常可以通过删除与那些数据有关的分区,很容易地删除那些数据。相反地,在某些情况下,添加新数据的过程又可以通过为那些新数据专门增加一个新的分区,来很方便地实现。
一些查询可以得到极大的优化,这主要是借助于满足一个给定WHERE语句的数据可以只保存在一个或多个分区内,这样在查找时就不用查找其他剩余的分区。因为分区可以在创建了分区表后进行修改,所以在第一次配置分区方案时还不曾这么做时,可以重新组织数据,来提高那些常用查询的效率。
涉及到例如SUM()和COUNT()这样聚合函数的查询,可以很容易地进行并行处理。这种查询的一个简单例子如 “SELECT salesperson_id, COUNT (orders) as order_total FROM sales GROUP BY salesperson_id;”。通过“并行”,这意味着该查询可以在每个分区上同时进行,最终结果只需通过总计所有分区得到的结果。
通过跨多个磁盘来分散数据查询,来获得更大的查询吞吐量。展开评论点赞 - #青训营笔记创作活动#
2月20日 Day40
今日学习:固定,滑动窗口计数和登录失败逻辑
固定窗口计数是指,假设我们的限流规则是:1min内最多只能访问10次,那么固定窗口就是固定了【 1min-2min】这个窗口内,只能有10次访问 ,相应的我们就要给这个窗口维护一个计数器。 为了节省空间,其实我们不需要维护一个个窗口,只需要维护当前访问时间所在的窗口即可,以及对应的计数器,当新的访问到达了下一个窗口时,则计数器重置即可。
redis实现
用redis的话,由于有过期机制,其实设置1min过期,就可以实现计数器重置的效果了
redis设置一个名为qps的key,val用来计数,1min过期即可
滑动窗口计数
假设我们的限流规则是:1min内最多只能访问10次,那么滑动窗口呢就是会根据你访问进来的时间,以访问时间作为区间末尾,当前时间-1min作为区间头部,相当于窗口一直在往右滑动,这样其实就能在一定程度上解决我们刚才提到的窗口临界问题
登录失败的逻辑
先判断是否有 login_bank:+账号+ip的key,有则直接限制登录
没有,若登录失败,则 login_error:+账号+ip的 val++, 若val达到5了,则设置一个 login_bank:+账号+ip的key,10min过期
并删除掉 login_error:+账号+ip展开评论点赞 - #青训营笔记创作活动#
2月19日 Day39
今日学习:Optional
Java 8 引入了一个十分实用的 Optional 类,它主要是为了解决空指针异常(NullPointerException)。当我们对对象的属性进行检查,判断它的值是否为期望的格式,最终却发现我们查看的并不是一个对象,而是一个空指针,它会立即抛出一个让人厌烦的 NullPointerException 异常。
Optional 是 Java 语言的有益补充 —— 它旨在减少代码中的 NullPointerExceptions。
通过设计,自然的融入了 Java 8 函数式支持。
总的来说,这个简单而强大的类有助于创建简单、可读性更强、比对应程序错误更少的程序。展开评论点赞 - #青训营笔记创作活动#
2月18日 Day38
今日学习:负载均衡之【LVS】
LVS,它的全称是Linux VirtualServer,它是一种集群(Cluster)技术,采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。
负载均衡之【Nginx】
Nginx是一款非常高性能的http代理/反向代理服务器,服务开发中也经常使用它来做负载均衡。Nginx实现负载均衡的方式主要有三种:轮询、加权轮询、ip hash轮询。展开评论点赞 - #青训营笔记创作活动#
2月16日 Day36
今日学习:Printf()、Sprintf()、Fprintf()函数的区别用法是什么
都是把格式好的字符串输出,只是输出的目标不一样。
Printf(),是把格式字符串输出到标准输出(一般是屏幕,可以重定向)。Printf() 是和标准输出文件 (stdout) 关联的,Fprintf 则没有这个限制。
Sprintf(),是把格式字符串输出到指定字符串中,所以参数比printf多一个char*。那就是目标字符串地址。
Fprintf(),是把格式字符串输出到指定文件设备中,所以参数比 printf 多一个文件指针 FILE*。主要用于文件操作。Fprintf() 是格式化输出到一个stream,通常是到文件。展开评论点赞 - #青训营笔记创作活动#
2月15日 Dya35
今日学习:用户登陆(认证)
服务器需要在用户第一次登陆的时候,验证用户账号和密码,并签发 jwt token。
Authenticator:用于设置登录时认证用户信息的函数,demo 当中定义了一个 loginStruct 结构接收用户登陆信息,并进行认证有效性。这个函数的返回值 users[0] 将为后续生成 jwt token 提供 payload 数据源。
PayloadFunc:它的入参就是 Authenticator 的返回值,此时负责解析 users[0],并将用户名注入 token 的 payload 部分。
Key:指定了用于加密 jwt token 的密钥为 "secret key"。
Timeout:指定了 token 有效期为一个小时。
MaxRefresh:用于设置最大 token 刷新时间,允许客户端在 TokenTime + MaxRefresh 内刷新 token 的有效时间,追加一个 Timeout 的时长。展开评论点赞 - #青训营笔记创作活动#
2月14日 Day34
今日学习:局部性原理
局部性原理的思想比较简单,比如目前有三块内存页x、y、z是相连的,CPU此刻在操作x页中的数据,那按照计算机的特性,一般同一个数据都会放入到物理相连的内存地址上存储,也就是当前在操作x页的数据,那么对于y,z这两页内存的数据也很有可能在接下来的时间内被操作,因此对于y,z这两页数据则会提前将其载入到高速缓冲区(L1/L2/L3),这个过程叫做利用局部性原理“预读”数据。展开评论点赞 - #青训营笔记创作活动#
2月13日 Day33
今日学习:Mysql
Mysql 的表数据是以页的形式存放的,页在磁盘中不一定是连续的。
页的空间是 16K, 并不是所有的空间都是用来存放数据的,会有一些固定的信息,如,页头,页尾,页码,校验码等等。
在 B+ 树中,叶子节点和非叶子节点的数据结构是一样的,区别在于,叶子节点存放的是实际的行数据,而非叶子节点存放的是主键和页号。
索引结构不会影响单表最大行数,2kw 也只是推荐值,超过了这个值可能会导致 B + 树层级更高,影响查询性能。
展开评论点赞