Redis 数据类型详细介绍

114 阅读11分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天,点击查看活动详情

strings(字符串)

strings 类型 Redis 最基本的数据类型,它是二进制安全的,即 Redis 的 string 类型可以存放任何数据,比如一张经过 base64 编码的图片或者一个序列化的 Ruby 对象。Redis 的字符串可以支持任意形式的数据,但是对于过大的文件不适合存入 Redis 中,一方面系统内存有限,另外一方面字符串类型的值最多能存储 512MB 字节的内容。接下来我们就一起来学习管理 string 类型数据的相关命令。

➡️ string 类型数据的相关命令

  • set key value:设置指定的 key 值。

  • get key:获取指定 key 的值

  • getrange key start end:返回 key 中字符串的子字符(下标从 0 开始,getrange key 0 -1 表示返回整个字符串)。

  • getset key value:将给定 key 的值设为 value ,并返回 key 的旧值(old value)。

  • getbit key offset:对 key 所储存的字符串值,获取指定偏移量上的位(bit),当偏移量 offset 比字符串值的长度大,或者 key 不存在时,返回 0 。

  • mget key1 [key2 ...]:获取一个或多个给定 key 的值。

  • setbit key offset value:对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit),其中 bit 值只有 0 或 1。

  • setex key seconds value:为指定的 key 设置值及其过期时间。如果 key 已经存在, SETEX 命令将会替换旧的值。

  • setnx key value:在指定的 key 不存在时,为 key 设置指定的值。设置成功,返回 1 ; 设置失败,返回 0 。

  • setrange key offset value:指定的字符串覆盖给定 key 所储存的字符串值,覆盖的位置从偏移量 offset 开始。返回被修改后的字符串的长度。

  • strlen key:返回 key 所存储的字符串值的长度。

  • mset key value [key value ...]:同时设置一个或多个 key-value 键值对。

  • msetnx key value [key value ...]:同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。当所有 key 都成功设置,返回 1 ;如果所有给定 key 都设置失败(至少有一个 key 已经存在),那么返回 0 。

  • psetex key milliseconds value:它与 setex 命令类似,但其是以毫秒为单位设置 key 的生存时间。

  • incr key:将 key 中储存的数字值增一。如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 incr 操作。返回增一之后,key 的值。

  • incrby key increment:将 key 中储存的数字加上指定的增量值。如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 incrby 命令。返回指定的增量值之后,key 的值。

  • incrbyfloat key increment:为 key 中所储存的值加上指定的浮点数增量值。如果 key 不存在,那么 incrbyfloat 会先将 key 的值设为 0 ,再执行加法操作。返回执行 incrbyfloat 操作之后,key 的值。

  • decr key:将 key 中储存的数字值减一。如果 key 不存在,那么 key 的值会先被初始化为 0,然后在执行 decr 操作。返回执行操作后的 key 的值。

  • decrby key decrement:将 key 中储存的数字减去指定的减量值。如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 decrby 命令。返回指定的减量值之后,key 的值。

  • append key value:为指定的 key 追加值。如果 key 已经存在并且是一个字符串, append 命令将 value 追加到 key 原来的值的末尾;如果 key 不存在, append 就简单地将给定 key 设为 value ,就像执行 set key value 一样。 string 类型常用使用场景

  • 缓存:热点数据缓存(例如报表、明星新闻),对象缓存、全页缓存、可以提升热点数据的访问数据。

  • 数据共享分布式:由于 Redis 是分布式的独立服务,可以在多个应用之间共享。比如:分布式 Session。

  • 分布式锁:Redis 中的 setnx 命令,当 key 不存在时才能添加成功,返回 1;当 key 存在时不能添加成功 ,返回 0。比如:一些热门的抢购业务,就可以使用分布式锁。

  • 全局 ID:基于 incriby 命令,利用原子性。比如:分库分表的场景。

  • 限流:基于 incr 命令,以访问者的 ip 和其他信息作为 key,访问一次增加一次计数,超过次数则返回 false。

  • 计数器:基于 incr 命令。比如:文章的阅读量、微博点赞数、允许一定的延迟,先写入 Redis 再定时同步到数据库。

