String: 一般做一些复杂的计数功能的缓存
List: 做简单的消息队列的功能
Hash: 单点登录
Set: 做全局去重的功能
SortedSet: 做排行榜应用,取TopN操作;延时任务;做范围查找
1、StringString的数据结构为简单动态字符串(Simple Dynamic String,缩写SDS),是可以修改的字符串。内部结构实现类似Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。
如图所示,内部为当前字符串实际分配的空间capacity,一般要高于实际字符串长度len。当字符串长度小于1M时,扩容都是加倍现有的空间;如果超过1M,扩容时一次只会多扩容1M的空间。需要注意的是字符串最大查高度为512M
2、列表(list)redis列表是简单的字符串列表,按照插入顺序排序,可以添加一个元素到列的头或者尾。它的底层是一个双向链表,对两端的操作性能很高,但通过索引操作中间的节点性能较差。
数据结构
List的数据结构是快速链表quickList. 首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是zipList,也即压缩列表. 它将所有的元素紧挨着一起存储,分配的是一块连续的内存。当数据量较多时会改为quickList. 因为普通链表需要的附加指针空间太大,会比较浪费空间,redis将链表和ziplist结合起来组 成了quickList.也就是将多个ziplist使用双向指针串起来使用。这样既满足了快速的插入删除 功能,又不会出现太大的冗余。
如下图:
3、hash
redis hash是一个键值对集合
redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象,类似Java中的Map
数据结构
hash类型对应的数据结构是两种:ziplist(压缩列表),hashtable(哈希表)。当filed-value 长度较短且个数较少时,使用ziplist,否则使用hashtable.
4、setredis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现数据重复时,set是一个很好的选择。并且set集合提供了判断某个成员是否在集合内的接口,这也是list不具有的
redis set是string类型的无序集合。它底层是一个value为null的hash表,所以增删改查的复杂度都是O(1)
5、zsetredis有序集合zset和普通集合set很相似,也是一个没有重复元素的字符串集合。
不同之处是有序集合的每个成员都关联了一个评分或者叫权重(score),这个评分被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但评分是可以重复的。
因为元素是有序的,所以可以很快根据评分或者次序来获取一个范围的元素。访问有序集合的中间元素也很快,因此有序集合可以作为一个没有重复数据的列表。
数据结构
SortedSet(zset)是redis提供的一个非常特别的数据结构,一方面它等价于java的 Map
zset底层使用了两个数据结构: hash:hash的作用就是关联元素value和权重score,保障value的唯一性,可以通过value找 到对应的score 跳跃表:跳跃表的目的在于给value排序,根据score的范围获取元素列表



