您的位置:首页 > 理论基础 > 数据结构算法

Redis知识总结--五种基础数据结构

2018-10-18 14:19 651 查看

string

string应该是redis最常被用到的数据结构,简单的get、set即可操作。

为了避免内存空间不够造成频繁扩容,通常会分配一块大于value长度的内存空间,空间大小使用capicity表示,value长度使用length表示,capicity>length,底层实现是类似java的ArrayList数据结构,因此是可变的,当value小于1M时,扩容会加倍现有空间,大于1M时,扩容只会增加1M的空间,最多只能占用512M的空间

实践中通常会使用setnx和expire的结合使用来实现简单的分布式锁,但这种锁是悲观锁,实际业务场景下需要对被阻塞的业务线程做额外的处理,此外虽然是字符串,但也可以直接保存数字类型,并使用incr、incrby命令对value进行自增操作。

list

作用类似java的ArrayList,但底层使用的是quickList数据结构,既可以使用命令模拟数据结构中的队列(先进先出),也可以模拟栈(先进后出)。

由于使用了LinkedList,队列的修改时间复杂度为O(1),但遍历时间复杂度为O(n),使用时需要注意。 由于LinkedList比较占空间,redis针对此结构做了优化,当list较小时,redis使用的是zipList--列表元素使用一整块连续的内存空间,当超过一定大小时,redis会用双向链表将多个zipList链接起来,这种数据结构被称为quickList

hash

hash的实现类似java的HashMap,都是数组+链表的底层实现。

值得一提的是redis对rehash操作进行了优化,不同于jdk中的一次性全部rehash完毕,redis使用的渐进式的rehash策略,即陆续rehash,同时不阻塞主线程的运行。

set

set可以看做value为null的hash,不能重复且无序

zset

即有序set,可以通过相关命令对设置的score进行排序。

zset底层使用的是skipList结构,此结构可以看做一个多层链表,最底层包括所有元素,倒数第二层包括所有元素中的部分元素,倒数第三层又包括倒数第二层中的部分元素等等,这样进行查找或修改操作时,从顶层开始然后逐级向下查找,会提高操作效率,是比较典型的以空间换时间的解决方案。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Redis