目录
Redis 的 5 大基础数据类型
①字符串类型(String)
②字典类型(Hash)
③列表类型(List)
④集合类型(Set)
⑤有序集合类型(ZSet)
Redis 的 5 大基础数据类型
String——字符串类型
Hash——字典类型
List——列表类型
Set——集合类型
ZSet——有序集合类型其中最常用的是字符串和字典类型。
①字符串类型(String)
字符串类型(Simple Dynamic Strings 简称 SDS),译为:简单动态字符串,它是以键值对 key-value 的形式进⾏存储的,根据 key 来存储和获取 value 值,它的使⽤相对来说⽐较简单,但在实际项⽬中应⽤⾮常⼴泛。
字符串的使用如下:
127.0.0.1:6379> set k1 v1 # 添加数据
OK
127.0.0.1:6379> get k1 # 查询数据
"v1"
127.0.0.1:6379> strlen k1 # 查询字符串的⻓度
(integer) 2
我们也可以使⽤ ex(expires)参数来设置字符串的过期时间,如下代码所示:
127.0.0.1:6379> set k1 v1 ex 1000 # 设置 k1 1000s 后过期(删除)
OK
字符串的常见使用场景:
存放用户(登录)信息;
存放文章详情和列表信息;
存放和累计网页的统计信息。
......
②字典类型(Hash)
字典类型 (Hash) 又被称为散列类型或者是哈希表类型,它是将⼀个键值 (key) 和⼀个特殊的“哈希表”关联起来,这个“哈希表”包含两列数据:字段和值,它就相当于 Java 中的Map<String,Map<String,String>> 结构。
假如我们使用字典类型来存储⼀篇⽂章的详情信息,存储结构如下图所示:
同理我们也可以使用字典类型来存储用户信息(String),并且使用字典类型来存储此类信息就无需手动序列化和反序列化数据了,所以使⽤起来更加的方便和高效。
字典类型的使⽤如下:
127.0.0.1:6379> hset myhash key1 value1 # 添加数据
(integer) 1
127.0.0.1:6379> hget myhash key1 # 查询数据
"value1"单值hset:
多值hmset:
字典类型的数据结构,如下图所示:
通常情况下字典类型会使用数组的⽅式来存储相关的数据,但发⽣哈希冲突时才会使用链表的结构来存储数据。
③列表类型(List)
列表类型 (List) 是⼀个使⽤链表结构存储的有序结构,它的元素插⼊会按照先后顺序存储到链表结构中,因此它的元素操作 (插⼊和删除) 时间复杂度为 O(1),所以相对来说速度还是⽐较快的,但它的查询时间复杂度为 O(n),因此查询可能会⽐较慢。
扩展:
Redis的列表(List)是一种基于Reactor模式的双端队列结构,它支持在列表的一端插入元素,并在另一端弹出元素。
在Redis中,列表是通过两个指针(即表头和表尾)来维护的。当插入一个新元素时,它会被添加到表尾,而当弹出元素时,将会从表头删除。这种设计使得插入和弹出操作可以在O(1)时间复杂度内完成。
由于Redis的列表是按照插入的先后顺序进行存储的,因此最新的元素总是位于表尾,而最早插入的元素则位于表头。这意味着你可以通过使用LPUSH命令将新元素插入到表头,或者使用RPUSH命令将新元素插入到表尾。
以下是Redis的列表操作的一些常用命令:LPUSH key value:将一个或多个值插入到列表的头部。
RPUSH key value:将一个或多个值插入到列表的尾部。
LPOP key:移除并返回列表的第一个元素。
RPOP key:移除并返回列表的最后一个元素。
LLEN key:返回列表的长度。需要注意的是,Redis的列表并不是一个完全的队列结构,因为它们不支持在中间插入或删除元素。但是,你可以使用Redis的其它数据结构(如有序集合ZSet、哈希表Hash)来实现完全的队列行为。
列表类型的使⽤如下:
127.0.0.1:6379> rpush list 1 2 3 # 将新元素插入到表尾
(integer) 3
127.0.0.1:6379> lpop list # 获取并删除列表的第⼀个元素
1
列表的典型使⽤场景有以下两个:
- 消息队列:列表类型可以使⽤ rpush 实现在列表末尾添加数据的功能,同时又可以使用 lpop 轻松的弹出(查询并删除)第⼀个元素,所以列表类型可以⽤来实现消息队列;
- 文章列表:对于博客站点来说,当⽤户和⽂章都越来越多时,为了加快程序的响应速度,我们可以把用户自己的⽂章存⼊到 List 中,因为 List 是有序的结构,所以这样又可以完美的实现分页功能,从而加速了程序的响应速度。---现在这种用法几乎不存在
④集合类型(Set)
集合类型 (Set) 是⼀个无序并唯⼀的键值集合。
集合类型的使用如下:
127.0.0.1:6379> sadd myset v1 v2 v3 # 添加数据
(integer) 3
127.0.0.1:6379> smembers myset # 查询集合中的所有数据
1) "v1"
2) "v3"
3) "v2"
集合类型的经典使用场景如下:
- 微博关注我的⼈和我关注的⼈都适合⽤集合存储,可以保证⼈员不会重复;
- 中奖⼈信息也适合⽤集合类型存储,这样可以保证⼀个⼈不会重复中奖。
集合类型(Set)和列表类型(List)的区别如下:
- 列表可以存储重复元素,集合只能存储⾮重复元素;
- 列表是按照元素的先后顺序存储元素的,⽽集合则是⽆序⽅式存储元素的。
⑤有序集合类型(ZSet)
有序集合类型 (Sorted Set) 相比于集合类型多了⼀个排序属性 score(分值),对于有序集合 ZSet 来说,每个存储元素相当于有两个值组成的,⼀个是有序集合的元素值,⼀个是排序值。有序集合的存储元素值也是不能重复的,但分值是可以重复的。
拓展:
Redis的有序集合(Sorted Set)是string类型元素的集合,每个成员都是一个String,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。对于相同分数的成员会按照字母序的顺序进行排序。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。集合中最大的成员数为232-1(4294967295,每个集合可存储40多亿个成员)。ps:
哈希表是集合的一种实现方式,是一种使用哈希函数组织数据,以支持快速插入和搜索的数据结构。
哈希表由一个个的桶组成,每个桶中可以存放一个或多个键值对。每个键值对之间没有明确的顺序关系,查找某个元素时,通过哈希函数计算出对应的桶,然后在桶中查找对应的键值对,就可以找到所查元素。
哈希表具有查找速度快,插入、删除也很快的特点,其时间复杂度都是O(1),即无论数据量多大,只要哈希函数设计合理,都可以在常数时间内完成查找、插入、删除等操作。
有序集合的用法如下:
ZADD key score member:将一个成员元素加入到有序集合当中。如果这个元素已经存在于集合中,那么更新这个元素的分数。
ZINCRBY key increment member:为有序集合中的指定成员的分数加上增量increment。
ZCARD key:返回有序集合的成员数。
ZCOUNT key min max:返回有序集合中指定分数范围内的成员数。
ZLEXCOUNT key min max:返回有序集合中指定字典序范围内的成员数。
ZRANK key member:返回有序集合中指定成员的升序排名。
ZREVRANK key member:返回有序集合中指定成员的降序排名。
ZPOPMIN key [key ...] timeout:阻塞式的zpopmin命令,timeout为秒级精度。命令依次检查给定的有序集合,并从第一个非空集合弹出分值最小元素,否则阻塞当前客户端直到有元素或超出超时时间返回nil。成功弹出元素时将返回一个列表,包含被弹出元素所在有序集合、成员以及分值。
当我们把学生的成绩存储在有序集合中时,它的存储结构如下图所示:
有序集合类型的使用如下:
127.0.0.1:6379> zadd zset1 3 golang 4 sql 1 redis # 添加数据
(integer) 3
127.0.0.1:6379> zrange zset 0 -1 # 查询所有数据
1) "redis"
2) "golang"
3) "sql"
有序集合的经典使用场景如下:
- 学生成绩排名;
- 粉丝列表,根据关注的先后时间排序。