Redis数据类型

Redis中有五种基础数据类型:

  • 字符串:String
  • 集合:Set
  • 有序集合:ZSet(Sorted Set)
  • 哈希:Hash
  • 列表:List

此外还有三种特殊类型:

  • 基数统计:HyperLogLog
  • 位图:Bitmap
  • 地理位置:Geospatial

Redis不只是简单的 key–value 缓存,而是允许一个key对应多种复杂结构。


一、String(字符串)

最基础的数据类型。底层由 SDS(Simple Dynamic String) 实现,支持动态扩展和二进制安全。

特点

  • key 对应一个字符串值
  • 可以存字符串、数字、二进制数据
  • 最大 512MB

常见命令

1
2
3
4
SET key value
GET key
INCR key
DECR key

典型应用

  • 缓存对象
  • 计数器(访问次数、点赞数)
  • 分布式锁(SETNX)

例子

1
2
SET page_view 100
INCR page_view

访问量计数器就诞生了。


二、Hash(哈希)

本质是 key → field → value 的结构,类似 Java 的 Map<String, Map<String, String>>。底层由压缩列表或哈希表实现。

常见命令

1
2
3
HSET user:1 name ZhangSan
HSET user:1 age 20
HGET user:1 name

典型应用

存储对象信息:

1
2
3
4
user:1
name -> ZhangSan
age -> 20
city -> Beijing

优点是:

  • 可以只修改一个字段
  • 比直接存 JSON 更节省内存

三、List(列表)

一个 有序、可重复的字符串列表,底层是 双向链表 + 压缩列表,Redis3.2之后就只由quicklist实现了。

常见命令

1
2
3
4
LPUSH list v1
RPUSH list v2
LPOP list
RPOP list

典型应用

  • 消息队列

生产者:

1
LPUSH queue msg1

消费者:

1
RPOP queue
  • 信息流队列

例如微博时间线。


四、Set(集合)

无序、不重复的字符串集合。底层由哈希表或整数集合实现。

  • 如果集合中元素都是整数且元素个数小于512个,Redis会使用整数集合来存储,否则使用哈希表。
  • 如果不满足上述条件,Redis会自动转换为哈希表。

常见命令

1
2
3
SADD set a
SADD set b
SMEMBERS set

核心特性

支持数学集合运算:

1
2
3
SINTER  交集
SUNION 并集
SDIFF 差集

典型应用

  • 好友关系
  • 共同关注
  • 标签系统

例子:

1
2
user:1:follow -> {A,B,C}
user:2:follow -> {B,C,D}

求共同关注:

1
SINTER

五、ZSet(Sorted Set,有序集合)

这是 Redis 最强的数据结构之一。底层由 跳表 + 压缩列表 实现。

结构:

1
value + score

Redis 会按 score 排序

常见命令

1
2
3
ZADD rank 100 user1
ZADD rank 80 user2
ZRANGE rank 0 10

典型应用

排行榜系统:

1
2
3
user1 100
user2 80
user3 60

可以快速得到:

  • 排名
  • Top N
  • 分数区间

六、BitMap

位图,本质是 位操作的字符串

Bitmap 存储的是连续的二进制数字(0 和 1),通过 Bitmap, 只需要一个 bit 位来表示某个元素对应的值或者状态,key 就是对应元素本身 。

我们知道 8 个 bit 可以组成一个 byte,所以 Bitmap 本身会极大的节省储存空间。

可以将 Bitmap 看作是一个存储二进制数字(0 和 1)的数组,数组中每个元素的下标叫做 offset(偏移量)。

应用:

需要保存状态信息(0/1即可表示)的场景

  • 用户签到
  • 在线状态统计

七、HyperLogLog

用于 基数统计(去重计数)

例如:

  • 统计网站 UV

优点:

  • 只占 12KB
  • 允许少量误差

八、Geo

用于 地理位置计算

1
2
3
GEOADD
GEODIST
GEORADIUS

应用:

  • 附近的人
  • 附近商店

面试推荐总结回答(非常标准)

可以这样说:

Redis 常见的数据类型主要有五种:
String、Hash、List、Set、Sorted Set

String 用于缓存和计数器;
Hash 用于存储对象;
List 用于消息队列或时间线;
Set 用于去重和关系运算;
Sorted Set 用于排行榜等需要排序的场景。

此外 Redis 还提供了一些扩展结构,比如 Bitmap、HyperLogLog 和 Geo,分别用于位统计、海量去重统计和地理位置计算。