系列导读:本篇将深入讲解 Redis 的 8 种数据类型,包括 String、Hash、List、Set、ZSet、Bitmaps、HyperLogLog、Geospatial。
文章目录
-
- 一、数据类型概览
-
- [1.1 数据类型对比](#1.1 数据类型对比)
- [二、String 字符串](#二、String 字符串)
-
- [2.1 基本操作](#2.1 基本操作)
- [2.2 批量操作](#2.2 批量操作)
- [2.3 数值操作](#2.3 数值操作)
- [2.4 字符串操作](#2.4 字符串操作)
- [2.5 应用场景](#2.5 应用场景)
- [三、Hash 哈希](#三、Hash 哈希)
-
- [3.1 基本操作](#3.1 基本操作)
- [3.2 字段操作](#3.2 字段操作)
- [3.3 数值操作](#3.3 数值操作)
- [3.4 应用场景](#3.4 应用场景)
- [四、List 列表](#四、List 列表)
-
- [4.1 基本操作](#4.1 基本操作)
- [4.2 弹出操作](#4.2 弹出操作)
- [4.3 索引操作](#4.3 索引操作)
- [4.4 修剪操作](#4.4 修剪操作)
- [4.5 应用场景](#4.5 应用场景)
- [五、Set 集合](#五、Set 集合)
-
- [5.1 基本操作](#5.1 基本操作)
- [5.2 集合运算](#5.2 集合运算)
- [5.3 随机操作](#5.3 随机操作)
- [5.4 应用场景](#5.4 应用场景)
- [六、ZSet 有序集合](#六、ZSet 有序集合)
-
- [6.1 基本操作](#6.1 基本操作)
- [6.2 范围查询](#6.2 范围查询)
- [6.3 删除操作](#6.3 删除操作)
- [6.4 应用场景](#6.4 应用场景)
- 七、高级数据类型
-
- [7.1 Bitmaps 位图](#7.1 Bitmaps 位图)
- [7.2 HyperLogLog 基数统计](#7.2 HyperLogLog 基数统计)
- [7.3 Geospatial 地理位置](#7.3 Geospatial 地理位置)
- 总结
一、数据类型概览
1.1 数据类型对比
| 数据类型 | 说明 | 底层实现 | 典型场景 |
|---|---|---|---|
| String | 字符串、整数、浮点数 | SDS | 缓存、计数器 |
| Hash | 键值对集合 | ziplist/hashtable | 存储对象 |
| List | 有序字符串列表 | quicklist | 消息队列 |
| Set | 无序唯一集合 | intset/hashtable | 标签系统 |
| ZSet | 有序唯一集合 | skiplist | 排行榜 |
| Bitmaps | 位图 | String | 签到统计 |
| HyperLogLog | 基数估算 | String | UV统计 |
| Geospatial | 地理位置 | ZSet | 附近的人 |
二、String 字符串
2.1 基本操作
bash
# 设置值
SET key value
SET user:name "张三"
# 获取值
GET key
GET user:name # "张三"
# 设置并返回旧值
GETSET key newvalue
# 仅当不存在时设置
SETNX key value # 存在返回0,不存在返回1
# 设置带过期时间
SETEX key seconds value
SETEX session:token 3600 "abc123"
2.2 批量操作
bash
# 批量设置
MSET key1 value1 key2 value2
MSET user:1:name "张三" user:1:age "25"
# 批量获取
MGET key1 key2
MGET user:1:name user:1:age
# 1) "张三"
# 2) "25"
2.3 数值操作
bash
# 递增
INCR counter # +1
INCRBY counter 10 # +10
# 递减
DECR counter # -1
DECRBY counter 5 # -5
# 浮点递增
INCRBYFLOAT price 2.5
2.4 字符串操作
bash
# 获取长度
STRLEN key
# 追加内容
APPEND key "suffix"
# 获取子串
GETRANGE key start end
GETRANGE greeting 0 4 # "Hello"
# 设置子串
SETRANGE key offset value
2.5 应用场景
| 场景 | 实现方式 |
|---|---|
| 缓存 | SET/GET |
| 计数器 | INCR/INCRBY |
| 分布式锁 | SETNX |
| Session | SETEX |
三、Hash 哈希
3.1 基本操作
bash
# 设置单个字段
HSET user:1 name "张三"
# 设置多个字段
HMSET user:1 name "张三" age 25 city "北京"
# 获取单个字段
HGET user:1 name # "张三"
# 获取多个字段
HMGET user:1 name age
# 获取所有字段
HGETALL user:1
# 1) "name"
# 2) "张三"
# 3) "age"
# 4) "25"
3.2 字段操作
bash
# 检查字段是否存在
HEXISTS user:1 name # 1存在 0不存在
# 删除字段
HDEL user:1 city
# 获取所有字段名
HKEYS user:1
# 获取所有字段值
HVALS user:1
# 获取字段数量
HLEN user:1
3.3 数值操作
bash
# 字段递增
HINCRBY user:1 age 1
HINCRBYFLOAT user:1 score 0.5
3.4 应用场景
bash
# 存储用户信息
HMSET user:1001 name "李四" age 30 email "li4@example.com"
# 购物车
HSET cart:user:1001 product:1 2 # 商品ID:数量
HSET cart:user:1001 product:2 1
HINCRBY cart:user:1001 product:1 1 # 增加数量
四、List 列表
4.1 基本操作
bash
# 左侧插入
LPUSH mylist "a" "b" "c"
# 右侧插入
RPUSH mylist "d" "e"
# 获取列表长度
LLEN mylist
# 获取范围内元素
LRANGE mylist 0 -1 # 获取全部
LRANGE mylist 0 2 # 获取前3个
4.2 弹出操作
bash
# 左侧弹出
LPOP mylist
# 右侧弹出
RPOP mylist
# 阻塞弹出(用于消息队列)
BLPOP mylist 30 # 30秒超时
BRPOP mylist 30
4.3 索引操作
bash
# 按索引获取
LINDEX mylist 0
# 按索引设置
LSET mylist 0 "newvalue"
# 获取长度
LLEN mylist
4.4 修剪操作
bash
# 只保留指定范围
LTRIM mylist 0 99 # 只保留前100个
4.5 应用场景
bash
# 消息队列
LPUSH queue:orders "order:1"
RPOP queue:orders
# 最新列表
LPUSH latest:news "news:100"
LTRIM latest:news 0 99 # 只保留最新100条
# 时间线
LPUSH timeline:user:1 "post:1" "post:2"
五、Set 集合
5.1 基本操作
bash
# 添加元素
SADD myset "a" "b" "c"
# 获取所有元素
SMEMBERS myset
# 检查元素是否存在
SISMEMBER myset "a" # 1存在 0不存在
# 获取元素数量
SCARD myset
# 删除元素
SREM myset "a"
5.2 集合运算
bash
# 交集
SINTER set1 set2
# 并集
SUNION set1 set2
# 差集
SDIFF set1 set2
# 存储运算结果
SINTERSTORE result set1 set2
SUNIONSTORE result set1 set2
SDIFFSTORE result set1 set2
5.3 随机操作
bash
# 随机获取元素
SRANDMEMBER myset
# 随机弹出元素
SPOP myset
5.4 应用场景
bash
# 标签系统
SADD user:1:tags "科技" "互联网" "AI"
SADD user:2:tags "科技" "金融"
# 共同好友
SINTER user:1:friends user:2:friends
# 抽奖系统
SADD lottery:users "user1" "user2" "user3"
SPOP lottery:users # 随机抽取
六、ZSet 有序集合
6.1 基本操作
bash
# 添加元素(带分数)
ZADD leaderboard 100 "player1"
ZADD leaderboard 200 "player2"
ZADD leaderboard 150 "player3"
# 获取元素分数
ZSCORE leaderboard "player1"
# 获取元素排名(从0开始)
ZRANK leaderboard "player1"
# 获取元素数量
ZCARD leaderboard
6.2 范围查询
bash
# 按排名范围获取
ZRANGE leaderboard 0 9 # 前10名
ZRANGE leaderboard 0 9 WITHSCORES # 带分数
# 按分数范围获取
ZRANGEBYSCORE leaderboard 100 200
ZRANGEBYSCORE leaderboard 100 200 WITHSCORES
# 倒序获取
ZREVRANGE leaderboard 0 9 WITHSCORES
ZREVRANGEBYSCORE leaderboard 200 100
6.3 删除操作
bash
# 删除元素
ZREM leaderboard "player1"
# 按排名删除
ZREMRANGEBYRANK leaderboard 0 9
# 按分数删除
ZREMRANGEBYSCORE leaderboard 0 100
6.4 应用场景
bash
# 排行榜
ZADD game:rank 1000 "player1"
ZADD game:rank 2000 "player2"
ZREVRANGE game:rank 0 9 WITHSCORES # Top 10
# 延时队列
ZADD delay:queue 1712345678 "task1" # 时间戳作为分数
# 热搜榜
ZINCRBY hot:search 1 "Redis教程"
ZREVRANGE hot:search 0 9 WITHSCORES
七、高级数据类型
7.1 Bitmaps 位图
bash
# 设置位
SETBIT user:sign:2024:1 0 1 # 第1天签到
SETBIT user:sign:2024:1 1 1 # 第2天签到
# 获取位
GETBIT user:sign:2024:1 0
# 统计签到天数
BITCOUNT user:sign:2024:1
# 查找第一个0或1
BITPOS user:sign:2024:1 0
7.2 HyperLogLog 基数统计
bash
# 添加元素
PFADD uv:20240101 "user1" "user2" "user3"
# 获取基数(估算值)
PFCOUNT uv:20240101
# 合并多个HyperLogLog
PFMERGE uv:total uv:20240101 uv:20240102
7.3 Geospatial 地理位置
bash
# 添加位置
GEOADD locations 116.404 39.915 "北京"
GEOADD locations 121.474 31.230 "上海"
# 获取位置坐标
GEOPOS locations "北京"
# 计算两地距离
GEODIST locations "北京" "上海" km
# 查找附近位置
GEORADIUS locations 116.404 39.915 100 km
GEORADIUSBYMEMBER locations "北京" 500 km
总结
本文我们学习了:
✅ String :字符串、数值操作、应用场景
✅ Hash :对象存储、购物车
✅ List :消息队列、最新列表
✅ Set :标签系统、集合运算
✅ ZSet :排行榜、延时队列
✅ 高级类型:Bitmaps、HyperLogLog、Geospatial
下篇预告 :Redis 从入门到精通(三):键操作命令详解
作者 :刘~浪地球
系列 :Redis 从入门到精通(二)
更新时间:2026-04-02