Skip to content

Redis数据类型与操作

String

简介

Redis 的 String(字符串) 是最基础、最灵活的数据类型,可存储文本、数值或二进制数据(如图片、序列化对象)。其设计兼顾高效读写与原子操作,是 Redis 中使用最广泛的数据类型。

常用命令

命令
解释
示例
备注
SET为字符串键设置值set key value
MSET一次为多个字符串键设置值mset key1 value1 key2 value2要么同时成功,要么同时失败
GET获取字符串键的值set key value get key返回结果:value
GETSET获取指定键的值并更新键值为新输入的值set key1 人之初,性本善 getset key1 性相近,习相远返回结果:人之初,性本善 返回旧值并更新键值为新值,当再次执行 get key1 命令时将返回:性相近,习相远
SETNX只在键不存在的情况下,为字符串键设置值示例一 --之前未存储过键为key3的数据 setnx key3 value3 示例二 set key4 val4 setnx key4 newval4结果: 示例一执行成功 示例二执行失败 如果之前已存储过键为key3的数据不论是set存储还是setnx存储,并且没有删除,则执行该命令不会成功
MSETNX只在键不存在的情况下,一次为多个字符串键设置值msetnx key4 value4 key5 value5要么同时成功,要么同时失败
STRLEN获取字符串值的字节长度set key1 人之初,性本善 strlen key1返回结果:21 UTF-8编码中一个汉字(包括中文标点)占用3个字节
GETRANGE获取存储在键中的字符串值的一部分set key1 人之初,性本善 getrange key1 0 2返回结果:人 key:要操作的字符串键。 start 和 end:子串的起始和结束索引(包含两端,支持负数索引)。 正数索引:从0开始,0表示第一个字节,1表示第二个字节,依此类推。 负数索引:从字符串末尾开始,-1表示最后一个字节,-2表示倒数第二个,依此类推。 越界处理: 若索引超出字符串长度,自动调整为有效范围。 若start > end,返回空字符串。 注意是按字节数截取的哦!
SETRANGE修改字符串类型键值对的指定位置内容 从指定偏移量开始覆写字符串值--命令一 set key1 马到成功 --命令二 get key1 --命令三 setrange key1 0 码 --命令四 get key1返回结果: 命令二:马到成功 命令四:码到成功 命令三的含义是从第0个字节开始覆盖原值,注意偏移量0指的是字节哦 如果命令为 setrange key1 1 倒, 并不是将`到`字替换为`倒`字,而是从第一个字节开始覆盖,这样可能产生乱码 如果原字符串长度小于偏移量 offset,Redis 会用零字节填充原字符串末尾到 offset 之间的空白,再将 value 写入 比如原值为hello 执行命令 setrange key1 6 world 因为原值最大偏移量也就是5,所以会先以零字节补充直至偏移量达到6,而后再用value补充 最终结果为hello world,长度为11字节 键不存在时,视为空字符串处理,并根据 offset 和 value 生成新字符串
APPEND用于向指定键(key)对应的字符串值末尾追加内容append key value若key不存在,Redis会将其视为空字符串,然后执行追加操作。效果等同于 set key value 注意:即使原值为数字形式,APPEND仍按字符串处理,而非数学加法。
INCR用于对存储在指定键(key)中的整数值进行原子性递增操作incr key将键对应的值加1(仅限整数类型) 键不存在时,Redis会先将其值初始化为0,再执行INCR操作。最终结果为1 若key对应的值无法解析为整数(如字符串`abc`或浮点数3.14),Redis会返回错误:(error) ERR value is not an integer or out of range。 INCR是原子操作,适用于高并发场景(如计数器),确保线程安全
INCRBY用于对指定键(key)存储的整数值进行原子性递增,并允许自定义递增步长INCRBY key increment将key对应的整数值增加指定步长(increment,必须为整数) 适合高并发场景(如积分累加)
INCRBYFLOAT对指定键(key)存储的数值(整数或浮点数)进行原子性递增,并支持浮点数步长INCRBYFLOAT key increment将key对应的数值增加指定步长(increment,可为整数或浮点数) 键不存在时,Redis会先将其值初始化为0.0,再执行递增操作 键存在但非数值,(如字符串`abc`),Redis返回错误:(error) ERR value is not a valid float 与INCR/INCRBY相同,INCRBYFLOAT是原子操作,适用于高并发场景(如实时统计) Redis内部使用IEEE 754双精度浮点数存储,精度约17位小数 支持负步增长
DECR用于对存储在指定键(key)中的整数值进行原子性递减操作decr key将键对应的值减1(仅限整数类型) 键不存在时,Redis会先将其值初始化为0,再执行DECR操作。最终结果为-1 若key对应的值无法解析为整数(如字符串`abc`或浮点数3.14),Redis会返回错误:(error) ERR value is not an integer or out of range。 DECR是原子操作,适用于高并发场景(如库存扣减、实时计数器),确保线程安全
DECRBY用于对指定键(key)存储的整数值进行原子性递减,并允许自定义递减步长decrby key decrement将key对应的整数值减少指定步长(decrement,必须为整数) 适合高并发场景(如秒杀库存扣减) DECRBY key N 完全等价于 INCRBY key -N

