redis 五大数据类型
提示
- redis 作为一款高性能的键值对数据库,提供了丰富的数据类型以满足不同场景需求
- 其中最核心的五大数据类型分别是:String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Sorted Set(有序集合,简称 ZSet)。
字符串类型(一)
String 是 Redis 最基础的数据类型,也是使用最广泛的类型。它是二进制安全的,可以存储任意格式的数据(如文本、数字、图片二进制等),最大容量为 512MB。
shell
# 特点
键值对结构:每个键对应一个字符串值(value 可以是字符串、数字等)。
支持原子操作:如自增、自减等,适合计数器场景。
# 常用命令
set key value # 设置
get key # 获取
keys * # 列出匹配 key(仅建议本地调试;生产用 SCAN 渐进遍历,避免阻塞)
del key # 删除 key
incr key # 自增
decr key # 自减
append key value # 向字符串末尾追加
strlen key # 获取字符长度
# 应用场景
缓存:存储热点数据(如用户信息、商品详情),减轻数据库压力。
计数器:如文章阅读量、视频播放量(用 INCR 原子更新)。
分布式锁:通过 SET key value NX EX 命令实现(NX 表示不存在才设置,避免重复加锁)。
会话存储:存储用户登录会话信息(设置过期时间自动失效)。哈希类型(二)
Hash 类型类似于 Java 中的 HashMap,是键值对的集合(即 "键 -> 字段 -> 值" 的三级结构)。适合存储结构化数据(如对象),每个字段对应对象的一个属性。
shell
# 特点
字段和值均为字符串类型,且字段唯一(同个 Hash 中不允许重复字段)。
操作单个字段效率高,无需修改整个对象。
# 常用命令
HSET key field value # 向 Hash 中设置字段和值
HGET key field # 获取 Hash 中指定字段的值
HGETALL key # 获取 Hash 中所有字段和值
HDEL key field # 删除 Hash 中指定字段
HEXISTS key field # 判断字段是否存在
HINCRBY key field num # 对字段值(数字)执行增减
# 应用场景
存储对象:如用户信息(id 为键,字段为 name/age/email 等)、商品信息(id 为键,字段为 price/stock 等)。
局部更新:修改对象的某个属性(如仅更新用户的年龄),无需重新存储整个对象。列表类型(三)
List 是有序字符串列表,允许重复元素;两端压入/弹出为 O(1),按索引访问中间元素为 O(n)。底层实现随版本演进(quicklist / listpack 等),以官方文档为准,不必死记某一种内部结构名。
shell
# 特点
有序性:元素按插入顺序排列,可通过索引访问(从 0 开始)。
双向操作:支持从头部(左侧)或尾部(右侧)插入 / 删除元素。
# 常用命令
LPUSH key value # 向列表头部插入元素
RPUSH key value # 向列表尾部插入元素
LPOP key # 移除并返回列表头部元素
RPOP key # 移除并返回列表尾部元素
LRANGE key start end # 获取指定索引范围的元素(end 为 -1 表示最后一个)
LLEN key # 获取列表长度
# 应用场景
消息队列:LPUSH 生产消息,RPOP 消费消息(或用 BRPOP 阻塞等待新消息)。
最新列表:如朋友圈最新动态、新闻资讯列表(用 LPUSH 新增,LRANGE 0 9 获取前 10 条)。
栈 / 队列实现:LPUSH + LPOP 实现栈(先进后出),LPUSH + RPOP 实现队列(先进先出)。集合类型(四)
Set 是无序的字符串集合,不允许重复元素(重复插入会被忽略)。底层基于哈希表(或整数集合,当元素为整数且较少时)实现,因此增删查操作效率极高(O (1))。
shell
# 特点
无序性:元素无固定顺序,无法通过索引访问。
唯一性:自动去重,适合存储不重复的数据集。
支持集合运算:交集、并集、差集等。
# 常用命令
SADD key member # 向集合添加元素
SREM key member # 从集合移除元素
SMEMBERS key # 返回集合所有元素
SISMEMBER key member # 判断元素是否在集合中
SINTER key1 key2 # 求两个集合的交集
SUNION key1 key2 # 求两个集合的并集
SCARD key # 返回集合元素个数
# 应用场景
去重存储:如用户搜索历史(避免重复关键词)。
关系存储:如好友列表、关注列表(SADD 添加好友,SISMEMBER 检查是否好友)。
共同关系:如共同好友、共同标签(用 SINTER 求交集)。有序集合类型(五)
ZSet 是 Set 的升级版本,不允许重复元素,但每个元素会关联一个分数(score,浮点数),并按分数自动排序。底层基于跳跃表 + 哈希表实现,兼顾排序和查询效率(O (log n))。
shell
# 特点
有序性:按分数升序排列(可通过命令指定降序)。
唯一性:元素唯一,但分数可重复。
分数可动态修改:通过修改分数改变元素排序。
# 常用命令
ZADD key score member # 向有序集合添加元素(指定分数)
ZREM key member # 移除有序集合中的元素
ZRANGE key start end [WITHSCORES] # 按分数升序返回指定范围元素(带 WITHSCORES 显示分数)
ZREVRANGE key start end # 按分数降序返回指定范围元素
ZSCORE key member # 获取元素的分数
ZINCRBY key increment member # 增加元素的分数
ZRANK key member # 返回元素的升序排名(从 0 开始)
# 应用场景
排行榜:如游戏积分排名(ZADD 存储分数,ZREVRANGE 0 9 获取前 10 名)、商品销量排名。
带权重的消息队列:按消息优先级(分数)排序,优先处理高分消息。
范围查询:如查询分数在 80-90 之间的用户(ZRANGEBYSCORE rank 80 90)。总结
shell
String:简单键值对,适合缓存、计数器。
Hash:结构化对象,适合存储用户 / 商品信息。
List:有序列表,适合消息队列、最新列表。
Set:无序去重集合,适合关系存储、交集运算。
ZSet:有序去重集合,适合排行榜、带权重场景。