2020年总结

终于、拖到了现在来整理年终总结(其实早就写得差不多)了。原计划是在年前换完工作然后就写这篇总结的,但是又有一些小插曲,所以也不得不将选择的时机放在年后了。大概也有前年出差的那段时间令我不是很愉快,具体的事情也就没有必要在这里写了。成年人的世界里没有容易的,需要做的事情就是要不断让自己成长。有一天能够有更多的主动选择权,而不是被动的选择。

查看更多

分享到 评论

内存对齐

内存对齐

内存


CPU要想从内存读取数据,需要通过地址总线,把地址传输给内存,内存准备好数据,输出到数据总线
若是32位地址总线,可以寻址[0,2的32次方-1],占用内存4g
image.png


有些CPU是能够支持访问任意地址的,它是做了很多处理,比如想从地址1读取8字节的数据,CPU会分2次读,第一次从0-7,只取后7字节,第二次从8-15,但只取第一字节。把2次结果拼接起来拿到所需数据。这样比较耗费性能,编译器会把各种类型的值安排到合适的位置,并占用合适的长度。每种类型的对齐边值就是它的对齐边界。int16(2),int32(4),内存对齐要求数据存储地址以及占用的字节数都是它对齐边界的倍数。

查看更多

分享到 评论

深入理解go map


哈希查找表一般会存在“碰撞”的问题,就是说不同的 key 被哈希到了同一个 bucket。一般有两种应对方法:链表法开放地址法链表法将一个 bucket 实现成一个链表,落在同一个 bucket 中的 key 都会插入这个链表。开放地址法则是碰撞发生后,通过一定的规律,在数组的后面挑选“空位”,用来放置新的 key。

查看更多

分享到 评论

golang 切片

golang 切片

切片是引用


切片组成元素:

  • 指针:指向底层数组
  • 长度:切片中元素的长度,不能大于容量
  • 容量:指针所指向的底层数组的总容量


初始化方式

  • 使用make
    1
    2
    slice := make([]int, 5)     // 初始化长度和容量都为 5 的切片
    slice := make([]int, 5, 10) // 初始化长度为 5, 容量为 10 的切片


使用 make 关键字创建切片时,很多工作都需要运行时的参与;调用方必须在 make 函数中传入一个切片的大小以及可选的容量,cmd/compile/internal/gc.typecheck1 会对参数进行校验:

查看更多

分享到 评论

给字符串加索引

MySQL是支持前缀索引的,前缀索引的优势就是占用的空间小,这同时带来的损失是,可能会增加额外的记录扫描次数。

查看更多

分享到 评论

2019年总结

今年的最后一段时间是在罗振宇的跨年演讲中度过的,当然不是在现场。

2019是一个有意思的一年,如在北京待的越久,似乎就越不愿意离开了。在这里认识了更多厉害的人,就会看到自己的渺小。

查看更多

分享到 评论

数据删掉一半,表的大小不变

数据库占用空间太大,把一个最大的表删掉了一半的数据,怎么表文件的大小还是没变?

查看更多

分享到 评论

分析MySQL中隐式转换导致查询结果错误及索引不可用

以下是例子

1
SELECT * FROM TABLE WHERE xxx = 11

如果列xxx确实只有11的,你是否就认为筛选出来的就一定只有xxx=11的呢?

在过滤字段为数值类型的时候,数值类型有一种隐式转换,如果是以数字开头的,包含有字符,后面的字符会被截断,只取前面的数字值。

查看更多

分享到 评论

记一次MySQL死锁排查过程

背景

大概说一下业务场景,需要定时计算一些数据,从其他系统、接口拉取达到的数据比较多,然后经计算后的值存储在本系统中。拉取的数据量可能有万左右,然后以主键存在的数据是需要更新的。不存在则插入。每次做全量更新/插入。

查看更多

分享到 评论

合适以及为何使用最少使用(LFU)缓存与Golang中的实现

[译]合适以及为何使用最少使用(LFU)缓存与Golang中的实现

在过去的这些年,参与计算机科学和工程师的人们一直在努力优化各种性质。我们生活在一个资源有限的世界里,人们一直致力于优化成本和速度的方法。

在软件工程方面而言,我认为,最流行的改善性能的就是缓存了。在许多app都有缓存,依赖于软件方面的存储,缓存背后的想法非常简单。为了加载较快,存储数据经常被用到。

查看更多

分享到 评论