Run-dream Blog

Try Catch Finally

可见性、原子性和有序性傻傻搞不明白

基本定义 最开始接触这三个定义,还是大学里写 java 的时候,先简单看一下概念。这三个特性是用来保证并发安全的。 原子性(Atomicity) 一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。 由于程序的执行机制,只有底层的指令才天然的有原子性,比如 i ++ 转换为汇编以后发现其实是有三条语句,并不满足原子性。 ...

从koa到egg.js到midway.js

从KOA开始 KOA 是什么? KOA 从设计理念上来说并不是一个完整的应用程序框架,相反更多的可以视为是 node.js 的 http 模块的抽象。 KOA 源码分析 我们从使用的角度入手, const Koa = require('koa'); const app = new Koa(); // middleware app.use(async (...

Http相关的协议

HTTP HTTP 即 (HyperText Transfer Protocol) 超文本传输协议。 用途: 为 Web 浏览器与 Web 服务器之间的通信而设计的,但也可以用于其他目的,比如grpc就使用了http2.0作为传输协议。 组成: 服务端 客户端 传输协议 TCP 报文 起始行 ...

精进(3)

Summary 看到有好友在看这本书,然后加上之前看过他的第一本书,所以看了一下。 主要是一些工作方法论的东西,也可以讲是一些知易行难的点。 比较有意思的是他将计算机学科里的一些东西迁移到认知学里来。 Notes 摘抄一些可能对我有用的方法: 如何提升专注力 重要性区分 创造简单的环境(比如立刻把游戏卸载掉) 如何调整认知负荷 扫雷读书法 中间转换创作法 (类比) ...

终身成长

理论 两种思维模式 从潜意识或者信念的角度来说, 固定型思维认为能力是固定的 有些东西你生来没有,以后也不会有 而成长型思维则认为能力可以在实践中成长。 人的正确思想是从哪里来的?是从天上掉下来的吗?不是。是自己头脑里固有的吗?不是。人的正确思想,只能从社会实践中来,只能从生产斗争、阶级斗争和科学实验这三项实践中来。 两种类型的人追求的价值是不一致的。 固...

跳表的go语言实现

跳表是什么? 顾名思义,跳表就是 跳 + 表,也就是 多级索引 + 链表。设计的目的是为了解决链表的快速查询的问题。 设计的基础思路就是将多层链表的思想运用到链表上,但是和二叉查找不同的地方在于跳表的索引是基于概率的。 具体的说: 假设现在有一个链表,需要查找到某个值为k的节点。只能遍历整个链表,时间复杂度为 O(n)。 在链表上让每相邻两个节点增加一个指针,让指针指向下下...

从nodejs到redis

从单线程模型说起 真的只是单线程吗? 我们知道 Node.js 和 Redis 都是部分基于单线程模型的。 具体来说, Node.js 只有一个 JavaScript 线程,但是在libuv中仍然存在多个I/O线程。 而 Redis 对核心网络模型和键值的读写是单线程的。Redis v4.0 为了解决删除超大的键值对引起的阻塞问题,引入多线程处理异步任务。Redis v6.0 正式在...

当我们在谈论git时,我们在谈论什么

什么是 Git 简而言之,Git 是一种分布式版本控制系统。 和集中式的版本控制系统 SVN 进行比较,分析这两个关键词: 版本控制 SVN是增量式的版本控制,它不会把各个版本的副本都完整的保存下来,而只会记录下版本之间的差异(diff),然后按照顺序更新或者恢复特定版本的数据。这使得服务端的存储量会非常低。 而Git 是基于快照的版本控制,其实现原...

索引和倒排索引

MySql 索引 索引类似于查字典时,根据页码可以快速的找到整页的数据。 InnoDB的每个索引对应一颗B+树,表本身就是以主键为索引的B+树。节点的大小是页的大小。 因此,索引可以分为两类: 聚集索引 主键,包含了整列的数据 二级索引 非主键索引的叶子节点内容是主键的值。 因此通过非主键索引的查询需要多搜索一次表,这...

Linux虚拟化和容器化

虚拟化 目的 解决资源大小不灵活,资源申请不灵活,资源复用不灵活的问题 方式 完全虚拟化 虚拟化软件会模拟假的 CPU、内存、网络、硬盘,导致的问题是慢 硬件辅助虚拟化 CPU 新增虚拟机状态的标志位,直接在在 CPU 上执行大部分的指令,不需要虚拟化软件在中间转述,除非遇到特别敏感的指令,才需要将标志位设为物理机内核态运行,这...