lists(列表)

Redis 中的 lists 是基于 Linked Lists 实现的。这也就意味着即使在一个 list 中有数百万个元素,在头部或尾部添加一个元素的操作,其时间复杂度也是常数级别的。但是在 linked list 实现的 list 上进行访问操作就没有那么快。如果要想访快速访问集合元素,建议使用可排序集合(sorted sets)。接下来我们就一起来学习管理 list 类型数据的相关命令。

➡️ list 类型数据的相关命令

  • lpush key value1 [value2 ...]:将一个或多个值插入到列表头部。 如果 key 不存在,一个空列表会被创建并执行 lpush 操作。 当 key 存在但不是列表类型时,返回一个错误。成功执行之后,返回列表的长度。
  • lpushx key value:将一个或多个值插入到已存在的列表头部,列表不存在时操作无效。成功执行后,返回列表的长度。
  • lrange key start stop:返回列表中指定区间内的元素,区间以偏移量 start 和 end 指定。 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
  • blpop key1 [key2...] timeout:移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
  • brpop key1 [key2...] timeout:移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
  • brpoplpush source destination timeout:从列表中取出最后一个元素,并插入到另外一个列表的头部; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
  • lindex key index:通过索引获取列表中的元素。这里的索引下标可以是负数,比如 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
  • linsert key before|after pivot value:用于在列表的元素前或者后插入元素。当指定元素不存在于列表中时,不执行任何操作;当列表不存在时,被视为空列表,不执行任何操作;如果 key 不是列表类型,返回一个错误。
  • llen key:返回列表的长度。 如果列表 key 不存在,则 key 被解释为一个空列表,返回 0 ; 如果 key 不是列表类型,返回一个错误。
  • lpop key:移除并返回列表的第一个元素。
  • lrem key count value:根据参数 count 的值,移除列表中与参数 value 相等的元素。
✨ 说明:

count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
count = 0 : 移除表中所有与 value 相等的值。
  • lset key index value:通过索引来设置元素的值。当索引参数超出范围,或对一个空列表进行 lset 时,返回一个错误

  • ltrim key start stop:对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。

  • rpop key:用于移除列表的最后一个元素,返回值为移除的元素。返回值为被移除的元素;如果列表不存在,返回 nil

  • rpoplpush source destination:用于移除列表的最后一个元素,并将该元素添加到另一个列表并返回。返回被移除的元素。

  • rpush key value1 [value2 ...]:将一个或多个值插入到列表的尾部(最右边)。如果列表不存在,一个空列表会被创建并执行 RPUSH 操作。 当列表存在但不是列表类型时,返回一个错误。成功执行命令后,返回列表的长度。

  • rpushx key value:用于将一个值插入到已存在的列表尾部(最右边)。如果列表不存在,操作无效。成功执行命令后,返回列表的长度。 ➡️ list 类型常用使用场景

  • 消息排队:list 提供了两个阻塞的弹出操作(blpop/brpop),可以设置超时时间。

    队列:先进先出。右边进入队列(rpush),左边出队列(blpop)。

    栈:先进后出。入栈(rpush),出栈(blpop)。

hashs(哈希)

Redis 中的 hash 是一个 string 类型的 field(字段)和 value(值)的映射表,其特别适用于存储对象。可以将 hash 集合看成多个 key-value 将键值对组成的。接下来我们就一起来学习管理 hashs 类型数据的相关命令。

