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 | 消息队列、事件流 | 简单键值存储 |
四、性能优化建议
- 合理选择数据类型:根据业务需求选择最合适的数据类型
- 控制大Key:单个String不超过10KB,集合元素不超过5000
- 使用批量操作:MSET/HMSET/PIPELINE减少网络开销
- 注意时间复杂度:避免O(N)命令在大集合上使用
- 利用过期时间:对临时数据设置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的数据类型设计使其能够高效解决各种场景下的数据存储问题,合理利用这些数据类型可以极大提升系统性能和开发效率。