Redis里各种数据类型怎么用,存东西到底选啥合适?
- 问答
- 2026-01-02 20:07:57
- 3
很多人把Redis当成一个简单的键值对缓存,比如把用户信息序列化成JSON字符串,然后通过一个用户ID作为key存进去,这么做当然可以,但就像你用瑞士军刀只用了它的小刀功能,浪费了它其他强大的工具,Redis真正厉害的地方在于它提供了多种专门的数据结构,让你能更直观、更高效地处理数据。
下面我们就来聊聊Redis里几种最常用的数据类型,以及它们最适合在什么场景下使用。
String(字符串):最基础,但不止是字符串
这是Redis最基本的数据类型,一个key对应一个value,但这个value不仅仅是文本,它可以是字符串、整数或者浮点数。
-
怎么用?
- 缓存简单数据: 这是最经典的用法,比如缓存会话(Session)、网页内容、验证码等,命令简单,
SET user:1001 "{name: '张三', age: 30}"和GET user:1001。 - 计数器: 这是String类型一个非常强大的功能,利用
INCR(加1)和INCRBY(加指定数字)命令,Redis能保证原子性操作,非常适合做文章阅读量、视频播放量、点赞数的统计,比如每次有人阅读文章,就执行INCR article:123:views。 - 分布式锁: 通过
SET命令的NX(不存在才设置)参数,可以实现简单的分布式锁,保证在分布式系统中同一时间只有一个客户端能执行关键操作。
- 缓存简单数据: 这是最经典的用法,比如缓存会话(Session)、网页内容、验证码等,命令简单,
-
什么时候选它?
- 你要存的就是一个独立的对象,比如一个用户的完整信息(JSON格式)。
- 你需要进行计数器的增减操作。
- 你要存一个简单的键值对,没有复杂的查询需求。
Hash(哈希表):存放对象属性
Hash相当于Java里的Map或Python里的字典,是一个键值对集合,它特别适合用来存储对象。
-
怎么用?
- 存储对象: 比如存储用户信息,不像String那样把整个对象序列化成JSON,而是用Hash为每个用户属性单独存储,key可以是
user:1001,然后在这个key下,设置 field-value 对,如HSET user:1001 name "张三" age 30 city "北京",获取时可以用HGET user:1001 name获取单个属性,或者HGETALL user:1001获取所有属性。 - 优点: 可以单独修改或获取对象的某个字段,非常灵活,节省网络带宽,比如只想更新用户的年龄,用
HSET user:1001 age 31即可,而不需要像String那样读取整个JSON、修改、再写回整个JSON。
- 存储对象: 比如存储用户信息,不像String那样把整个对象序列化成JSON,而是用Hash为每个用户属性单独存储,key可以是
-
什么时候选它?
- 你需要存储一个具有多个属性的对象(如用户、商品、订单)。
- 你经常需要单独操作这个对象的某些字段,而不是整个对象。
List(列表):有序的、可重复的序列
List是一个简单的字符串列表,按照插入顺序排序,你可以从列表的头部(左边)或尾部(右边)添加元素。
-
怎么用?
- 消息队列(简易版): 利用
LPUSH(从左边放入)和RPOP(从右边取出)可以构成一个简单的先进先出(FIFO)队列,生产者用LPUSH放入任务,消费者用RPOP取出任务处理。 - 最新消息/动态列表: 比如微信朋友圈的时间线,当用户发布新动态时,用
LPUSH将动态ID放入他的好友们的timeline:userID列表中,当好友查看朋友圈时,用LRANGE命令取出最新的前N条动态,因为List是有序的,最新的总是在最前面。 - 记录操作日志: 可以按时间顺序记录用户的操作记录。
- 消息队列(简易版): 利用
-
什么时候选它?
- 你需要一个严格顺序的、可重复的列表。
- 场景是“最新N个”或者“队列”。
Set(集合):无序的、唯一的集合
Set是String类型的无序集合,它的特点是元素不能重复。
-
怎么用?
- 标签系统: 比如给文章打标签,一篇文章可以有多个标签,但每个标签是唯一的,可以用
SADD article:1001:tags "科技" "Redis" "数据库"来添加标签,你可以很方便地求两篇文章的共同标签(交集)、判断某个标签是否存在等。 - 共同好友: 在社交网络中,求两个人的共同好友就是求两个Set的交集。
- 抽奖/随机值: 用
SADD添加参与抽奖的用户ID,因为Set元素不重复,可以避免同一用户重复参与,抽奖时用SRANDMEMBER(随机取一个不删除)或SPOP(随机取一个并删除)非常方便。 - 唯一性判断: 快速判断某个元素是否存在集合中。
- 标签系统: 比如给文章打标签,一篇文章可以有多个标签,但每个标签是唯一的,可以用
-
什么时候选它?
- 你需要存储不重复的值。
- 你需要做集合运算,比如求交集、并集、差集(共同好友、共同兴趣等)。
Sorted Set(有序集合):带分数的Set
这是Set的升级版,它同样保证元素的唯一性,但每个元素都会关联一个分数(score),Redis会根据这个分数对集合中的元素进行从小到大的排序。
-
怎么用?
- 排行榜: 这是最经典的应用场景,比如游戏玩家积分排行榜,玩家ID是元素,积分是分数,用
ZADD leaderboard 3500 "player1"添加或更新分数,然后用ZREVRANGE leaderboard 0 9就可以轻松取出排名前十的玩家(ZREVRANGE是按分数从大到小排)。 - 带权重的队列: 分数可以代表优先级,实现一个优先级队列。
- 范围查询: 比如处理时间线数据,可以将时间戳作为score,然后查询某个时间段内的数据。
- 排行榜: 这是最经典的应用场景,比如游戏玩家积分排行榜,玩家ID是元素,积分是分数,用
-
什么时候选它?
- 你需要一个既要不重复,又要能排序的集合。
- 排行榜类需求是它的绝对主场。
总结一下怎么选:
- 简单的键值对或计数器 -> String
- 存储多字段的对象(如用户)-> Hash
- 需要顺序的、队列或栈结构 -> List
- 需要存储不重复值,做交集并集(如标签、共同好友)-> Set
- 需要排序和排行榜(如游戏积分榜)-> Sorted Set
选择数据类型的核心思路是:根据你的数据特征和访问模式,选择最贴近你业务逻辑的数据结构。 用对了数据结构,不仅能让你代码写起来更简单,还能极大地提升性能和降低资源消耗,比如你要做个排行榜,用List或Set都会非常别扭和低效,而用Sorted Set则轻而易举,不要试图用一把锤子去解决所有问题。

本文由帖慧艳于2026-01-02发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/73277.html
