1. Hash
Dict的实现,冲突链表,当链表load高时,rehash
2. ziplist
在一块连续内存存放data, data前后各一个字段记录前后data的长度(相当于双向链表),这个长度是可变长编码的;
优点:没有内存碎片;省去前后指针;
缺点:在ziplist中间插入数据时,需要把插入位置后面的所有data以此往后挪(深拷贝);
使用场景:链表数据比较短;节点比较少;
所以,Redis里,hset和hmset在节点个数超过512或任意value长度超过512时,转为使用Dict
3. quicklist
list的实现,普通有序双向链表+ziplist;
使用ziplist还是因为上面描述的优点;考虑到ziplist的缺点,有一个难题:
quicklist节点包含多长的ziplist合适? Redis支持根据实际场景配置
4. skiplist: sorted set的实现;
跳表level根据概率决定;
优点:对比Hash,skiplist序; 对比平衡树,实现简单, 内存更灵活,时间复杂度相当,范围查询更简单;
改进skiplist每个节点维护span(指针跨度),从而支持zrevrank、zrevrange;
sorted set还使用dict, 从而支持zscore;
当数据较少时,使用ziplist就够了;
参考:http://zhangtielei.com/posts/server.html
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。