➡️ hash 类型数据的相关命令

  • hmset key field1 value1 [field2 value2 ...]:用于同时将多个 field-value (字段-值)对设置到哈希表中。如果哈希表中已存在此字段,则覆盖存在的字段;如果哈希表中不存在,会创建一个空哈希表,并执行 hmset 操作。

  • hgetall key:用于返回哈希表中,所有的字段和值。

  • hset key field value:用于为哈希表中的字段赋值。如果哈希表不存在,一个新的哈希表被创建并进行 hset 操作;如果字段已经存在于哈希表中,旧值将被覆盖。

  • hsetnx key field value:为哈希表中不存在的字段赋值。如果哈希表不存在,一个新的哈希表被创建并进行 hsetnx 操作;如果字段已经存在于哈希表中,则操作无效;如果 key 不存在,一个新哈希表被创建并执行 hsetnx 命令。

  • hexists key field:查看哈希表的指定字段是否存在。

  • hget key field:获取哈希表中指定字段的值。

  • hincrby key field increment:为哈希表中的字段值加上指定增量值。增量也可以为负数,相当于对指定字段进行减法操作。

  • hincrbyfloat key field increment:为哈希表中的字段值加上指定浮点数增量值。

  • hkeys key:获取哈希表中的所有字段(field)。

  • hlen key:获取哈希表中字段的数量。

  • hvals key:获取哈希表中所有的值。

  • hscan key cursor [match pattern] [count count]:用于迭代哈希表中的键值对。其中 cursor 表示游标,起始位置;[match pattern] 表示匹配的方式,可以使用正则;[count count] 表示指定从哈希表中返回多少元素,默认值为 10。 hash 类型常用使用场景

  • 存储对象信息:可以存储一些用户信息以及一些经常变动的信息。

sets(集合)

Redis 中 set 相当于 Java 语言中的 HashSet,其内部的键值对是无序且唯一的。Redis 中 set 是通过哈希表实现的,故其添加、删除、查找的复杂度都是 O(1)。接下来我们就一起来学习管理 set 类型数据的相关命令。

➡️ set 类型数据的相关命令

  • sadd key member1 [member2 ...]:向集合中添加一个或多个元素,已经存在集合中的元素将被忽略。
  • scard key :获取集合中元素的数量。
  • sdiff key1 [key2]:返回第一个集合与其他集合中的差集,不存在集合 key 将被看作空集。注意,返回的差集来自前面的集合而不是后面的集合
  • sdiffstore destination key1 [key2]:将给定集合中之间的差集存储在指定的集合中。如果指定的集合 key 已存在,则会被覆盖。
  • sismember key member:判断元素是否是集合的成员
  • smembers key:返回集合中的所有成员。
  • smove source destination member:将一个存在的集合中的元素移动到另一个指定的集合中。
✨ 这里大家需要明确知道以下几点:

如果集合中的不存在或不包含指定移动的元素,则 `smove` 不做任何操作,仅返回 0;否则,将元素移动到指定的集合中,并且返回 1。
如果 `destination` 集合中已经包含了移动的元素,`smove` 命令只是简单的将 `source` 集合中的元素删除。
当 `destination` 和 `source` 不是集合类型时,会返回错误
  • spop key:移除指定集合中的一个或多个随机元素,移除后会返回移除的元素。
  • srandmember key [count]:获取集合中一个或多个随机元素。

📖 注意:如果 count 为正数且小于集合长度,则返回一个包含 count 个元素的数组,数组中的元素各不相同;如果 count 大于等于集合基数,那么返回整个集合;如果 count 为负数,则返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。

  • srem key member1 [member2]:移除集合中一个或多个元素,如果元素不存在则被忽略。

  • sunion key1 [key2]:返回给定集合的并集。不存在的集合被看作空集。

  • sinter key1 [key2] :返回两个集合的交集。不存在的集合被看作空集。

  • sunionstore destination key1 [key2]:将集合中的并集存储在指定的集合 destination 中。如果 destination 已经存在,则将其覆盖。

  • sscan key cursor [match pattern] [count count]:用于迭代集合中的元素。其中 cursor 表示游标,起始位置;[match pattern] 表示匹配的方式,可以使用正则;[count count] 表示指定从集合中返回多少元素,默认值为 10。 set 类型常用使用场景

  • 用户关注、推荐模型

