获得徽章 1
- #青训营笔记创作活动#
2月9日,打卡day28
实际上group by、having这些语句,更多的要配合一些聚合函数使用,如min()、max()、count()、sum()、avg()....,这样才能更符合业务需求,但对于聚合函数后面再介绍,先简单说说where、having的区别:
这两个关键字都是用来做条件过滤的,但where优先级会比group by高,因此当分组后需要再做条件过滤时,就无法使用where来做筛选,而having就是用来对分组后的结果做条件过滤的。查询语句中的各类关键字执行优先级为:from → where → select → group by → having → order by。
展开评论点赞
2月8日,打卡day27
#青训营笔记创作活动#
怎么得到pre_master_key
服务器私钥不是谁都能拿到的,所以问题就变成了,有没有办法从客户端那拿到这个pre_master_key。
有的。
客户端在使用HTTPS与服务端进行数据传输时,是需要先基于TCP建立HTTP连接,然后再调用客户端侧的TLS库(OpenSSL、NSS)。触发TLS四次握手。
这时候如果加入环境变量SSLKEYLOGFILE就可以干预TLS库的行为,让它输出一份含有pre_master_key的文件。这个文件就是我们上面提到的/Users/xiaobaidebug/ssl.key。
展开评论点赞- 2月7日打卡day26
#青训营笔记创作活动#
实际使用场景中,对于一致性要求不是特别高、且并发量不是特别大的场景,可以选择基于数据库事务保证的先更新数据库再更新/删除缓存。而对于并发要求较高、且数据一致性要求较好的时候,推荐选择先更新数据库,再删除缓存,并结合删除重试 + 补偿逻辑 + 缓存过期TTL等综合手段。
展开评论点赞 - #青训营笔记创作活动#
2月6日,打卡day25
数据库分表
水平分表
垂直分表
取模方案、range范围方案、hash取模和range方案结合
展开评论点赞 - #青训营笔记创作活动#
2月5日,打卡day24
回退重新开始执行
在一些复杂的链路中,方法调用很长,手一抖结果代码又运行了几行,这个时候想去重新开始执行这个断点怎么办?
常规操作是再模拟发出个请求,重新进入断点; 但其实Idea已经提供了对应的方式,直接撤回当前的帧即可,断点会重新进入方法开始执行。
如果说debug到一半发现可能会往数据库写入脏数据,想直接停止当前的调试,怎么做?
同样在帧的位置,右键,可以提前返回不继续运行,这个提前返回是针对当前的方法的,也可以直接抛出异常;展开评论点赞 - #青训营笔记创作活动#
2月4日,打卡day23
也就是说,知道 p就能加密,知道 q就能解密。
而这里的p就是公钥,q就是私钥。
用公钥加密过的密文只有用私钥才能解密。
且更妙的是。p和q其实在公式里位置是可以互换的,所以反过来说“用私钥加密过的密文,只有公钥才能解密”,也是ok的。而这种操作,就是常说的验证数字签名
展开评论点赞 - #青训营笔记创作活动#
2月3日,打卡day22
payload data字段:这里存放的就是真正要传输的数据,在知道了上面的payload长度后,就可以根据这个值去截取对应的数据。
评论点赞 - #青训营笔记创作活动#
2月2日,打卡day21
添加
在数组对象形式中我们需要给一个父节点添加一个子节点我们首先需要拿到这个父节点的key,然后对整个数组结构进行遍历查找来找到对应的item拎出来push进他的children中,然后需要重新构造一个新的数组对象。
由于实在是太麻烦了我就列了大概思路,相信大家都会,我们会发现非常繁琐,接下来我会着重讲一下Map形式。
展开评论点赞 - #青训营笔记创作活动#
2月1日,打卡day20
// 切换前后摄像头
function switchCamera(val: number) {
let constraints = {
video: true, // 开启默认摄像头
audio: true,
}
constraints.video = {
// 强制切换前后摄像头时,当摄像头不支持时,会报一个OverconstrainedError[无法满足要求的错误]
facingMode: { exact: val === 1 ? 'user' : 'environment' },
// 也可以这样当前后摄像头不支持切换时,会继续使用当前摄像头,好处是不会报错
// facingMode: val === 1 ? 'user' : 'environment',
}
navigator.mediaDevices
.getUserMedia(constraints)
.then((stream) => {
ElMessage.success('切换成功')
playLocalStream(stream)
})
.catch((err) => {
ElMessage.error('你的设备不支持切换前后摄像头')
})
}
switchCamera(1) // 切换前置摄像头展开评论点赞 - #青训营笔记创作活动#
1月31日,打卡day19
在使用Redis分布式锁的时候,我们都知道它是依靠setnx指令,在CAS的操作时同时给指定的key设置了过期时间,我们限流的主要目的就是为了在单位时间内有且仅有N个数量的请求能够访问我们的程序。因此依靠setnx可以做到这方面。例如我们需要在5秒内限定10个请求,那么我们在setnx的时候可以设置过期时间为5,当请求的setnx数量达到10个的时候就达到了限流效果。这种做法的弊端是很多的,例如当统计1到5秒的时候,但无法统计2到6秒之内,如果需要统计N秒内的M个请求,那么在Redis中需要保持N个key问题。
展开评论点赞