Hash

简介

Redis 的 Hash(哈希表) 是一种用于存储字段-值(field-value pairs) 的数据结构,适合表示对象(如用户信息、商品属性)。它支持对单个字段的原子操作。

常用命令

命令
解释
示例
备注
HSET为哈希表中的字段设置值可批量操作hset user:1000 name John age 30若字段已存在则覆盖旧值,返回新增字段数量 Redis 4.0+支持批量操作
HMSET批量设置哈希表中的多个字段值 已逐步被HSET取代hmset user:1000 name John age 30 email john@example.com原子性操作,要么全部成功,要么全部失败
HGET获取哈希表中指定字段的值hget user:1000 name返回结果:John 若字段不存在返回(nil)
HMGET批量获取哈希表中多个字段的值hmget user:1000 name age返回结果: 1) John 2) 30 不存在的字段返回(nil)
HGETALL获取哈希表中所有字段和值hgetall user:1000返回结果交替显示字段和值: 1) name 2) John 3) age 4) 30 大哈希表慎用(可能阻塞服务器)
HDEL删除哈希表中一个或多个字段hdel user:1000 email返回成功删除的字段数量(不存在的字段会被忽略)
HEXISTS检查哈希表中是否存在指定字段hexists user:1000 name返回1(存在) 返回0(不存在)
HINCRBY将哈希表中的整数字段值增加指定步长hincrby user:1000 age 5返回新值:35 若字段不存在,先初始化为0再操作 非整数值会返回:(error) ERR hash value is not an integer
HINCRBYFLOAT将哈希表的数值字段(整数/浮点数)增加指定步长hincrbyfloat product:100 price 1.5支持负步长,返回字符串形式的新值(如31.5)
HKEYS获取哈希表中的所有字段名hkeys user:1000返回结果: 1) name 2) age 空哈希返回(empty list or set)
HVALS获取哈希表中的所有字段值hvals user:1000返回结果: 1) John 2) 30
HLEN获取哈希表中字段的数量hlen user:1000返回结果:2
HSETNX仅在字段不存在时设置哈希表字段的值示例一 hsetnx user:1000 address New York 示例二 hsetnx user:1000 name David结果: 示例一成功(新增address字段) 示例二失败(name字段已存在)
HSCAN增量迭代哈希表中的字段/值(适用于大哈希)hscan user:1000 0 match a*返回分页结果,匹配以a开头的字段 游标0表示迭代结束,非0值需继续迭代

List

简介

Redis的List结构说到底就是一个双向链表Redis-List结构

常用命令

