Redis 有哪些数据类型?

redis 的数据类型可谓是 Redis 的精华所在,同样的数据类型,例如字符串存储不同的值对应的实际存储结构也是不同,当你存储的 int 值是实际的存储结构也是 int,如果是短字符串(小于 44 字节)实际存储的结构为 embstr,长字符串对应的实际存储结构是 raw,这样设计的目的是为了更好的节约内存 。
我们本文的面试题是 Redis 有哪些数据类型?
典型回答Redis 最常用的数据类型有 5 种:String(字符串类型)、Hash(字典类型)、List(列表类型)、Set(集合类型)、ZSet(有序集合类型) 。
1.字符串类型字符串类型(Simple Dynamic Strings 简称 SDS),译为:简单动态字符串,它是以键值对 key-value 的形式进行存储的,根据 key 来存储和获取 value 值,它的使用相对来说比较简单,但在实际项目中应用非常广泛 。
字符串的使用如下:
127.0.0.1:6379> set k1 v1 # 添加数据 OK127.0.0.1:6379> get k1 # 查询数据"v1"127.0.0.1:6379> strlen k1 # 查询字符串的长度(integer) 5复制我们也可以在存储字符串时设置键值的过期时间,如下代码所示:
127.0.0.1:6379> set k1 v1 ex 1000 # 设置 k1 1000s 后过期(删除)OK复制我们还可以使用 SDS 来存储 int 类型的值,并且可以使用 incr 指令和 decr 指令来操作存储的值 +1 或者 -1,具体实现代码如下:
127.0.0.1:6379> get k1 # 查询 k1=3"3"127.0.0.1:6379> incr k1 # 执行 +1 操作(integer) 4127.0.0.1:6379> get k1 # 查询 k1=4"4"127.0.0.1:6379> decr k1 # 执行 -1 操作(integer) 3127.0.0.1:6379> get k1 # 查询 k1=3"3"复制字符串的常见使用场景:

  • 存放用户(登录)信息;
  • 存放文章详情和列表信息;
  • 存放和累计网页的统计信息(存储 int 值) 。
……
2.字典类型字典类型 (Hash) 又被称为散列类型或者是哈希表类型,它是将一个键值 (key) 和一个特殊的“哈希表”关联起来,这个“哈希表”表包含两列数据:字段和值 。例如我们使用字典类型来存储一篇文章的详情信息,存储结构如下图所示:
Redis 有哪些数据类型?

文章插图
 
同理我们也可以使用字典类型来存储用户信息,并且使用字典类型来存储此类信息就无需手动序列化和反序列化数据了,所以使用起来更加的方便和高效 。
字典类型的使用如下:
127.0.0.1:6379> hset myhash key1 value1 # 添加数据(integer) 1127.0.0.1:6379> hget myhash key1 # 查询数据"value1"复制字典类型的数据结构,如下图所示:
Redis 有哪些数据类型?

文章插图
 
通常情况下字典类型会使用数组的方式来存储相关的数据,但发生哈希冲突时才会使用链表的结构来存储数据 。
3.列表类型列表类型 (List) 是一个使用链表结构存储的有序结构,它的元素插入会按照先后顺序存储到链表结构中,因此它的元素操作 (插入和删除) 时间复杂度为 O(1),所以相对来说速度还是比较快的,但它的查询时间复杂度为 O(n),因此查询可能会比较慢 。
列表类型的使用如下:
127.0.0.1:6379> lpush list 1 2 3 # 添加数据(integer) 3127.0.0.1:6379> lpop list # 获取并删除列表的第一个元素1复制列表的典型使用场景有以下两个:
  • 消息队列:列表类型可以使用 rpush 实现先进先出的功能,同时又可以使用 lpop 轻松的弹出(查询并删除)第一个元素,所以列表类型可以用来实现消息队列;
  • 文章列表:对于博客站点来说,当用户和文章都越来越多时,为了加快程序的响应速度,我们可以把用户自己的文章存入到 List 中,因为 List 是有序的结构,所以这样又可以完美的实现分页功能,从而加速了程序的响应速度 。
4.集合类型集合类型 (Set) 是一个无序并唯一的键值集合 。
集合类型的使用如下:
127.0.0.1:6379> sadd myset v1 v2 v3 # 添加数据(integer) 3127.0.0.1:6379> smembers myset # 查询集合中的所有数据1) "v1"2) "v3"3) "v2"复制集合类型的经典使用场景如下: