string应该是redis最常被用到的数据结构,简单的get、set便可操做。java
为了不内存空间不够形成频繁扩容,一般会分配一块大于value长度的内存空间,空间大小使用capicity表示,value长度使用length表示,capicity>length,底层实现是相似java的ArrayList数据结构,所以是可变的,当value小于1M时,扩容会加倍现有空间,大于1M时,扩容只会增长1M的空间,最多只能占用512M的空间。redis
实践中一般会使用setnx和expire的结合使用来实现简单的分布式锁,但这种锁是悲观锁,实际业务场景下须要对被阻塞的业务线程作额外的处理,此外虽然是字符串,但也能够直接保存数字类型,并使用incr、incrby命令对value进行自增操做。api
做用相似java的ArrayList,但底层使用的是quickList数据结构,既可使用命令模拟数据结构中的队列(先进先出),也能够模拟栈(先进后出)。数组
因为使用了LinkedList,队列的修改时间复杂度为O(1),但遍历时间复杂度为O(n),使用时须要注意。 因为LinkedList比较占空间,redis针对此结构作了优化,当list较小时,redis使用的是zipList--列表元素使用一整块连续的内存空间,当超过必定大小时,redis会用双向链表将多个zipList连接起来,这种数据结构被称为quickList数据结构
hash的实现相似java的HashMap,都是数组+链表的底层实现。分布式
值得一提的是redis对rehash操做进行了优化,不一样于jdk中的一次性所有rehash完毕,redis使用的渐进式的rehash策略,即陆续rehash,同时不阻塞主线程的运行。优化
set能够看作value为null的hash,不能重复且无序ui
即有序set,能够经过相关命令对设置的score进行排序。线程
zset底层使用的是skipList结构,此结构能够看作一个多层链表,最底层包括全部元素,倒数第二层包括全部元素中的部分元素,倒数第三层又包括倒数第二层中的部分元素等等,这样进行查找或修改操做时,从顶层开始而后逐级向下查找,会提升操做效率,是比较典型的以空间换时间的解决方案。排序