命令
解释
示例
备注
LPUSH将一个或多个值插入列表头部(左侧)lpush mylist a b c返回操作后列表长度(如3) 若键不存在则自动创建新列表 多个元素按参数顺序插入,最终顺序为c b a
RPUSH将一个或多个值插入列表尾部(右侧)rpush mylist x y z返回操作后列表长度(如6) 插入顺序为x → y → z,列表变为c b a x y z
LPOP移除并返回列表头部(左侧)第一个元素lpop mylist返回结果:c 列表变为:b a x y z 若列表为空返回(nil)
RPOP移除并返回列表尾部(右侧)最后一个元素rpop mylist返回结果:z 列表变为:b a x y 支持附加参数RPOP count N(Redis 6.2+批量弹出)
LRANGE获取列表中指定范围的元素 只是获取,元素还会存在List中lrange mylist 0 -1返回所有元素: 1) b 2) a 3) x 4) y 索引规则: - 0表示第一个元素,-1表示最后一个元素 - 若end超出实际范围,自动截断到末尾
LLEN获取列表长度llen mylist返回结果:4 若键不存在返回0
LINDEX通过索引获取列表元素lindex mylist 2返回结果:x 支持负数索引(如-1表示最后一个元素) 索引越界返回(nil)
LINSERT从列表头开始查找,查找到第一个与命令相同的元素,并在其前/后插入新元素linsert mylist BEFORE x java返回操作后列表长度(如5) 列表变为:b a java x y 若基准元素(pivot)不存在返回-1 BEFORE/AFTER参数不区分大小写
LSET通过索引设置列表元素的值lset mylist 1 python操作后列表:b python java x y 索引越界返回错误:(error) ERR index out of range
LTRIM修剪列表,仅保留指定范围内的元素ltrim mylist 1 3保留索引1到3的元素,列表变为:python java x 原列表被永久修改,常用于限制列表长度
BLPOP阻塞式移除并返回列表头部第一个元素(支持多列表监控)blpop list1 list2 10若列表无元素,阻塞10秒等待数据 返回格式: 1) 列表名 2) 元素值 超时时间0表示无限阻塞
BRPOP阻塞式移除并返回列表尾部最后一个元素(支持多列表监控)brpop tasks 5行为与BLPOP类似,操作方向相反 典型应用:任务队列消费者
RPOPLPUSH原子性操作:从源列表尾部弹出元素,插入新目标列表头部rpoplpush source_list target_list若源列表为空返回(nil) 安全队列模式:处理任务时防止消费者崩溃丢失消息

Set

简介

Redis 的 Set(集合) 是一种基于哈希表实现的、存储无序唯一的字符串元素的数据结构。它支持高效的集合运算(如交集、并集、差集),适用于需要去重或快速判断成员存在的场景。

  • 唯一性
    每个元素在 Set 中仅出现一次,自动去重 示例:SADD users "Alice" "Bob" "Alice" → 实际存储 ["Alice", "Bob"]
  • 无序性
    元素没有固定顺序,不支持通过索引访问
  • 高效操作
    查询成员是否存在:SISMEMBER 时间复杂度 O(1)

常用命令

命令
解释
示例
备注
SADD向集合中添加一个或多个成员sadd myset apple banana cherry返回成功添加的成员数量(重复成员不计入) 若键不存在则自动创建新集合 时间复杂度:O(N),N为添加的成员数
SREM移除集合中一个或多个成员srem myset apple banana返回成功移除的成员数量 不存在的成员会被忽略
SMEMBERS获取集合中所有成员smembers myset返回结果无序(集合无序存储) 大集合慎用(可能阻塞服务器),建议使用SSCAN分页获取
SISMEMBER检查指定成员是否存在于集合中sismember myset cherry返回结果: 1(存在) 0(不存在) 时间复杂度:O(1)
SCARD获取集合的成员数量scard myset键不存在时返回0
SPOP随机移除并返回集合中的一个或多个成员spop myset spop myset 2默认移除1个成员,Redis 3.2+支持批量移除 集合为空时返回(nil)
SRANDMEMBER随机返回集合中的一个或多个成员(不移除)srandmember myset srandmember myset 3默认返回 1 个成员 正数参数返回不重复元素 负数参数允许返回重复元素(如`srandmember myset -5`)
SINTER返回多个集合的交集sinter set1 set2返回所有集合共有的成员 时间复杂度:O(N*M),N为最小集合大小,M为集合数量
SINTERSTORE将多个集合的交集存储到新集合中sinterstore new_set set1 set2返回新集合的成员数量
SUNION返回多个集合的并集sunion set1 set2时间复杂度:O(N),N为所有集合的总成员数
SUNIONSTORE将多个集合的并集存储到新集合中sunionstore new_set set1 set2目标集合已存在则覆盖内容
SDIFF返回第一个集合与其他集合的差集sdiff set1 set2返回结果: set1中独有且不在set2中的成员
SDIFFSTORE将差集存储到新集合中sdiffstore new_set set1 set2常用于数据过滤场景
SMOVE将成员从源集合移动到目标集合smove source_set dest_set apple原子性操作 若源集合不存在该成员,返回0则不执行任何操作 目标集合不存在则自动创建
SSCAN增量迭代集合中的成员(适用于大集合)--返回匹配以b开头的成员 sscan myset 0 match b*SSCAN key cursor [MATCH pattern] [COUNT count] cursor: 游标值,用于迭代过程中的位置标记。 初始调用时应使用 0 作为游标值,随后每次调用返回的游标值应用于下一次调用,直到游标返回为 0 表示遍历结束 MATCH pattern: 可选参数,用于过滤匹配特定模式的元素 COUNT count: 可选参数,提示 SSCAN 每次迭代返回的大致元素数量。 注意,这只是一个提示,实际返回的数量可能有所不同

