正文
前面我们说了简单动态字符串(SDS)、双端链表、字典、压缩列表、整数集合等等
Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象,每种对象都用到了至少一种我们前面所介绍的数据结构。
![](https://img.haomeiwen.com/i17512852/a6e1eff487c869d7.png)
问题:Redis中对象共享是什么样子的,如何节约内存?
假设键A创建了一个包含整数值100的字符串对象作为值对象。如果这时键B也要创建一个同样保存了整数值100的字符串对象作为值对象。Redis服务器会这么做:
(1)将数据库键的指针指向一个现有的值的对象
(2)将被共享的值对象的引用计数增一
image.png
为什么Redis不共享包含字符串的对象?
当服务器考虑将一个共享对象设置为键的值对象时,程序需要先检查给定的共享对象和键想创建的目标对象是否完全相同,只有在共享对象和目标对象完全相同的情况下,程序才会将共享对象用作键的值对象,而一个共享对象保存的值越复杂,验证共享对象和目标对象是否相同所需的复杂度就会越高,消耗的CPU时间也会越多.
对象的空转时长是啥?
当前时间减去键的值对象的lru(最后一次访问时间)时间计算出来的
如果服务器打开了maxmemory选项,并且服务器用于回收内存的算法为volatile-lru 或者allkeys-lru,那么当服务器占用的内存数超过了maxmemory选项所设置的上限值时,空转时长较高的那部分键会优先被服务器释放,从而回收内存。
网友评论