1.字符串
1.1 数据结构
1.int:整数值
2.raw(SDS):字符串,>32字节,
调用两次内存分配创建redisObject和sdshdr
3.embstr:字符串,<=32字节
调用一次内存分配连续空间,创建redisObject和sdshdr
浮点数3.14自动转成字符串保存
1.2 编码的转换
int转 raw, embstr只要修改了就会转raw
2.列表对象
2.1 数据结构
1.ziplist:![image](https://b3logfile.com/file/2024/05/siyuan/1715565781211/assets/image-20240428154331-5tlvjca.png)
2.linkedlist:![image](https://b3logfile.com/file/2024/05/siyuan/1715565781211/assets/image-20240428154759-rvyb5tc.png)
2.2 编码的转换
ziplist:<64字节 && <512个 否则 linkedlist
3.哈希对象
3.1 数据结构
1.ziplist:![image](https://b3logfile.com/file/2024/05/siyuan/1715565781211/assets/image-20240428155324-56r5922.png)
2.hashtable:![image](https://b3logfile.com/file/2024/05/siyuan/1715565781211/assets/image-20240428155424-agn1tky.png)
3.2 编码的转换
zpilist:<64字节 && <512个 否则 hashtable
4.集合对象
4.1 数据结构
1.inset:![image](https://b3logfile.com/file/2024/05/siyuan/1715565781211/assets/image-20240428155710-15v76qx.png)
2.hashtable:![image](https://b3logfile.com/file/2024/05/siyuan/1715565781211/assets/image-20240428155739-lrsr5lb.png)
4.2 编码的转换
inset:整数 && <512个, 否则hashtable
5.有序集合对象
5.1 数据结构
1.ziplist:![image](https://b3logfile.com/file/2024/05/siyuan/1715565781211/assets/image-20240428155937-1qpqgl7.png)
2.zset = skiplist+hashtable
![image](https://b3logfile.com/file/2024/05/siyuan/1715565781211/assets/image-20240428160155-b6xy7cr.png)
5.2 编码的转换
ziplist: <64字节 && <128个
6.类型检查与命令多态
![image](https://b3logfile.com/file/2024/05/siyuan/1715565781211/assets/image-20240428160426-31e9r4t.png)
7.内存回收
redisObject的 int refcount属性;
创建=1;使用+1;不使用-1;=0时回收;
8.对象共享
![image](https://b3logfile.com/file/2024/05/siyuan/1715565781211/assets/image-20240428161118-akii56m.png)
为什么不共享包含字符串的对象:复杂度高,只对包含整数值的字符串对象进行共享
Redis会在初始化服务器时,创建0-9999的字符串对象,后面直接共享,不再新创建
9.对象的空转时长
redisObject的 unsigned lru属性,对象最后一次被命令程序访问的时间;
作用:
1.命令 object idletime 打印 空转时长
2.服务器打开了maxmemory选项,且服务器用于回收内存的算法为volatile-lru或者allkeys-lru,那么当服务器占用的内存数超过了maxmemory设置的上限值,空转时长较高的会被优先内存释放
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于