一、有序集合对象(Zset)对应的底层数据的编码类型
- OBJ_ENCODING_ZIPLIST:使用压缩列表实现的有序集合对象。
- OBJ_ENCODING_SKIPLIST:使用跳跃表和字典实现的有序集合对象。
二、编码转换
当有序集合对象可以同时满足以下两个条件时, 对象使用 ziplist 编码:
1、有序集合保存的元素数量小于 128 个; 2、有序集合保存的所有元素成员的长度都小于 64 字节;
不能满足以上两个条件的有序集合对象将使用 skiplist 编码。
注意: 以上两个条件的上限值是可以修改的, 具体请看配置文件中关于 zset-max-ziplist-entries 选项和 zset-max-ziplist-value 选项的说明。
三、有序集合命令的实现
因为有序集合键的值为有序集合对象, 所以用于有序集合键的所有命令都是针对有序集合对象来构建的, 表 8-11 列出了其中一部分有序集合键命令, 以及这些命令在不同编码的有序集合对象下的实现方法。
| 命令 | ziplist编码的实现方法 | zset编码的实现方法 | 
|---|---|---|
| ZADD | 调用 ziplistInsert函数, 将成员和分值作为两个节点分别插入到压缩列表。 | 先调用 zslInsert函数, 将新元素添加到跳跃表, 然后调用dictAdd函数, 将新元素关联到字典。 | 
| ZCARD | 调用 ziplistLen函数, 获得压缩列表包含节点的数量, 将这个数量除以2得出集合元素的数量。 | 访问跳跃表数据结构的 length属性, 直接返回集合元素的数量。 | 
| ZCOUNT | 遍历压缩列表, 统计分值在给定范围内的节点的数量。 | 遍历跳跃表, 统计分值在给定范围内的节点的数量。 | 
| ZRANGE | 从表头向表尾遍历压缩列表, 返回给定索引范围内的所有元素。 | 从表头向表尾遍历跳跃表, 返回给定索引范围内的所有元素。 | 
| ZREVRANGE | 从表尾向表头遍历压缩列表, 返回给定索引范围内的所有元素。 | 从表尾向表头遍历跳跃表, 返回给定索引范围内的所有元素。 | 
| ZRANK | 从表头向表尾遍历压缩列表, 查找给定的成员, 沿途记录经过节点的数量, 当找到给定成员之后, 途经节点的数量就是该成员所对应元素的排名。 | 从表头向表尾遍历跳跃表, 查找给定的成员, 沿途记录经过节点的数量, 当找到给定成员之后, 途经节点的数量就是该成员所对应元素的排名。 | 
| ZREVRANK | 从表尾向表头遍历压缩列表, 查找给定的成员, 沿途记录经过节点的数量, 当找到给定成员之后, 途经节点的数量就是该成员所对应元素的排名。 | 从表尾向表头遍历跳跃表, 查找给定的成员, 沿途记录经过节点的数量, 当找到给定成员之后, 途经节点的数量就是该成员所对应元素的排名。 | 
| ZREM | 遍历压缩列表, 删除所有包含给定成员的节点, 以及被删除成员节点旁边的分值节点。 | 遍历跳跃表, 删除所有包含了给定成员的跳跃表节点。 并在字典中解除被删除元素的成员和分值的关联。 | 
| ZSCORE | 遍历压缩列表, 查找包含了给定成员的节点, 然后取出成员节点旁边的分值节点保存的元素分值。 | 直接从字典中取出给定成员的分值。 | 
四、PHP调用方法
参考:http://www.cnblogs.com/zcy_soft/archive/2012/09/21/2697006.html
