Skip to content

Redis 数据类型

Redis支持多种数据结构,每种数据结构都有特定的使用场景。

1. String(字符串)

最基本的数据类型,一个key对应一个value。

基本操作

redis
# 设置值
SET name "GlowXQ"
SET age 25

# 获取值
GET name

# 同时设置多个键值
MSET key1 "value1" key2 "value2" key3 "value3"

# 同时获取多个值
MGET key1 key2 key3

# 设置并返回旧值
GETSET name "NewName"

# 追加字符串
APPEND name " Blog"

# 获取字符串长度
STRLEN name

# 设置范围内的值
SETRANGE name 0 "Hello"

# 获取范围内的值
GETRANGE name 0 4

数值操作

redis
# 自增
INCR counter       # counter += 1
INCRBY counter 5   # counter += 5

# 自减
DECR counter       # counter -= 1
DECRBY counter 3   # counter -= 3

# 浮点数增加
INCRBYFLOAT price 0.5

应用场景

  • 缓存:用户信息、文章内容
  • 计数器:点赞数、访问量
  • 分布式锁:SETNX实现
  • Session共享

2. Hash(哈希)

类似于Map<String, String>,适合存储对象。

基本操作

redis
# 设置单个字段
HSET user:1001 name "GlowXQ"
HSET user:1001 age 25
HSET user:1001 email "glowxq@example.com"

# 设置多个字段
HMSET user:1002 name "User2" age 30 email "user2@example.com"

# 获取单个字段
HGET user:1001 name

# 获取多个字段
HMGET user:1001 name age

# 获取所有字段和值
HGETALL user:1001

# 获取所有字段名
HKEYS user:1001

# 获取所有值
HVALS user:1001

# 判断字段是否存在
HEXISTS user:1001 name

# 删除字段
HDEL user:1001 email

# 获取字段数量
HLEN user:1001

# 字段值增加
HINCRBY user:1001 age 1
HINCRBYFLOAT user:1001 balance 10.5

# 字段不存在时设置
HSETNX user:1001 phone "13800138000"

应用场景

  • 存储对象:用户信息、商品信息
  • 购物车:用户ID为key,商品ID为field,数量为value
redis
# 购物车示例
HSET cart:1001 product:1 2  # 商品1,数量2
HSET cart:1001 product:2 1  # 商品2,数量1
HINCRBY cart:1001 product:1 1  # 商品1数量+1
HDEL cart:1001 product:2  # 移除商品2
HGETALL cart:1001  # 查看购物车

3. List(列表)

有序的字符串列表,可以从两端操作。

基本操作

redis
# 左侧插入
LPUSH list1 "a" "b" "c"  # 结果:c b a

# 右侧插入
RPUSH list2 "a" "b" "c"  # 结果:a b c

# 左侧弹出
LPOP list1

# 右侧弹出
RPOP list2

# 获取列表长度
LLEN list1

# 获取范围内的元素
LRANGE list1 0 -1   # 获取所有元素
LRANGE list1 0 9    # 获取前10个元素

# 获取指定索引的元素
LINDEX list1 0

# 设置指定索引的值
LSET list1 0 "new value"

# 在指定元素前/后插入
LINSERT list1 BEFORE "b" "new"
LINSERT list1 AFTER "b" "new"

# 保留指定范围的元素
LTRIM list1 0 9  # 只保留前10个

# 移除元素
LREM list1 1 "value"  # 移除1个值为"value"的元素

# 阻塞弹出
BLPOP list1 10  # 等待10秒
BRPOP list1 10

应用场景

  • 消息队列:LPUSH + BRPOP
  • 最新列表:最新文章、最新评论
  • 栈:LPUSH + LPOP
  • 队列:LPUSH + RPOP
redis
# 消息队列示例
# 生产者
LPUSH queue:tasks "task1"
LPUSH queue:tasks "task2"

# 消费者
BRPOP queue:tasks 0  # 阻塞等待任务

4. Set(集合)

无序的字符串集合,元素唯一。

基本操作

redis
# 添加元素
SADD set1 "a" "b" "c"

# 获取所有元素
SMEMBERS set1

# 判断元素是否存在
SISMEMBER set1 "a"

# 获取集合大小
SCARD set1

# 移除元素
SREM set1 "a"

# 随机获取元素
SRANDMEMBER set1 2  # 随机获取2个元素

# 随机弹出元素
SPOP set1

# 移动元素到另一个集合
SMOVE set1 set2 "b"

集合运算

redis
# 交集
SINTER set1 set2

# 并集
SUNION set1 set2

# 差集
SDIFF set1 set2  # set1中有但set2中没有的

# 将结果存储到新集合
SINTERSTORE result set1 set2
SUNIONSTORE result set1 set2
SDIFFSTORE result set1 set2