SortedSet

简介

Redis 的 Sorted Set(有序集合) 是一种结合了 Set(唯一性)有序列表(排序能力) 特性的数据结构。每个元素关联一个 score(分数值),通过分数实现自动排序,同时保证元素的唯一性

  • 有序性 元素按 score 升序排列(默认),相同 score 的元素按字典序排序 示例:ZADD ranking 95 "Alice" 80 "Bob" 95 "Charlie" → 排序后为 Bob (80), Alice (95), Charlie (95)
  • 唯一性 元素(成员)唯一,但 score 可重复
  • 高效范围操作 支持基于 score 或字典序的范围查询(如排名、分页),时间复杂度低至 O(log N)
  • 混合存储 既能通过 score 操作,也能像 Hash 一样通过元素值直接访问

常用命令

命令
解释
示例
备注
ZADD向有序集合添加一个或多个成员(或更新分数)zadd leaderboard 100 Alice 95 Bob返回新增成员数量(重复成员会更新分数) 支持选项: - NX:仅新增成员(不更新现有成员) - XX:仅更新现有成员(不新增) - CH:返回被修改成员总数(新增+更新) - INCR:分数递增(类似ZINCRBY)
ZRANGE按分数升序返回指定索引范围的成员zrange leaderboard 0 -1 WITHSCORES返回结果: 1) Bob 2) 95 3) Alice 4) 100 参数说明: 0 -1:表示返回全部成员 WITHSCORES:同时返回分数
ZREVRANGE按分数降序返回指定索引范围的成员zrevrange leaderboard 0 1 WITHSCORES返回结果: 1) Alice 2) 100 3) Bob 4) 95 常用于排行榜TOP N查询
ZRANK获取成员在有序集合中的升序排名(从0开始)zrank leaderboard Alice返回结果:1(Alice在升序排名第2位)
ZREVRANK获取成员在有序集合中的降序排名(从0开始)zrevrank leaderboard Alice返回结果:0(Alice在降序排名第1位)
ZSCORE获取指定成员的分数zscore leaderboard Alice返回结果:100(字符串形式)
ZINCRBY为指定成员的分数增加增量值zincrby leaderboard 5 Alice返回新分数:105 若成员不存在,视为初始分数0并执行操作
ZREM移除有序集合中的一个或多个成员zrem leaderboard Bob返回成功移除的成员数量
ZCOUNT统计分数在指定区间内的成员数量zcount leaderboard 90 100返回结果:2(Alice和Bob) 区间表示: - 90:表示大于90 - 100:表示小于等于100
ZCARD获取有序集合的成员总数zcard leaderboard键不存在时返回0
ZRANGEBYSCORE按分数升序返回指定分数范围的成员zrangebyscore leaderboard 90 100 WITHSCORES等价于ZRANGE配合BYSCORE参数 支持无限区间:-inf +inf
ZREMRANGEBYRANK移除指定排名范围的成员zremrangebyrank leaderboard 0 0移除升序排名第1的成员(如Bob)
ZREMRANGEBYSCORE移除指定分数范围的成员zremrangebyscore leaderboard 0 90移除分数<=90的成员
ZPOPMAX移除并返回分数最高的成员(Redis 5.0+)zpopmax leaderboard 2可指定移除数量(默认1个)
BZPOPMAX阻塞式移除并返回分数最高的成员(Redis 5.0+)bzpopmax leaderboard 2可指定移除数量(默认1个)
ZPOPMIN移除并返回分数最低的成员(Redis 5.0+)zpopmin leaderboard默认移除1个成员
BZPOPMAX阻塞式移除并返回分数最高的成员(Redis 5.0+)bzpopmax leaderboard 2可指定移除数量(默认1个)
ZUNIONSTORE将多个有序集合的并集存储到新集合zunionstore new_set 2 set1 set2 WEIGHTS 2 3支持权重计算: 成员最终分数 = (set1分数*2) + (set2分数*3) AGGREGATE选项:SUM(默认)/MIN/MAX
ZINTERSTORE将多个有序集合的交集存储到新集合zinterstore new_set 2 set1 set2权重和聚合规则与ZUNIONSTORE相同