获得徽章 1
#青训营笔记创作活动#
2月18日day30
Java 8 引入了一个十分实用的 Optional 类,它主要是为了解决空指针异常(NullPointerException)。
本质上,Optional 类是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空。
2月18日day30
Java 8 引入了一个十分实用的 Optional 类,它主要是为了解决空指针异常(NullPointerException)。
本质上,Optional 类是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空。
展开
评论
点赞
#青训营笔记创作活动#
2月16日day29
瞬时高并发场景设计思路
1.页面静态化
2.CDN加速
3.负载均衡
4.防重
5.缓存
6.异步
7.熔断、限流
8.分布式锁
分层过滤,分而治之
2月16日day29
瞬时高并发场景设计思路
1.页面静态化
2.CDN加速
3.负载均衡
4.防重
5.缓存
6.异步
7.熔断、限流
8.分布式锁
分层过滤,分而治之
展开
评论
点赞
#青训营笔记创作活动#
2月14日day28
new和make的区别
new 的作用是初始化一个指向类型的指针 (*T) 。new 函数是内建函数,函数定义:func new(Type) *Type。使用 new 函数来分配空间。传递给 new 函数的是一个类型,不是一个值。返回值是指向这个新分配的零值的指针。
make 的作用是为 slice,map 或 chan 初始化并返回引用 (T)。make 函数是内建函数,函数定义:func make(Type, size IntegerType) Type;第一个参数是一个类型,第二个参数是长度;返回值是一个类型。
2月14日day28
new和make的区别
new 的作用是初始化一个指向类型的指针 (*T) 。new 函数是内建函数,函数定义:func new(Type) *Type。使用 new 函数来分配空间。传递给 new 函数的是一个类型,不是一个值。返回值是指向这个新分配的零值的指针。
make 的作用是为 slice,map 或 chan 初始化并返回引用 (T)。make 函数是内建函数,函数定义:func make(Type, size IntegerType) Type;第一个参数是一个类型,第二个参数是长度;返回值是一个类型。
展开
评论
点赞
#青训营笔记创作活动#
2月13日day27
Hertz框架进行JWT认证
demo
使用命令行工具 hz 生成代码
使用 JWT 扩展完成登陆认证和授权访问
使用 Gorm 访问 MySQL 数据库
2月13日day27
Hertz框架进行JWT认证
demo
使用命令行工具 hz 生成代码
使用 JWT 扩展完成登陆认证和授权访问
使用 Gorm 访问 MySQL 数据库
展开
评论
点赞
#青训营笔记创作活动#
2月11日day26
本地锁失效是因为无法锁住各个应用的读写请求,失效的根本原因就是其他的服务无法感知到是否已经有请求上锁了,即无法共享锁信息。
分布式锁,其实也就是将加锁的这一个操作,单独的抽取出来了,让每个服务都能感知到。
2月11日day26
本地锁失效是因为无法锁住各个应用的读写请求,失效的根本原因就是其他的服务无法感知到是否已经有请求上锁了,即无法共享锁信息。
分布式锁,其实也就是将加锁的这一个操作,单独的抽取出来了,让每个服务都能感知到。
展开
评论
点赞
#青训营笔记创作活动#
2月10日day25
跨域问题指的是不同站点之间,使用 ajax 无法相互调用的问题。跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。
2月10日day25
跨域问题指的是不同站点之间,使用 ajax 无法相互调用的问题。跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。
评论
点赞
#青训营笔记创作活动#
2月9日day24
实现方法
步骤:
获取注解参数
获取当前请求的ip和请求的方法
生成key
获取redis中该key的访问次数
判断次数是否超过范围
若超出范围,则拒绝访问,返回提示,并将TTL重置为注解上的等待时间
若没有超过范围,则允许访问,并将访问次数+1
若查询不到该key,则往redis中进行添加,将值设置为1,将TTL设置为注解上的值
2月9日day24
实现方法
步骤:
获取注解参数
获取当前请求的ip和请求的方法
生成key
获取redis中该key的访问次数
判断次数是否超过范围
若超出范围,则拒绝访问,返回提示,并将TTL重置为注解上的等待时间
若没有超过范围,则允许访问,并将访问次数+1
若查询不到该key,则往redis中进行添加,将值设置为1,将TTL设置为注解上的值
展开
评论
点赞
#青训营笔记创作活动#
2月8日day23
缓存穿透
是指用户在不断访问一个缓存和数据库中都没有的数据。缓存无法命中,从而导致一直请求数据库,流量过大就会导致数据库的崩溃.
缓存雪崩
Redis挂掉了,请求全部走数据库。
缓存击穿
和缓存穿透其实非常类似,但是缓存击穿说的是数据在缓存中没有,但是在数据库中有的数据。
2月8日day23
缓存穿透
是指用户在不断访问一个缓存和数据库中都没有的数据。缓存无法命中,从而导致一直请求数据库,流量过大就会导致数据库的崩溃.
缓存雪崩
Redis挂掉了,请求全部走数据库。
缓存击穿
和缓存穿透其实非常类似,但是缓存击穿说的是数据在缓存中没有,但是在数据库中有的数据。
展开
评论
点赞
#青训营笔记创作活动#
2月7日day22
由本地缓存到集中式缓存(redis)到多级缓存,解决数据一致性问题,减少浪费,提升系统性能。
2月7日day22
由本地缓存到集中式缓存(redis)到多级缓存,解决数据一致性问题,减少浪费,提升系统性能。
评论
点赞
#青训营笔记创作活动#
2月6日day21
秒杀系统的9个细节
瞬时高并发、页面静态化、秒杀按钮、读多写少、缓存问题、库存问题、分布式锁、mq异步处理、如何限流
2月6日day21
秒杀系统的9个细节
瞬时高并发、页面静态化、秒杀按钮、读多写少、缓存问题、库存问题、分布式锁、mq异步处理、如何限流
评论
点赞
#青训营笔记创作活动#
2月5日day20
为什么用公钥加密,却不能用公钥解密?
因为大数取模运算是不可逆的,因此他人无法暴力解密。但是结合欧拉定理,我们可以选取出合适的p(公钥), q(私钥), N(用于取模的大数),让原本不可逆的运算在特定情况下,变得有那么点“可逆”的味道。数学原理决定了我们用公钥加密的数据,只有私钥能解密。反过来,用私钥加密的数据,也只有公钥能解密。
2月5日day20
为什么用公钥加密,却不能用公钥解密?
因为大数取模运算是不可逆的,因此他人无法暴力解密。但是结合欧拉定理,我们可以选取出合适的p(公钥), q(私钥), N(用于取模的大数),让原本不可逆的运算在特定情况下,变得有那么点“可逆”的味道。数学原理决定了我们用公钥加密的数据,只有私钥能解密。反过来,用私钥加密的数据,也只有公钥能解密。
展开
评论
点赞
#青训营笔记创作活动#
2月4日day19
总结:
1.跳表是可以实现二分查找的有序链表
2.每个元素插入时随机生成它的 level
3.最底层包含所有的元素
4.如果一个元素出现在 level(x),那么它肯定出现在 x 以下的 level 中
5.每个索引节点包含两个指针,一个向下,一个向右
6.跳表查询、插入、删除的时间复杂度为 O(log n),与平衡二叉树接近
为什么不选择红黑树来实现
插入元素
删除元素
查找元素
有序输出所有元素
查找区间内的所有元素
其中前 4 项红黑树都可以完成,且时间复杂度与跳表一致,但是最后一个红黑树的效率就没有跳表高了。在跳表中,要查找区间的元素,只要定位到两个区间端点在最低层级的位置,然后按顺序遍历元素就可以了,非常高效。
2月4日day19
总结:
1.跳表是可以实现二分查找的有序链表
2.每个元素插入时随机生成它的 level
3.最底层包含所有的元素
4.如果一个元素出现在 level(x),那么它肯定出现在 x 以下的 level 中
5.每个索引节点包含两个指针,一个向下,一个向右
6.跳表查询、插入、删除的时间复杂度为 O(log n),与平衡二叉树接近
为什么不选择红黑树来实现
插入元素
删除元素
查找元素
有序输出所有元素
查找区间内的所有元素
其中前 4 项红黑树都可以完成,且时间复杂度与跳表一致,但是最后一个红黑树的效率就没有跳表高了。在跳表中,要查找区间的元素,只要定位到两个区间端点在最低层级的位置,然后按顺序遍历元素就可以了,非常高效。
展开
评论
点赞
#青训营笔记创作活动#
2月3日day18
Bytebase是一款实用的数据库管理及变更工具,让我们在没有客户端的情况下也能方便地进行数据库管理,它的SQL审核功能可以避免开发人员对数据库的误操作。
2月3日day18
Bytebase是一款实用的数据库管理及变更工具,让我们在没有客户端的情况下也能方便地进行数据库管理,它的SQL审核功能可以避免开发人员对数据库的误操作。
评论
点赞
#青训营笔记创作活动#
2月2日day17
慢SQL优化思路。
慢查询日志记录慢SQL
explain分析SQL的执行计划
profile 分析执行耗时
Optimizer Trace分析详情
确定问题并采用相应的措施
2月2日day17
慢SQL优化思路。
慢查询日志记录慢SQL
explain分析SQL的执行计划
profile 分析执行耗时
Optimizer Trace分析详情
确定问题并采用相应的措施
展开
评论
点赞
#青训营笔记创作活动#
1月31日day16
HTTP状态码用来表示响应结果的状态,其中200是正常响应,4xx是客户端错误,5xx是服务端错误。
客户端和服务端之间加入nginx,可以起到反向代理和负载均衡的作用,客户端只管向nginx请求数据,并不关心这个请求具体由哪个服务器来处理。
后端服务端应用如果发生崩溃,nginx在访问服务端时会收到服务端返回的RST报文,然后给客户端返回502报错。502并不是服务端应用发出的,而是nginx发出的。因此发生502时,后端服务端很可能没有没有相关的502日志,需要在nginx侧才能看到这条502日志。
如果发现502,优先通过监控排查服务端应用是否发生过崩溃重启,如果是的话,再看下是否留下过崩溃堆栈日志,如果没有日志,看下是否可能是oom或者是其他原因导致进程主动退出。如果进程也没崩溃过,去排查下nginx的日志,看下是否将请求打到了某个不知名IP端口上。
1月31日day16
HTTP状态码用来表示响应结果的状态,其中200是正常响应,4xx是客户端错误,5xx是服务端错误。
客户端和服务端之间加入nginx,可以起到反向代理和负载均衡的作用,客户端只管向nginx请求数据,并不关心这个请求具体由哪个服务器来处理。
后端服务端应用如果发生崩溃,nginx在访问服务端时会收到服务端返回的RST报文,然后给客户端返回502报错。502并不是服务端应用发出的,而是nginx发出的。因此发生502时,后端服务端很可能没有没有相关的502日志,需要在nginx侧才能看到这条502日志。
如果发现502,优先通过监控排查服务端应用是否发生过崩溃重启,如果是的话,再看下是否留下过崩溃堆栈日志,如果没有日志,看下是否可能是oom或者是其他原因导致进程主动退出。如果进程也没崩溃过,去排查下nginx的日志,看下是否将请求打到了某个不知名IP端口上。
展开
评论
点赞
#青训营笔记创作活动#
1月29日day15
1.注释尽可能全面,写有意义的方法注释
2.项目拆分合理的目录结构
3.不在循环里远程调用、或者数据库操作,优先考虑批量进行。
4.封装方法形参
5.封装通用模板
6.封装复杂的逻辑判断条件
7.保持优化性能的嗅觉
8.可变参数的配置化处理
9.会总结并使用工具类。
10.控制方法函数复杂度
11. 在finally块中对资源进行释放
12. 把日志打印好
13. 考虑异常,处理好异常
14. 考虑系统、接口的兼容性
15. 代码采取措施避免运行时错误
1月29日day15
1.注释尽可能全面,写有意义的方法注释
2.项目拆分合理的目录结构
3.不在循环里远程调用、或者数据库操作,优先考虑批量进行。
4.封装方法形参
5.封装通用模板
6.封装复杂的逻辑判断条件
7.保持优化性能的嗅觉
8.可变参数的配置化处理
9.会总结并使用工具类。
10.控制方法函数复杂度
11. 在finally块中对资源进行释放
12. 把日志打印好
13. 考虑异常,处理好异常
14. 考虑系统、接口的兼容性
15. 代码采取措施避免运行时错误
展开
评论
点赞
#青训营笔记创作活动#
1月28日day14
从计算机网络对网络原理进一步的理解加深
数据传输方式:电路交换、报文交换、分组交换
1月28日day14
从计算机网络对网络原理进一步的理解加深
数据传输方式:电路交换、报文交换、分组交换
评论
点赞
#青训营笔记创作活动#
1月26日day13
一套流程看下去
《自顶向下深入剖析MySQL整体架构!》
《一条SQL语句从诞生至结束的多姿多彩历程!》
《库表设计篇:五大范式、BC范式与反范式详解!》
《MySQL索引分类与B+树索引的深入思考与原理剖析》
《MySQL-MVVC并发控制与行锁、表锁、间隙锁机制探讨》
《MySQL事务篇:ACID原则与事务机制深入剖析》
《InnoDB与MyISAM存储引擎的技术内幕》
《MySQL日志篇之undo-log、bin-log、redo-log等傻傻分不清!》
《MySQL内置函数与常用命令大全!》
《SQL优化篇之如何成为一个写SQL的高手!》
《单机MySQL索引、表结构优化及激进调优方案详解》
《MySQL高可用篇之主备读写分离与数据一致性思考》
《MySQL高可用篇之双主双写多活架构剖析!》
《MySQL在海量数据下分库分表的正确姿势》
《MySQL分库分表之MyCat中间件实战》
《MySQL分库分表之Sharding-JDBC实战》
《MySQL分库分表后产生的分布式事务问题!》
《MySQL慢查询、死锁、数据错乱等线上问题排查指南!》
《MySQL8.x新版本的特性及与MySQL5.x版本之间的差异!》
1月26日day13
一套流程看下去
《自顶向下深入剖析MySQL整体架构!》
《一条SQL语句从诞生至结束的多姿多彩历程!》
《库表设计篇:五大范式、BC范式与反范式详解!》
《MySQL索引分类与B+树索引的深入思考与原理剖析》
《MySQL-MVVC并发控制与行锁、表锁、间隙锁机制探讨》
《MySQL事务篇:ACID原则与事务机制深入剖析》
《InnoDB与MyISAM存储引擎的技术内幕》
《MySQL日志篇之undo-log、bin-log、redo-log等傻傻分不清!》
《MySQL内置函数与常用命令大全!》
《SQL优化篇之如何成为一个写SQL的高手!》
《单机MySQL索引、表结构优化及激进调优方案详解》
《MySQL高可用篇之主备读写分离与数据一致性思考》
《MySQL高可用篇之双主双写多活架构剖析!》
《MySQL在海量数据下分库分表的正确姿势》
《MySQL分库分表之MyCat中间件实战》
《MySQL分库分表之Sharding-JDBC实战》
《MySQL分库分表后产生的分布式事务问题!》
《MySQL慢查询、死锁、数据错乱等线上问题排查指南!》
《MySQL8.x新版本的特性及与MySQL5.x版本之间的差异!》
展开
评论
点赞
#青训营笔记创作活动#
1月24日day12
抓包baidu的数据包
HTTPS会对HTTP的URL和Request Body都进行加密,因此直接在filter栏进行过滤http.host == "baidu.com"会一无所获。
HTTPS握手的过程中会先通过非对称机密去交换各种信息,其中就包括3个随机数,再通过这三个随机数去生成对称机密的会话秘钥,后续使用这个会话秘钥去进行对称加密通信。如果能获得这三个随机数就能解密HTTPS的加密数据包。
三个随机数,分别是客户端随机数(client random),服务端随机数(server random)以及pre_master_key。前两个,是明文,第三个是被服务器公钥加密过的,在客户端侧需要通过SSLKEYLOGFILE去导出。
通过设置SSLKEYLOGFILE环境变量,再让curl或chrome会请求HTTPS域名,会让它们在调用TLS库的同时导出对应的sslkey文件。这个文件里包含了三列,其中最重要的是第二列的client random信息以及第三列的pre_master_key。第二列client random用于定位,第三列pre_master_key用于解密。
1月24日day12
抓包baidu的数据包
HTTPS会对HTTP的URL和Request Body都进行加密,因此直接在filter栏进行过滤http.host == "baidu.com"会一无所获。
HTTPS握手的过程中会先通过非对称机密去交换各种信息,其中就包括3个随机数,再通过这三个随机数去生成对称机密的会话秘钥,后续使用这个会话秘钥去进行对称加密通信。如果能获得这三个随机数就能解密HTTPS的加密数据包。
三个随机数,分别是客户端随机数(client random),服务端随机数(server random)以及pre_master_key。前两个,是明文,第三个是被服务器公钥加密过的,在客户端侧需要通过SSLKEYLOGFILE去导出。
通过设置SSLKEYLOGFILE环境变量,再让curl或chrome会请求HTTPS域名,会让它们在调用TLS库的同时导出对应的sslkey文件。这个文件里包含了三列,其中最重要的是第二列的client random信息以及第三列的pre_master_key。第二列client random用于定位,第三列pre_master_key用于解密。
展开
评论
点赞
#青训营笔记创作活动#
1月23日day11
1、规范命名
2、规范代码格式
3、写好代码注释
4、try catch 内部代码抽成一个方法
5、方法别太长
6、抽取重复代码
7、多用return
8、if条件表达式不要太复杂
9、优雅地参数校验
10、统一返回值
11、统一异常处理
12、尽量不传递null值
13、尽量不返回null值
14、日志打印规范
15、统一类库
16、尽量使用工具类
17、尽量不要重复造轮子
18、尽量使用聚合/组合代替继承
19、类和方法单一职责
20、使用设计模式优化代码
21、不滥用设计模式
22、面向接口编程
23、经常重构旧的代码
24、null值判断
25、pojo类重写toString方法
26、魔法值用常量表示
27、资源释放写到finally
28、使用线程池代替手动创建线程
29、线程设置名称
30、涉及线程间可见性加volatile
31、考虑线程安全问题
32、慎用异步
33、减小锁的范围
34、有类型区分时定义好枚举
35、远程接口调用设置超时时间
36、集合使用应当指明初始化大小
37、尽量不要使用BeanUtils来拷贝属性
38、使用StringBuilder进行字符串拼接
39、@Transactional应指定回滚的异常类型
40、谨慎方法内部调用动态代理的方法
41、需要什么字段select什么字段
42、不循环调用数据库
43、用业务代码代替多表join
44、装上阿里代码检查插件
45、及时跟同事沟通
1月23日day11
1、规范命名
2、规范代码格式
3、写好代码注释
4、try catch 内部代码抽成一个方法
5、方法别太长
6、抽取重复代码
7、多用return
8、if条件表达式不要太复杂
9、优雅地参数校验
10、统一返回值
11、统一异常处理
12、尽量不传递null值
13、尽量不返回null值
14、日志打印规范
15、统一类库
16、尽量使用工具类
17、尽量不要重复造轮子
18、尽量使用聚合/组合代替继承
19、类和方法单一职责
20、使用设计模式优化代码
21、不滥用设计模式
22、面向接口编程
23、经常重构旧的代码
24、null值判断
25、pojo类重写toString方法
26、魔法值用常量表示
27、资源释放写到finally
28、使用线程池代替手动创建线程
29、线程设置名称
30、涉及线程间可见性加volatile
31、考虑线程安全问题
32、慎用异步
33、减小锁的范围
34、有类型区分时定义好枚举
35、远程接口调用设置超时时间
36、集合使用应当指明初始化大小
37、尽量不要使用BeanUtils来拷贝属性
38、使用StringBuilder进行字符串拼接
39、@Transactional应指定回滚的异常类型
40、谨慎方法内部调用动态代理的方法
41、需要什么字段select什么字段
42、不循环调用数据库
43、用业务代码代替多表join
44、装上阿里代码检查插件
45、及时跟同事沟通
展开
评论
点赞