应用场景

  • 标签系统:用户标签、文章标签
  • 共同好友:交集运算
  • 抽奖系统:SRANDMEMBER随机抽取
  • 点赞/收藏:用户ID存入集合
redis
# 标签系统示例
SADD user:1001:tags "Java" "MySQL" "Redis"
SADD user:1002:tags "Python" "MySQL" "MongoDB"

# 共同标签
SINTER user:1001:tags user:1002:tags  # 结果:MySQL

# 文章被哪些用户点赞
SADD article:1001:likes 1001 1002 1003
SCARD article:1001:likes  # 点赞数
SISMEMBER article:1001:likes 1001  # 判断用户是否点赞

5. ZSet(有序集合)

有序的集合,每个元素关联一个分数(score),按分数排序。

基本操作

redis
# 添加元素
ZADD leaderboard 9500 "player1"
ZADD leaderboard 8800 "player2"
ZADD leaderboard 9200 "player3"

# 获取元素数量
ZCARD leaderboard

# 获取指定范围的元素(按分数升序)
ZRANGE leaderboard 0 -1
ZRANGE leaderboard 0 9 WITHSCORES  # 带分数

# 获取指定范围的元素(按分数降序)
ZREVRANGE leaderboard 0 9 WITHSCORES

# 获取指定分数范围的元素
ZRANGEBYSCORE leaderboard 8000 9000 WITHSCORES

# 获取元素的分数
ZSCORE leaderboard "player1"

# 获取元素的排名
ZRANK leaderboard "player1"      # 升序排名
ZREVRANK leaderboard "player1"   # 降序排名

# 增加分数
ZINCRBY leaderboard 100 "player1"

# 移除元素
ZREM leaderboard "player2"

# 移除指定排名范围的元素
ZREMRANGEBYRANK leaderboard 0 2

# 移除指定分数范围的元素
ZREMRANGEBYSCORE leaderboard 0 8000

# 统计指定分数范围的元素数量
ZCOUNT leaderboard 8000 9000

集合运算

redis
# 交集
ZINTERSTORE result 2 zset1 zset2

# 并集
ZUNIONSTORE result 2 zset1 zset2

应用场景

  • 排行榜:游戏积分榜、热搜榜
  • 延时队列:时间戳作为score
  • 优先级任务:优先级作为score
redis
# 排行榜示例
# 添加分数
ZADD game:rank 9500 "player1"
ZADD game:rank 8800 "player2"
ZADD game:rank 9200 "player3"

# 增加分数
ZINCRBY game:rank 100 "player1"

# 获取前10名
ZREVRANGE game:rank 0 9 WITHSCORES

# 获取玩家排名(从1开始)
ZREVRANK game:rank "player1"

# 延时队列示例
# 添加任务(时间戳作为score)
ZADD delay:queue 1640000000 "task1"
ZADD delay:queue 1640000060 "task2"

# 获取到期任务
ZRANGEBYSCORE delay:queue 0 [当前时间戳]

6. Bitmap(位图)

基于String类型,通过位操作实现。

redis
# 设置位
SETBIT key 10 1

# 获取位
GETBIT key 10

# 统计位为1的数量
BITCOUNT key

# 位运算
BITOP AND destkey key1 key2
BITOP OR destkey key1 key2
BITOP XOR destkey key1 key2
BITOP NOT destkey key

应用场景

  • 签到统计:用户每日签到
  • 在线状态:用户是否在线
  • 布隆过滤器
redis
# 签到示例
# 用户1001在第1天签到
SETBIT sign:1001:202410 0 1
# 用户1001在第5天签到
SETBIT sign:1001:202410 4 1

# 统计签到天数
BITCOUNT sign:1001:202410

7. HyperLogLog

用于基数统计(去重计数),占用空间极小(12KB)。

redis
# 添加元素
PFADD uv:20241022 "user1" "user2" "user3"

# 统计基数
PFCOUNT uv:20241022

# 合并
PFMERGE uv:total uv:20241022 uv:20241023

应用场景

  • UV统计:网站独立访客数
  • 搜索关键词统计

8. Geospatial(地理位置)

存储地理位置信息。

redis
# 添加位置
GEOADD cities 116.40 39.90 "beijing"
GEOADD cities 121.47 31.23 "shanghai"

# 获取位置
GEOPOS cities "beijing"

# 计算距离
GEODIST cities "beijing" "shanghai" km

# 获取附近的位置
GEORADIUS cities 116.40 39.90 1000 km

# 获取指定位置附近的位置
GEORADIUSBYMEMBER cities "beijing" 1000 km

应用场景

  • 附近的人/店铺
  • 外卖配送范围

💡 提示

这是一个demo文档,欢迎补充更多数据类型相关内容。

基于 VitePress 构建