申请Redis资源时,总需要考虑该申请多大内存空间的实例。该如何评估呢?我们先从Go语言中计算某个类型的对象占用内存的空间说起
下面是一个对象声明,我们可以通过Go官方提供的方来来计算对象占用的空间。但这其实计算的是第一层结构占用的空间,如果结构体内部有指针的话,还需要考虑实际指针实际指向的类型大小。
type Live struct {
TeacherId int64
Name string
Status *int64
}
size := unsafe.Sizeof(Live{})
64位系统上,int64占8个字节、string占用16个字节、指针占用8个字节,最终计算对象占用的内容空间位32个字节。其中的Status是指针类型,实际上还需要考虑指针实际数据的占用空间。
string类型也是一个指针类型,它内部保存的实际数据的地址,所以,通过这种评估方式,也没有将string的内容大小考虑在内。unsafe.Sizeof 计算的仅仅是这个类型占用空间的大小。
重点来了,评估内存占用空间不仅仅要考虑实际内容的大小,还要考虑内存中类型本身占用空间的大小。
Redis中为了节省内存空间占用,不同的大小底层有不同的类型实现,考虑的时候就是
占用内存的大小 = 数据类型的大小 + 实际数据的大小 占用内存的大小 = 数据类型的大小 + 实际数据的大小 占用内存的大小=数据类型的大小+实际数据的大小
具体Redis的数据类型大家可以查看相关博客