Redis 从入门到精通(二):数据类型详解

系列导读:本篇将深入讲解 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

相关推荐
小韩博2 小时前
代码审计-PHP原生开发篇&SQL注入&数据库监控&正则搜索&文件定位&静态分析
数据库·sql
qq_196976172 小时前
python的sql解析库-sqlparse
数据库·python·sql
s1mple“”3 小时前
大厂Java面试实录:从Spring Boot到AI技术的电商场景深度解析
spring boot·redis·微服务·kafka·向量数据库·java面试·ai技术
淡定一生23333 小时前
数据仓库建模方法
大数据·数据库·数据仓库
洛菡夕3 小时前
MySQL故障排查与生产环境优化
数据库·mysql
gjc5923 小时前
零基础OceanBase数据库入门(3):创建租户
数据库·oceanbase
l1t3 小时前
DeepSeek总结的 PostgreSQL 19:为 UPDATE/DELETE 添加 FOR PORTION OF 子句
大数据·数据库·postgresql
RestCloud3 小时前
如何用ETL实现多租户数据库的数据隔离与整合
数据库·数据仓库·etl·etlcloud·数据同步·数据集成平台·数据库传输
悢七3 小时前
单机部署 OceanBase 集群
数据库·ffmpeg·oceanbase