Redis常见的数据结构:String,List,Set,Zset,Hash
1.String
- 描述:一个key对应一个value。value可以是:
- 文本字符串(最大512MB)
- 二进制安全的字节序列
- 整数或浮点数
- 核心命令:
- SET key value [EX seconds|PX milliseconds] [NX|XX]: 设置值 (可设置过期、NX-键不存在才设置、XX-键存在才设置)。
- GET key: 获取值。
- INCR key / DECR key: 将存储的整数值增一/减一。
- INCRBY key increment / DECRBY key decrement: 按指定步长增减整数值。
- INCRBYFLOAT key increment: 增加浮点数值。
- APPEND key value: 追加字符串。
- GETRANGE key start end: 获取子字符串。
- SETRANGE key offset value: 覆盖部分字符串。
- STRLEN key: 获取字符串长度。
- MSET key1 value1 [key2 value2 …] / MGET key1 [key2 …]: 批量设置/获取多个键值。
- 用法
- 缓存HTML片段、API相应,数据库查询结果
- 计算器(页面访问量,点赞数,库存扣减)
- 分布式锁
- 对象(需要序列化/反序列化)
2.Hash
- 描述:一个key对应一个 __字段-值集合(field-value)__对的集合。适合存对象。
- 核心命令:
- HSET key field value [field value …]: 设置一个或多个字段的值。
- HGET key field: 获取指定字段的值。
- HMSET key field value [field value …]: 批量设置多个字段 (已弃用,用 HSET 替代)。
- HMGET key field1 [field2 …]: 批量获取多个字段的值。
- HGETALL key: 获取哈希中 所有 字段和值。
- HDEL key field1 [field2 …]: 删除一个或多个字段。
- HEXISTS key field: 检查字段是否存在。
- HKEYS key: 获取哈希中所有字段名。
- HVALS key: 获取哈希中所有字段值。
- HLEN key: 获取哈希中字段的数量。
- HINCRBY key field increment: 将哈希中指定字段的整数值增加指定步长。
- HINCRBYFLOAT key field increment: 将哈希中指定字段的浮点数值增加指定步长。
- HSCAN key cursor [MATCH pattern] [COUNT count]: 增量迭代哈希中的字段 (用于大型哈希)。
3.List
- 描述: 一个键 (key) 对应一个有序的字符串元素序列。元素按插入顺序排序。可以在列表的头部 (Left) 或 尾部 (Right) 高效地添加/删除元素。支持基于下标的访问。
- 核心命令:
- LPUSH key element [element …]: 将一个或多个元素插入列表头部。
- RPUSH key element [element …]: 将一个或多个元素插入列表尾部。
- LPOP key [count]: 移除并返回列表头部的一个或多个元素。
- RPOP key [count]: 移除并返回列表尾部的一个或多个元素。
- LLEN key: 获取列表长度。
- LRANGE key start stop: 获取列表中指定下标范围 (闭区间) 的元素。
- LINDEX key index: 获取列表中指定下标的元素。
- LSET key index element: 设置列表中指定下标的元素值。
- LINSERT key BEFORE|AFTER pivot element: 在列表中指定元素 (pivot) 的前面或后面插入新元素。
- LREM key count element: 移除列表中指定数量的匹配元素 (count>0 从头找;count<0 从尾找;count=0 移除所有)。
- LTRIM key start stop: 修剪列表,只保留指定下标范围内的元素。
- BLPOP key1 [key2 …] timeout / BRPOP key1 [key2 …] timeout: 阻塞版本的 LPOP/RPOP,在列表为空时阻塞客户端直到超时或有元素可弹出。
- RPOPLPUSH source destination / BRPOPLPUSH source destination timeout: 原子地从 source 列表尾部弹出元素并插入到 destination 列表头部 (阻塞版本 BRPOPLPUSH 可用)。
- 用法
- 消息队列: LPUSH (生产者) + BRPOP (消费者) 实现简单的 FIFO 队列。RPOPLPUSH 可用于实现安全队列 (处理失败后元素还在备份列表)。
- 时间线/最新列表: LPUSH 添加新项目,LTRIM 保持列表长度 (如最新 100 条微博)。
- 生产者-消费者模型: 多个生产者 LPUSH,多个消费者 BRPOP 并行工作。
- 记录操作日志: 按顺序记录用户操作或系统事件。
- 分页: 使用 LRANGE 获取特定页面的数据。
4.Set
- 描述:一个键 (key) 对应一个无序的、唯一的字符串元素集合。不允许重复元素。提供高效的集合运算 (交集、并集、差集)。
- 核心命令:
- SADD key member [member …]: 向集合添加一个或多个成员。
- SREM key member [member …]: 从集合移除一个或多个成员。
- SMEMBERS key: 返回集合中的所有成员 (注意:对于大集合慎用,会阻塞服务端)。
- SISMEMBER key member: 检查成员是否在集合中。
- SCARD key: 获取集合成员数量。
- SPOP key [count]: 随机移除并返回集合中的一个或多个成员。
- SRANDMEMBER key [count]: 随机返回集合中的一个或多个成员 (不移除)。
- SINTER key [key …]: 计算多个集合的交集。
- SUNION key [key …]: 计算多个集合的并集。
- SDIFF key [key …]: 计算第一个集合与其他集合的差集 (在第一个集合中但不在其他集合中的元素)。
- SINTERSTORE destination key [key …] / SUNIONSTORE destination key [key …] / SDIFFSTORE destination key [key …]: 将交集/并集/差集的结果存储到一个新的 destination 集合中。
- SSCAN key cursor [MATCH pattern] [COUNT count]: 增量迭代集合中的成员。
- SMOVE source destination member: 将成员从 source 集合移动到 destination 集合。
- 用法:
- 唯一性保证: 存储用户 ID、标签 (Tag)、IP 地址等需要去重的数据。
- 标签系统: 给文章/商品打标签 (SADD article:1000:tags redis database),查找具有特定标签的所有文章 (SINTER tag:redis:articles tag:database:articles)。
- 社交关系: 存储用户的关注列表 (SADD user:1000:followers 2000)、粉丝列表 (SADD user:2000:following 1000),判断是否关注 (SISMEMBER),计算共同关注 (SINTER user:1000:followers user:2000:followers)。
- 抽奖/随机推荐: SPOP 或 SRANDMEMBER 实现随机选取。
5.ZSet
- 描述:一个键 (key) 对应一个有序的、唯一的字符串元素集合。每个元素都关联一个分数 (Score), 类型为双精度浮点数。元素根据分数从小到大排序。分数可以相同,如果分数相同,则按成员的字典序排序。集合成员唯一,但分数可以更新。
- 核心命令:
- ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member …]: 添加或更新成员及其分数。选项丰富 (NX-仅添加新成员,XX-仅更新现有成员,GT-新分数大于当前分数才更新,LT-新分数小于当前分数才更新,CH-返回被修改成员的数量,INCR-分数增加)。
- ZREM key member [member …]: 移除一个或多个成员。
- ZSCORE key member: 获取成员的分数。
- ZRANK key member / ZREVRANK key member: 获取成员在排序中的正序排名 (从0开始) / 逆序排名 (从0开始)。
- ZRANGE key start stop [WITHSCORES]: 按分数升序返回指定排名范围的成员 (带 WITHSCORES 返回分数)。
- ZREVRANGE key start stop [WITHSCORES]: 按分数降序返回指定排名范围的成员。
- ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]: 返回分数在 min 和 max 之间的成员 (升序)。
- ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]: 返回分数在 max 和 min 之间的成员 (降序)。
- ZCARD key: 获取成员数量。
- ZCOUNT key min max: 计算分数在 min 和 max 之间的成员数量。
- ZINCRBY key increment member: 将成员的分数增加指定步长。
- ZINTERSTORE destination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX]: 计算多个有序集合的交集并存储到 destination (可加权,可指定聚合方式:SUM-分数相加, MIN-取最小分数, MAX-取最大分数)。
- ZUNIONSTORE destination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX]: 计算多个有序集合的并集并存储到 destination。
- ZSCAN key cursor [MATCH pattern] [COUNT count]: 增量迭代有序集合中的成员。
- ZRANGEBYLEX key min max [LIMIT offset count] / ZREVRANGEBYLEX key max min [LIMIT offset count]: 按字典序范围查询成员 (要求所有成员分数相同!)。
- ZLEXCOUNT key min max: 计算字典序在 min 和 max 之间的成员数量 (要求所有成员分数相同!)。
- 用法:
- 排行榜: 最经典场景 (ZADD leaderboard 1000 “PlayerA”, ZREVRANGE leaderboard 0 9 WITHSCORES 获取 Top10)。
- 带权重的队列/优先级队列: 分数代表优先级,ZRANGEBYSCORE … LIMIT 0 1 获取最高优先级的任务。
- 范围查询: 按时间戳排序的事件 (ZADD events 1645584000 “event1”),查找特定时间范围内的事件 (ZRANGEBYSCORE events start_timestamp end_timestamp)。
- 延迟队列: 任务执行时间戳作为分数,定时任务轮询 ZRANGEBYSCORE … WITHSCORES 获取到期任务。
- 带分数的去重集合: 需要同时满足唯一性和按某种权重排序的场景。