比如:相互关注、我关注的人也关注了他(取交集)、可能认识的人(差集)等。

zsets(有序集合)

Redis 中的 zsets 集合和 set 集合一样,都是 string 类型元素的集合,并且都不允许元素重复。但是之间的区别是,zsets 集合的每个元素都会关联一个 double 类型分数,然后 Redis 就会通过这个分数来对集合中的元素进行从小到大排序。虽然 zset 集合中的元素不能重复,但是分数是可以重复的。接下来我们就一起来学习管理 zset 类型数据的相关命令。

➡️ zset 类型数据的相关命令

  • zadd key score1 member1 [score2 member2...]:向有序集合中添加一个或多个元素及其元素对应的分数。如果某个元素已经是有序集的成员,那么更新这个元素的分数值,并通过重新插入这个元素,来保证该元素在正确的位置上。这里分数值可以是整数,也可以是双精度浮点数。
  • zrange key start stop [withscores]:返回有序集合中指定区间内的元素。其中成员的位置按分数值递增来排序(如果分数值相同的元素按字典顺序排列)。这里的下标可以正数,比如 0 表示第一个元素,1 表示第二个元素,以此类推;也可以是负数,比如 -1 表示最后一个元素,-2 表示倒数第二个元素,以此类推。
  • zcard key:获取有序集合中元素的数量。
  • zcount key min max:统计有序集合中指定分数区间的成员数量。
  • zincrby key increment member:对有序集合中指定元素的分数加上增量。这里的增量可以是正数(表示增加),也是是负数(表示减少)。
  • zinterstore destination numkeys key1 [key2...]:统计给定的一个或多个有序集合的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination 集合中。默认情况下,结果集中某个成员的分数值是所有给定集合下该成员分数值之和。
  • zlexcount key min max:统计有序集合中指定字典区间内成员的数量。
  • zrangebylex key min max [limit offset count]:通过字典区间返回有序集合的成员。
  • zrangebyscore key min max [withscores] [limit] :获取有序集合中指定分数区间的成员列表。其中成员按分数值递增来排序(如果分数值相同的元素按字典顺序排列)。
  • zrangebyscore key min max [withscores] [limit] :获取有序集合中指定分数区间的成员列表。其中成员按分数值递增来排序(如果分数值相同的元素按字典顺序排列)。
  • zrem key member [member ...]:用于移除有序集中的一个或多个成员,不存在的成员将被忽略。
  • zremrangebylex key min max:移除有序集合中给定的字典区间的所有成员
  • zremrangebyrank key start stop:用于移除有序集合中指定排名区间内的所有成员。
  • zremrangebyscore key min max:用于移除有序集合中指定分数区间内的所有成员。
  • zrevrange key start stop [withscores] :获取有序集合中指定区间内的成员。其中成员的位置按分数值递减来排序(如果分数值相同的元素按字典逆序排列)。
  • zrevrangebyscore key max min [withscores]:获取有序集合中指定分数区间内的所有成员。其中成员的位置按分数值递减来排序(如果分数值相同的元素按字典逆序排列)。
  • zrevrank key member:获取有序集合中成员的排名。其中有序集成员按分数值递减排序。排名以 0 为底,也就是说, 分数值最大的成员排名为 0 。
  • zscore key member:返回有序集合中成员的分数值。如果成员元素不是有序集合 key 的成员,或 key 不存在,返回 nil 。
  • zunionstore destination numkeys key1 [key2...]:统计给定的一个或多个有序集的并集,其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destination 集合中。
  • zscan key cursor [match pattern] [count count]:迭代有序集合中的成员(包括元素和分数)。其中 cursor 表示游标,起始位置;[match pattern] 表示匹配的方式,可以使用正则;[count count] 表示指定从集合中返回多少元素,默认值为 10。