Redis 共支持五种数据类型,string、hash、list、set、zset , Redis reference resources —> go 🍑
String 类型是 redis 最基本的类型,string 类型是二进制安全的。意思是 redis 的 string 的 value 可以包含任何数据。比如jpg图片或者序列化的对象
value 也可以是数字。String在redis内部存储默认就是一个字符串,被redisObject 所引用,当遇到 incr, decr 等操作时会转成数值型进行计算,此时redisObject的encoding字段为int。
可以是字符串(简单的字符串、复杂的字符串(例如JSON、XML))、数字(整数、浮点数),甚至是二进制(图片、音频、视频),但是值最大不能超过 512MB
String 是最常用的一种数据类型,普通的key/value存储都可以归为此类,这里就不所做解释了。
Redis Hash 对应Value内部实际就是一个HashMap,实际这里会有2种不同实现,这个Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value redisObject的encoding为 zipmap , 当成员数量增大时会自动转成真正的HashMap,此时encoding为 ht。
hash特别适用于 存储对象,将一个对象存储在hash类型中会 占用更少的内存,并且可以方便的存取整个对象。
假设有多个用户及对应的用户信息,可以用来存储以用户ID为key,将用户信息序列化为比如json格式做为value进行保存。
Redis列表是 简单的字符串列表 , 简单的说就是一个链表或者说是一个队列。可以从头部或尾部向Redis列表添加元素。列表的最大长度为 2^32 - 1,也即每个列表支持超过 40亿 个元素。
Redis list 的实现为一个双向链表,即可以 支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。
Redis list 的应用场景非常多,也是Redis最重要的数据结构之一,比如 twitter 的关注列表、粉丝列表等都可以用Redis的list结构来实现,再比如有的应用使用Redis的list类型实现一个简单的轻量级消息队列,生产者 lpush,消费者 lpop/brpop。
Redis 的 Set 是 string 类型的。和列表一样,在执行插入和删除和判断是否存在某元素时,效率是很高的。集合最大的优势在于可以进行 交集、并集、差集 操作。
set 的内部实现 是一个value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。
Set 用来保存多个的字符串元素,但和列表 list 类型不一样的是,集合中不允许有重复元素 (不可重复) ,并且集合中的元素是无序的 (无序集合) ,不能通过索引下标获取元素 (没有下标) 。
Redis set 对外提供的功能与 list 类似是一个列表的功能,特殊之处在于 set 是可以 自动排重 的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。
又或者在微博应用中,每个用户关注的人存在一个集合中,就很容易实现求两个人的共同好友功能 👬 。
Redis zset 和 set 一样也是 string 类型元素的集合,不允许重复的成员。不同的是每个元素都会关联一个 double 类型的分数。zset插入 是有序的 redis正是通过score (分数) 来为集合中的成员进行从小到大的排序。
Redis sorted Set 是通过hashmap存储,key对应set的元素,value是空对象 sortset 是怎么存储并实现排序的呢,hashmap 存储,还加了一层跳跃表 (SkipList)
HashMap 里放的是成员的 score 映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的 score ,使用跳跃表的结构可以获得比较高的查找效率
Redis有序集合添加、删除和测试的时间复杂度均为O(1)(固定时间,无论里面包含的元素集合的数量)。列表的最大长度为 2^32- 1 元素(4294967295,超过40亿每个元素的集合)。
Redis sorted set 的使用场景与set类似,区别是 set 不是自动有序的,而 Sorted Set 可以给用户额外提供一个优先级( score )的参数来为成员排序,并且是插入有序的,即自动排序。
当你需要一个有序的并且不重复的集合列表,那么可以选择 sorted set 数据结构,比如 twitter 的 public timeline 可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。
又比如用户的积分排行榜需求就可以通过 有序集合 实现。还有上面介绍的使用 List 实现轻量级的消息队列,其实也可以通过 Sorted Set 实现有优先级或按权重的队列。