字符串(String):

字符串是Redis最简单的数据结构,redis的所有key都是字符串类型,然后通过这个key获取不同的Value,不同类型的数据结构差别在于Value的结构不一样。

字符串的使用很广泛,例如我们可以通过序列化用户信息存到字符串里面,key可以是用户ID值,取得时候在反序列化。

Redis的字符串类似于JAVA中的ArrayLIst,都是采用预先分配冗余的空间来减少频繁的内存分配。当字符串大小小于1M时,扩容会扩充一倍的空间,大于1M时,每次扩容1M。单个字符串最大长度为512M。

redis设置list长度 redis list大小_redis

列表(List):

Redis的列表相当于我们JAVA中的LinkedList,它是链表不是数组,所以它的增删比较快,时间复杂度为o(1),查询比较慢,时间复杂度为o(n)。
当列表的最后一个元素被弹出,列表会被回收。

字典(hash):

Redis中的hash类似于JAVA中的HashMap,数据结构也是数组+链表(jdk1.8以后,java会变成红黑树+数组),Redis字典的值只能是字符串,这一点也很不同。

hashMap的rehash过程和redis字典的rehash过程不一样,hashMap的rehash过程自己百度了解一下,为什么要rehash,什么时候rehash,rehash过程是什么样子的。

字典的rehash采用渐变式rehash策略,会在rehash过程中保留新旧两个hash结构,查询时也会同时查询两个hash结构,在后续的定时任务中,会慢慢的将旧的hash内容迁入到新的hash。

redis设置list长度 redis list大小_字符串_02

Hash也可以用来存储用户信息,用户信息的每一个字段当做key,value值就是字段所对应的值,这样我们可以想取那一部分信息就去那一部分信息。
集合(set):集合类似于JAVA中的hashSet,它内部的键值对是唯一且无序的,所以具有去重功能。

有序列表(zset):

有序列表类似于java的sortedSet和hashMap的结合版,它保证value值唯一,也可以给value一个排序值,它的内部实现是跳跃列表,这里简单介绍一下。

redis设置list长度 redis list大小_redis设置list长度_03

我们插入一个值时,要保证它的有序性,会根据它的排序值找到位置,因为有序列表是链表结构,不能使用二分查找等等,所以采用跳跃列表来实现。
跳跃列表最底层的元素会串起来,每隔几个元素挑选一个代表出来,这几个代表再用另外一个指针串起来,然后再挑出代表。比如有人要去你老家,你可能来自XX村,总不能这个人把中国所有村遍历一下。你肯定会说来自XX省->XX市->XX县->XX镇->XX村,跳跃列表的思路就是这样类似,这样就可以很快定位到你的位置。