最近在面试的过程中,发现有很多同学都说用过 Redis,但是问 Redis 支持哪几种数据类型,又不是很能回答上来,特记录如下:
Redis 支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及 zset(sorted set:有序集合)。
字符串--String
string 是 redis 最简单最基本的数据结构,Redis 所有的数据结构都是以唯一的 key 作为名称,然后通过唯一的 key 值来获取对应的 value 数据。
不同类型的数据结构的差异就在于 value 的结构不一样。
string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如 jpg 图片或者序列化的对象。
字符串结构的使用非常广泛,一个常见的用途就是缓存用户信息。
我们将用户信息结构体使用 JSON 序列化成字符串,然后将序列化后的字符串,然后将序列化后的字符串塞进 Redis 来缓存。
同样的,获取用户信息会经过一次反序列化过程。
列表--List
Redis 的列表相当于 Java 中的 LinkedList,注意它是链表而不是数组。这意味着 list 的插入和删除操作会非常快,时间复杂度为 O(1),但是索引定位很慢,时间复杂度为 O(name),这点让人非常意外。
当列表弹出最后一个元素之后,该数据结构自动被删除,内存被回收。
列表可以在左右两边进行插入和删除操作。
哈希--Hash
Redis 中的字典,相当于 Java 中的 HashMap,是无序字典,内部实现结构上同 Java 的 HashMap 是一致的,同样的数组 + 链表的二维结构。
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合存储对象。
Hash 结构存储用户信息,不同于字符串一次性需要全部序列化整个对象,hash 可以对用户结构中的每个字段单独存储。
这样我们需要获取用户信息时,可以进行部分获取。如果以字符串形式保存用户信息的话,就只能一次性全部读取,这样就会比较浪费流量。
集合--Set
Redis 的集合相当于 Java 中的 HashSet,它内部的键值对是无序的唯一的。它的内部实现相当于一个特殊的字典,字典中所有的 value 都是一个值 null。
当集合中最后一个元素移除之后,数据结构自动删除,内存被回收。
set 结构可以用来存储活动中奖的用户 ID,因为有去重功能,可以保证同一个用户不会中奖两次。
有序集合--Sorted Set
zset 可能是 Redis 提供的最有特色的数据结构,它也是在面试中面试官最爱问的数据结构。
它类似于 Java 中的 SortedSet 和 HashMap 的结合体,一方面它是一个 set,保证了内部 value 的唯一性,
另一方面它可以给每个 value 赋予一个 score,代表 value 的排序权重。
zset 可以用来存粉丝列表,value 值是粉丝的用户 ID,score 是关注事件。我们可以对粉丝列表按照关注时间进行排序。
zset 也可以用来存储学生成绩,value 是学生 ID,score 是学生考试成绩。我们可以对成绩按分数进行排序就可以得到他的名字。