Redis 数据类型详解

Redis 数据类型详解

Redis 是一个高性能的键值存储系统,支持多种数据类型,每种类型都有其特定的使用场景和操作命令。以下是 Redis 主要数据类型的详细介绍:

一、基本数据类型

1. String(字符串)

特点

  • 最基本的数据类型,二进制安全
  • 最大能存储 512MB
  • 可以是字符串、整数或浮点数

常用命令

bash 复制代码
SET key value        # 设置值
GET key             # 获取值
INCR key            # 值递增1
DECR key            # 值递减1
INCRBY key increment # 值增加指定数值
APPEND key value    # 追加值
STRLEN key          # 获取字符串长度
MSET key1 val1 key2 val2 # 批量设置
MGET key1 key2      # 批量获取

应用场景

  • 缓存简单数据
  • 计数器(文章阅读量)
  • 分布式锁
  • 存储序列化对象

2. Hash(哈希)

特点

  • 键值对集合,适合存储对象
  • 每个 hash 可存储 2³² - 1 个字段

常用命令

bash 复制代码
HSET key field value  # 设置字段值
HGET key field        # 获取字段值
HMSET key field1 val1 field2 val2 # 批量设置
HMGET key field1 field2 # 批量获取
HGETALL key           # 获取所有字段和值
HDEL key field        # 删除字段
HLEN key              # 获取字段数量
HKEYS key             # 获取所有字段名
HVALS key             # 获取所有字段值

应用场景

  • 存储用户信息(用户ID为key,字段对应属性)
  • 商品详情存储
  • 购物车实现(用户ID为key,商品ID为field,数量为value)

3. List(列表)

特点

  • 有序字符串集合
  • 可从头或尾插入/删除元素
  • 最大长度 2³² - 1

常用命令

bash 复制代码
LPUSH key value1 value2 # 头部插入
RPUSH key value1 value2 # 尾部插入
LPOP key              # 头部弹出
RPOP key              # 尾部弹出
LRANGE key start stop # 获取指定范围元素
LLEN key              # 获取列表长度
LINDEX key index      # 获取指定位置元素
LTRIM key start stop  # 裁剪列表

应用场景

  • 消息队列(LPUSH+BRPOP)
  • 最新消息排行(朋友圈时间线)
  • 记录用户操作历史

4. Set(集合)

特点

  • 无序、唯一的字符串集合
  • 支持交集、并集、差集运算
  • 最大成员数 2³² - 1

常用命令

bash 复制代码
SADD key member1 member2 # 添加成员
SREM key member         # 删除成员
SMEMBERS key            # 获取所有成员
SCARD key               # 获取成员数量
SISMEMBER key member    # 判断成员是否存在
SINTER key1 key2        # 交集
SUNION key1 key2        # 并集
SDIFF key1 key2         # 差集
SPOP key                # 随机移除并返回成员

应用场景

  • 标签系统(文章标签)
  • 共同好友/兴趣推荐
  • 抽奖系统(随机获取成员)
  • 数据去重

5. Sorted Set(有序集合)

特点

  • 唯一成员关联score进行排序
  • 成员唯一,score可重复
  • 按score从小到大排序

常用命令

bash 复制代码
ZADD key score1 member1 score2 member2 # 添加成员
ZRANGE key start stop [WITHSCORES] # 按索引范围获取
ZREVRANGE key start stop [WITHSCORES] # 逆序获取
ZRANK key member      # 获取成员排名(升序)
ZREVRANK key member   # 获取成员排名(降序)
ZSCORE key member     # 获取成员分数
ZCOUNT key min max    # 分数区间成员数
ZREM key member       # 删除成员
ZCARD key             # 获取成员数量

应用场景

  • 排行榜(游戏积分榜)
  • 带权重的消息队列
  • 范围查找(查找分数在某个区间的成员)

二、高级数据类型

1. Bitmaps(位图)

特点

  • 通过位操作存储布尔值
  • 极大节省存储空间
  • 基于String类型实现

常用命令

bash 复制代码
SETBIT key offset value # 设置位
GETBIT key offset      # 获取位
BITCOUNT key [start end] # 统计值为1的位数
BITOP operation destkey key1 key2 # 位运算(AND/OR/XOR/NOT)

应用场景

  • 用户签到统计
  • 活跃用户统计
  • 布隆过滤器实现

2. HyperLogLog

特点

  • 用于基数统计(估算集合中不重复元素数量)
  • 误差率约0.81%
  • 固定使用12KB内存

