
获得徽章 14
- #一书一世界#
先不说书,先说说这个活动,感觉挺好的,一下子发现许久未曾读过专业以外的书了,有种挺可惜的感觉吧,感觉世间的百态不曾经历过就要匆匆离去了,有点低落吧。今天我想推荐的书是《大数据开创新世界》,这本书也算是专业相关的书籍,虽然和我专业相关不大,但正是因为作者较为独特的视角让我记忆深刻,其中对一些大数据应用的展望只能说是一语中的十分准确,更关键的是作者进行预测的方法虽然对现在来说技术有些落伍,但对人生未来规划确实很有帮助,可以说是受益终生,我也曾和作者深入交谈过,很有深度见解独到,也算是对我的人生起到了很大的引导和指明作用。推荐大家可以去阅读一下。展开评论3 - #一书一世界#
推荐书籍是《自私的基因》。
作为程序猿,大伙儿可能不会对这种其他学科的专业书籍感兴趣,但我被朋友安利后去看了一下,直接停不下来通宵看完一遍后又重刷了一遍,只能说超级好看,并且能引人深思,其中以基因这种接近本质的角度来分析个人行为和社会行为,只能说让人收益颇丰,虽然也不乏一些枯燥的基础概念但只能说数量在可承受的范围之内,关键是对人灵魂的升华以及待人处事方法的提升,只能说值得一看。而且春天大伙儿脑子里多多少少有些生物原始的想法,这本书从生物角度进行分析,让人了解后就渐渐失去了原始冲动,也是挺不错的贤者书籍。推荐在下午摸鱼时间或晚间阅读,有可能会困。展开评论3 - ChatGPT关联浏览器
ChatGPT逐渐在视野中出现的频率越来越高,能够便利地使用ChatGPT变得很关键,可以看一下下面这个项目,这能够很好地带大伙儿将Chrome关联ChatGPT,感兴趣的朋友可以看一下。
#你的工作会被ChatGPT取代吗#展开评论1 - #青训营笔记创作活动#
1月29日 打卡day50
今日学习
今天的内容关于反向代理。
反向代理在计算机网络中是代理服务器的一种。
服务器根据客户端的请求,从其关系的一组或多组后端服务器(如 Web 服务器)上获取资源,然后再将这些资源返回给客户端,客户端只会得知反向代理的 IP 地址,而不知道在代理服务器后面的服务器集群的存在。
在 Hertz 中使用反向代理需要拉取社区提供的 reverseproxy 拓展。
我们通过 NewSingleHostReverseProxy 函数设置了反向代理的目标路径 /proxy 。接下来注册路由的路径为反向代理目标路径的子路径 /proxy/backend ,最后通过注册 /backend 映射反向代理服务 proxy.ServeHTTP 。这样我们通过 GET 方法访问 /backend 时就会访问到 /proxy/backend 中的内容。
通过 SetErrorHandler 指定如何处理到达后台的错误,当有错误到达后台或有来自 modifyResponse 的错误时就会运行指定的处理逻辑。
Hertz 反向代理还支持在中间件中使用。
通过 Use 使用中间件,在中间件逻辑中,当 ctx.Query("country") == "cn" 逻辑成立时调用 proxy.ServeHTTP(c, ctx) 使用反向代理,此时再通过实例 r 请求 /backend 时就会请求到反向代理目标 9997 端口中的内容。
NewSingleHostReverseProxy函数如果没有设置 config.ClientOption将会使用默认的全局 client.Client 实例, 如果设置了 config.ClientOption 将会初始化一个 client.Client 实例。 如果你需要共享一个 client.Client实例,可以使用 ReverseProxy.SetClient 来设置。
反向代理会重置响应头,如果在请求之前修改了响应头将不会生效,这与标准库的行为不一致。
展开评论1 - #青训营笔记创作活动#
1月28日 打卡day49
今日学习
今天的内容关于MySQL锁。
由于现在的计算机领域几乎都是多核机器,因此再编写单线程的应用自然无法将机器性能发挥到最大,想要让程序的并发性越高,多线程技术自然就呼之欲出,多线程技术一方面能充分压榨CPU资源,另一方面也能提升程序的并发支持性。
对于锁的释放工作,MySQL自己来干,就类似于JVM中的GC机制一样,把内存释放的工作留给了自己完成。
MyISAM引擎中,获取了锁还需要自己手动释放锁,否则会造成死锁现象出现,因为如果不手动释放锁,就算事务结束也不会自动释放,除非当前的数据库连接中断时才会释放。
Meta Data Lock元数据锁,也被简称为MDL锁,这是基于表的元数据加锁,是基于.frm文件中的元数据加锁的。
自增锁,这个是专门为了提升自增ID的并发插入性能而设计的。
当对一个字段设置AUTO_INCREMENT自增后,意味着后续插入数据时无需为其赋值,系统会自动赋上顺序自增的值。
MySQL插入类型:普通插入、批量插入、混合插入。
普通插入:指通过INSERT INTO table_name(...) VALUES(...)这种方式插入。
批量插入:指通过INSERT ... SELECT ...这种方式批量插入查询出的数据。
混合插入:指通过INSERT INTO table_name(id,...) VALUES(1,...),(NULL,...),(3,...)这种方式插入,其中一部分指定ID,一部分不指定。
Record Lock记录锁,实际上就是行锁,一行表数据、一条表记录本身就是同一个含义,因此行锁也被称为记录锁。
临键锁是间隙锁的Plus版本,或者可以说成是一种由记录锁+间隙锁组成的锁。
表锁:以表为粒度,锁住的是整个表数据。
行锁:以行为粒度,锁住的是一条数据。
页锁:以页为粒度,锁住的是一页数据。
乐观锁:每次执行都认为只会有自身一条线程操作,因此无需拿锁直接执行。
悲观锁:每次执行都认为会有其他线程一起来操作,因此每次都需要先拿锁再执行。
数据库中仅存在三种类型的锁,即共享锁、排他锁、共享排他锁,共享排他锁是共享锁与排他锁的杂交类型。
展开评论1 - #青训营笔记创作活动#
1月27日 打卡day48
今日学习
今天的内容关于Traceld。
先分析一下,我们想实现的核心功能是搜索,必然是用 ES 实现,那问题就转换成如何将日志收集并存储到 ES。
日志大家都不陌生了,可以在控制台打印,也可以存入文件,那能不能直接输入 ES 呢,好像没听说过。
这里就要用到 Logstash 来收集日志,Spring 默认的日志框架 Logback 已经对其提供了支持,我们要做的只是编写配置文件。
Logstash 有个问题就是非常占用内存,所以本文后面会介绍另一个比较轻量级的日志收集工具 FileBeat ,由 Go 语言编写。
同时对于真实的线上环境为了保证吞吐量和可靠性,都会引入 Kafka 进行解耦。
安装 ES 的可视化工具。浏览器访问:http://localhost:5601/。下载logstash。配置 boot 应用的日志输出。启动应用,观看 Logstash 的控制台,会跟着打印日志,再打开 ES ,创建我们配置好的查询索引,神奇的事情发生了,日志一条一条的展示出来。下载 FileBeat 。Filebeat 是基于监控日志文件有没有新增来同步数据的,所以需要配置日志文件的目录。可以直接输出到 ES ,也可以输出到 Logstash 。启动项目,发现日志已写入文件。进入 ES 查询,同样查询到日志。
展开评论1 - #青训营笔记创作活动#
1月26日 打卡day47
今日学习
今天的内容关于SSO单点登录,包括具体实现和安全优化。
SSO单点登录具体实现通过token+redis或通过token+各个子系统一个redis。
token+redis需要授权的ticket和子系统token。
token+redis代码实现分为服务端实现和客户端实现。
客户端实现包括后台拦截器和页面拦截器。
后台拦截器包含局部会话token为空和局部绘画存在则直接放行。
全局会话:在SSO登录页面登录后,我们就认为建立起了全局会话
判定标志:SSO页面的session存在且未过期
局部会话:在各个子系统,是否已经登录过,这个我们称为局部会话
判定标志:子系统存在可行的token【未过期且有效】
ticket:SSO系统颁发给子系统的凭证,有此凭证且有效的话,表明SSO系统允许子系统去建立局部会话【生成token】
token:子系统的访问凭证,各个子系统的token是不一样的,具体视业务而定,子系统也需要配置相应的拦截器来检测token
重放攻击就是:黑客拦截了我们的请求,获得我们发给服务端的一个合法请求,然后重复的发送该合法请求,若该请求耗时过长,极端调用可能会搞崩我们的系统
一次HTTP请求从发出到到达服务器的时间是不会超过60s的,当你发送一个请求时必须携带一个时间戳timestamp,假设值为20 。
当请求发送到服务器之后,服务器会取出服务器的当前时间, 假设为 now =100, 很明显 now -timestamp>60s,那么服务器就认为请求是不合法的。
展开评论1 - #青训营笔记创作活动#
1月25日 打卡day46
今日学习
今天的内容关于MySQL底层原理。
死锁是指两个或两个以上的线程(或进程)在运行过程中,因为资源竞争而造成相互等待、相互僵持的现象。一般当程序中出现死锁问题后,若无外力介入,则不会解除“僵持”状态,它们之间会一直相互等待下去。当死锁问题出现时,MySQL会自动检测并介入,强制回滚结束一个“死锁的参与者(事务)”,从而打破死锁的僵局,让另一个事务能继续执行。在InnoDB中其实提供了锁的超时机制,也就是一个事务在长时间内无法获取到锁时,就会主动放弃等待,抛出相关的错误码及信息,然后返回给客户端。默认的锁超时时间是50s,也就是在50s内未获取到锁的事务,会自动结束并返回。那也就意味着当死锁情况出现时,这个死锁过程最多持续50s,然后其中就会有一个事务主动退出竞争,释放持有的锁资源。每当一个事务需要阻塞等待某个锁时,就会触发一次wait-for graph算法,该算法会以当前事务作为起点,然后从「锁的信息链表」中找到对应中锁信息,再去根据锁的持有者(事务),在「事务等待链表」中进行查找,看看持有锁的事务是否在等待获取其他锁,如果是,则再去看看另一个持有锁的事务,是否在等待其他锁,经过一系列的判断后,再看看是否会出现闭环,出现的话则介入破坏。在业务允许的情况下,尽量缩短一个事务持有锁的时间、减小锁的粒度以及锁的数量。
RU/读未提交级别:要求该隔离级别下解决脏写问题。写操作加排他锁,读操作不加锁。
RC/读已提交级别:要求该隔离级别下解决脏读问题。写操作加排他锁,读操作加共享锁。
RR/可重复读级别:要求该隔离级别下解决不可重复读问题。写操作加排他锁,对读操作依旧采用MVCC机制,但RR级别中,一个事务中只有首次select会生成ReadView快照。
Serializable/序列化级别:要求在该隔离级别下解决幻读问题。读-写和写-读串行执行。
展开评论1