概述
之前写四的时候把三给覆盖掉了。。。只能重写一遍了 = =
字符串优化
字符串对象是Redis内部最常用的数据类型。所有的键都是字符串类型,值对象数据除了整数之外都使用 字符串存储。比如执行命令 : lpush cache:type "redis" "memcache" "tair" "levelDB", Redis首先创建 "cache:type" 键字符串,然后创建链表对象,链表对象内再包含四个字符串对象,排除Redis内部用到的字符串对象之外至少创建5个字符串对象。可见字符串对象在Redis内部使用非诚广泛。
1.字符串结构
Redis没有采用原生C语言字符串类型而是自己实现了字符串结构,内部简单动态字符串(SDS)
Redis自身实现的字符串结构有如下特点:
O(1)时间复杂度获取:字符串长度、已用长度、未用长度;
可用于保存字节数组、支持安全二进制数据存储;
内部实现空间预分配机制,降低内存再分配次数;
惰性删除机制,字符串减后的空间不释放,作为预分配空间保留;
2.预分配机制
阶段1 字符串对象内存
阶段2 追加50字节字符串对象作为预留空间,而且大量追加操作需要内存重新分配,造成内存碎片率mem_fragmentation_ratio 上升。
接下来直接插入与阶段2相同数据的空间占用:
阶段3 直接插入同等数据后,相比阶段2节省了每个字符串对象预分配的空间,同时降低了碎片率。
字符串之所以采用预分配的方式是防止修改操作需要不断重分配内存和字节数据拷贝。但同样会造成内存浪费。字符串预分配每次并不都是翻倍扩容,空间预分配规则则如下
1.第一次创建len属性等于数据实际大小,free等于0,不做分配;
2.修改后如果已有free空间不够且数据小于1M,每次预分配一倍容量。如原有len=60byte,free = 0 ,再追加60byte,预分配120byte ,
总占用空间: 60byte + 60 byte + 120 byte + 1byte .
3. 修改后如果已有free空间不够且数据大于1MB,每次预分配1MB数据。如原有len=3MB ,free=0,当再追加100byte,预分配1MB,总占用空间:1MB + 100 byte + 1MB + 1byte .
3.字符串重构
不一定把每份数据作为 字符串整体存储,像json这样的数据可以使用hash结构,使用二级结构存储也能帮我们节省内存。同时可以使用hmget/hmset/支持字段部分读取修改,而不用 每次整体读取。
最后
以上就是忧伤含羞草为你收集整理的Redis开发与运维之第八章理解内存(三)的全部内容,希望文章能够帮你解决Redis开发与运维之第八章理解内存(三)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复