常用命令

bash 复制代码
PFADD key element1 element2 # 添加元素
PFCOUNT key1 key2          # 估算基数
PFMERGE destkey sourcekey1 sourcekey2 # 合并多个HLL

应用场景

  • 网站UV统计
  • 大规模去重计数

3. Geospatial(地理空间)

特点

  • 存储地理位置坐标
  • 支持半径查询
  • 基于Sorted Set实现

常用命令

bash 复制代码
GEOADD key longitude latitude member # 添加位置
GEOPOS key member                  # 获取位置
GEODIST key member1 member2 [unit] # 计算距离
GEORADIUS key longitude latitude radius unit # 半径查询

应用场景

  • 附近的人
  • 地理位置搜索
  • 配送距离计算

4. Stream(流)

特点

  • Redis 5.0引入
  • 消息队列功能
  • 支持消费者组

常用命令

bash 复制代码
XADD key ID field1 value1 field2 value2 # 添加消息
XREAD [COUNT count] [BLOCK ms] STREAMS key ID # 读取消息
XRANGE key start end [COUNT count] # 范围查询
XGROUP CREATE key groupname ID     # 创建消费者组
XREADGROUP GROUP groupname consumer COUNT num STREAMS key ID # 消费者组读取

应用场景

  • 消息队列
  • 事件溯源
  • 日志收集

三、数据类型选择指南

数据类型 适用场景 不适用场景
String 简单键值、计数器 需要存储结构化数据
Hash 对象存储、属性频繁修改 需要单独过期时间的字段
List 队列、时间线 需要快速随机访问中间元素
Set 去重、集合运算 需要排序的数据
Sorted Set 排行榜、范围查询 简单键值存储
Bitmap 布尔统计、位操作 非布尔值存储
HyperLogLog 大数据量去重统计 需要精确计数的场景
Geo 地理位置应用 非地理位置数据
Stream 消息队列、事件流 简单键值存储

四、性能优化建议

  1. 合理选择数据类型:根据业务需求选择最合适的数据类型
  2. 控制大Key:单个String不超过10KB,集合元素不超过5000
  3. 使用批量操作:MSET/HMSET/PIPELINE减少网络开销
  4. 注意时间复杂度:避免O(N)命令在大集合上使用
  5. 利用过期时间:对临时数据设置TTL

五、实际应用示例

1. 用户会话存储

bash 复制代码
# 使用Hash存储用户信息
HMSET user:1001 username "john" email "[email protected]" last_login "2023-05-20"
EXPIRE user:1001 3600  # 1小时后过期

2. 商品排行榜

bash 复制代码
# 使用Sorted Set存储商品销量排行
ZADD products:sales 1500 "item:1001" 3200 "item:1002" 800 "item:1003"
ZREVRANGE products:sales 0 9 WITHSCORES  # 获取销量前10

3. 每日活跃用户统计

bash 复制代码
# 使用Bitmap记录用户活跃状态
SETBIT activity:20230520 1001 1  # 用户1001在2023-05-20活跃
BITCOUNT activity:20230520       # 统计当日活跃用户数

Redis的数据类型设计使其能够高效解决各种场景下的数据存储问题,合理利用这些数据类型可以极大提升系统性能和开发效率。

相关推荐
bing_15822 分钟前
Mybatis 如何自定义缓存?
java·缓存·mybatis
杭州杭州杭州44 分钟前
MySQL超全笔记
数据库·笔记·mysql
OpenVINO生态社区2 小时前
【汽车功能安全:软件与硬件缺一不可】
数据库·安全·汽车
程序猿阿伟4 小时前
《打破SQL与AI框架对接壁垒,解锁融合新路径》
数据库·人工智能·sql
点燃大海4 小时前
MySQL表结构导出(Excel)
java·数据库·python·mysql·spring
一切皆有迹可循4 小时前
IntelliJ IDEA中Spring Boot 3.4.x+集成Redis 7.x:最新配置与实战指南
spring boot·redis·intellij-idea
꧁坚持很酷꧂4 小时前
Qt远程连接数据库,注册,登录
开发语言·数据库·qt
加油,旭杏4 小时前
【Redis】服务端高并发分布式结构
数据库·redis·分布式
꧁༺朝花夕逝༻꧂5 小时前
MySQL--数据备份
数据库·mysql
共享家95277 小时前
Linux常用命令详解:从基础到进阶
linux·服务器·数据库