Redis 从入门到精通(二):数据类型详解
系列导读:本篇将深入讲解 Redis 的 8 种数据类型,包括 String、Hash、List、Set、ZSet、Bitmaps、HyperLogLog、Geospatial。
文章目录
- 一、数据类型概览
- 1.1 数据类型对比
- 二、String 字符串
- 2.1 基本操作
- 2.2 批量操作
- 2.3 数值操作
- 2.4 字符串操作
- 2.5 应用场景
- 三、Hash 哈希
- 3.1 基本操作
- 3.2 字段操作
- 3.3 数值操作
- 3.4 应用场景
- 四、List 列表
- 4.1 基本操作
- 4.2 弹出操作
- 4.3 索引操作
- 4.4 修剪操作
- 4.5 应用场景
- 五、Set 集合
- 5.1 基本操作
- 5.2 集合运算
- 5.3 随机操作
- 5.4 应用场景
- 六、ZSet 有序集合
- 6.1 基本操作
- 6.2 范围查询
- 6.3 删除操作
- 6.4 应用场景
- 七、高级数据类型
- 7.1 Bitmaps 位图
- 7.2 HyperLogLog 基数统计
- 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 基本操作
# 设置值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:token3600"abc123"2.2 批量操作
# 批量设置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 数值操作
# 递增INCR counter# +1INCRBY counter10# +10# 递减DECR counter# -1DECRBY counter5# -5# 浮点递增INCRBYFLOAT price2.52.4 字符串操作
# 获取长度STRLEN key# 追加内容APPEND key"suffix"# 获取子串GETRANGE key start end GETRANGE greeting04# "Hello"# 设置子串SETRANGE key offset value2.5 应用场景
| 场景 | 实现方式 |
|---|---|
| 缓存 | SET/GET |
| 计数器 | INCR/INCRBY |
| 分布式锁 | SETNX |
| Session | SETEX |
三、Hash 哈希
3.1 基本操作
# 设置单个字段HSET user:1 name"张三"# 设置多个字段HMSET user:1 name"张三"age25city"北京"# 获取单个字段HGET user:1 name# "张三"# 获取多个字段HMGET user:1 name age# 获取所有字段HGETALL user:1# 1) "name"# 2) "张三"# 3) "age"# 4) "25"3.2 字段操作
# 检查字段是否存在HEXISTS user:1 name# 1存在 0不存在# 删除字段HDEL user:1 city# 获取所有字段名HKEYS user:1# 获取所有字段值HVALS user:1# 获取字段数量HLEN user:13.3 数值操作
# 字段递增HINCRBY user:1 age1HINCRBYFLOAT user:1 score0.53.4 应用场景
# 存储用户信息HMSET user:1001 name"李四"age30email"li4@example.com"# 购物车HSET cart:user:1001 product:12# 商品ID:数量HSET cart:user:1001 product:21HINCRBY cart:user:1001 product:11# 增加数量四、List 列表
4.1 基本操作
# 左侧插入LPUSH mylist"a""b""c"# 右侧插入RPUSH mylist"d""e"# 获取列表长度LLEN mylist# 获取范围内元素LRANGE mylist0-1# 获取全部LRANGE mylist02# 获取前3个4.2 弹出操作
# 左侧弹出LPOP mylist# 右侧弹出RPOP mylist# 阻塞弹出(用于消息队列)BLPOP mylist30# 30秒超时BRPOP mylist304.3 索引操作
# 按索引获取LINDEX mylist0# 按索引设置LSET mylist0"newvalue"# 获取长度LLEN mylist4.4 修剪操作
# 只保留指定范围LTRIM mylist099# 只保留前100个4.5 应用场景
# 消息队列LPUSH queue:orders"order:1"RPOP queue:orders# 最新列表LPUSH latest:news"news:100"LTRIM latest:news099# 只保留最新100条# 时间线LPUSH timeline:user:1"post:1""post:2"五、Set 集合
5.1 基本操作
# 添加元素SADD myset"a""b""c"# 获取所有元素SMEMBERS myset# 检查元素是否存在SISMEMBER myset"a"# 1存在 0不存在# 获取元素数量SCARD myset# 删除元素SREM myset"a"5.2 集合运算
# 交集SINTER set1 set2# 并集SUNION set1 set2# 差集SDIFF set1 set2# 存储运算结果SINTERSTORE result set1 set2 SUNIONSTORE result set1 set2 SDIFFSTORE result set1 set25.3 随机操作
# 随机获取元素SRANDMEMBER myset# 随机弹出元素SPOP myset5.4 应用场景
# 标签系统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 基本操作
# 添加元素(带分数)ZADD leaderboard100"player1"ZADD leaderboard200"player2"ZADD leaderboard150"player3"# 获取元素分数ZSCORE leaderboard"player1"# 获取元素排名(从0开始)ZRANK leaderboard"player1"# 获取元素数量ZCARD leaderboard6.2 范围查询
# 按排名范围获取ZRANGE leaderboard09# 前10名ZRANGE leaderboard09WITHSCORES# 带分数# 按分数范围获取ZRANGEBYSCORE leaderboard100200ZRANGEBYSCORE leaderboard100200WITHSCORES# 倒序获取ZREVRANGE leaderboard09WITHSCORES ZREVRANGEBYSCORE leaderboard2001006.3 删除操作
# 删除元素ZREM leaderboard"player1"# 按排名删除ZREMRANGEBYRANK leaderboard09# 按分数删除ZREMRANGEBYSCORE leaderboard01006.4 应用场景
# 排行榜ZADD game:rank1000"player1"ZADD game:rank2000"player2"ZREVRANGE game:rank09WITHSCORES# Top 10# 延时队列ZADD delay:queue1712345678"task1"# 时间戳作为分数# 热搜榜ZINCRBY hot:search1"Redis教程"ZREVRANGE hot:search09WITHSCORES七、高级数据类型
7.1 Bitmaps 位图
# 设置位SETBIT user:sign:2024:101# 第1天签到SETBIT user:sign:2024:111# 第2天签到# 获取位GETBIT user:sign:2024:10# 统计签到天数BITCOUNT user:sign:2024:1# 查找第一个0或1BITPOS user:sign:2024:107.2 HyperLogLog 基数统计
# 添加元素PFADD uv:20240101"user1""user2""user3"# 获取基数(估算值)PFCOUNT uv:20240101# 合并多个HyperLogLogPFMERGE uv:total uv:20240101 uv:202401027.3 Geospatial 地理位置
# 添加位置GEOADD locations116.40439.915"北京"GEOADD locations121.47431.230"上海"# 获取位置坐标GEOPOS locations"北京"# 计算两地距离GEODIST locations"北京""上海"km# 查找附近位置GEORADIUS locations116.40439.915100km GEORADIUSBYMEMBER locations"北京"500km总结
本文我们学习了:
✅String:字符串、数值操作、应用场景
✅Hash:对象存储、购物车
✅List:消息队列、最新列表
✅Set:标签系统、集合运算
✅ZSet:排行榜、延时队列
✅高级类型:Bitmaps、HyperLogLog、Geospatial
下篇预告:Redis 从入门到精通(三):键操作命令详解
作者:刘~浪地球
系列:Redis 从入门到精通(二)
更新时间:2026-04-02
