redis 小对象压缩

redis 数据库的优化

  redis是一个内存数据库,速度高的同时也加大消耗了内存资源,为了减少内存消耗,redis做了很多优化。

32bit 和64 bit

  32bit相对于64bit有个很大的优势,就是指针空间占用很少,但是总内存不能超过4G。但是4G够了。

ziplist

  对于redis的hashmap和zset来说,如果内部元素很少,依旧使用二维结构会很浪费空间。目前有个叫做ziplist的数据结构,该结构是一个紧凑的字节数组结构,每个元素都是紧挨着的。

intset

  set集合的元素很少的时候,且都是整数的时候,会采用intset这个数据结构。这是一个紧凑的整形数组结构。如果加入了字符串就会转换为hashmap结构。

转换条件

  hash-max-ziplist-entries 512 # hash 的元素个数超过 512 就必须用标准结构存储
hash-max-ziplist-value 64 # hash 的任意元素的 key/value 的长度超过 64 就必须用标准结构存储
list-max-ziplist-entries 512 # list 的元素个数超过 512 就必须用标准结构存储
list-max-ziplist-value 64 # list 的任意元素的长度超过 64 就必须用标准结构存储
zset-max-ziplist-entries 128 # zset 的元素个数超过 128 就必须用标准结构存储
zset-max-ziplist-value 64 # zset 的任意元素的长度超过 64 就必须用标准结构存储
set-max-intset-entries 512 # set 的整数元素个数超过 512 就必须用标准结构存储

redis 垃圾回收策略

  当你从redis里面删除了1GB的key时,你会发现内存变化不大。因为操作系统回收数据是以页为单位的,即使这个页里面还有一个key,那么这个页也不会被回收。这个1Gb的key分散到各个页面。因此内存不会立即被回收。
  当然你使用flushdb这个指令,可以强制回收。redis虽然无法保证立即回收已删除key的内存,但是他会优先使用尚未被回收的空闲内存。

redis内存分配算法

  redis的内存分配是直接交给第三方库来管理,jemalloc这个facebook的第三方库来管理。因为内存管理很复杂,需要考虑到内存碎片,性能优化,效率等,为了redis的简单高效,于是使用第三方插件.