Redis学习笔记(3)-Hash、List命令

1、前言

接着前面的《常用的通用命令和String命令》继续学习Redis的命令。

2、Hash的命令
  1. HSET
    格式: HSET hash field value
    功能: 将哈希表 hash 中域 field 的值设置为 value 。如果给定的哈希表并不存在, 那么一个新的哈希表将被创建并执行 HSET 操作。如果域 field 已经存在于哈希表中, 那么它的旧值将被新值 value 覆盖。
    时间复杂度: O(1)
    返回值: 当 HSET 命令在哈希表中新创建 field 域并成功为它设置值时, 命令返回 1 ; 如果域 field 已经存在于哈希表, 并且 HSET 命令成功使用新值覆盖了它的旧值, 那么命令返回 0 。
    在这里插入图片描述

  2. HSETNX
    格式: HSETNX hash field value
    功能: 当且仅当域 field 尚未存在于哈希表的情况下, 将它的值设置为 value 。如果给定域已经存在于哈希表当中, 那么命令将放弃执行设置操作。如果哈希表 hash 不存在, 那么一个新的哈希表将被创建并执行 HSETNX 命令。
    时间复杂度: O(1)
    返回值: HSETNX 命令在设置成功时返回 1 , 在给定域已经存在而放弃执行设置操作时返回 0 。

  3. HGET
    格式: HGET hash field
    功能: 返回哈希表中给定域的值。
    时间复杂度: O(1)
    返回值: HGET 命令在默认情况下返回给定域的值。如果给定域不存在于哈希表中, 又或者给定的哈希表并不存在, 那么命令返回 nil 。
    在这里插入图片描述

  4. HEXISTS
    格式: HEXISTS hash field
    功能: 检查给定域 field 是否存在于哈希表 hash 当中。
    时间复杂度: O(1)
    返回值: HEXISTS 命令在给定域存在时返回 1 , 在给定域不存在时返回 0 。
    在这里插入图片描述

  5. HDEL
    格式: HDEL key field [field …]
    功能: 删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。
    时间复杂度: O(N), N 为要删除的域的数量。
    返回值: 被成功移除的域的数量,不包括被忽略的域。

在Redis2.4以下的版本里, HDEL 每次只能删除单个域,如果你需要在一个原子时间内删除多个域,请将命令包含在 MULTI / EXEC 块内。
在这里插入图片描述

  1. HLEN
    格式: HLEN key
    功能: 返回哈希表 key 中域的数量。
    时间复杂度: O(1)
    返回值: 哈希表中域的数量。当 key 不存在时,返回 0 。
    在这里插入图片描述

  2. HSTRLEN
    格式: HSTRLEN key field
    功能: 返回哈希表 key 中, 与给定域 field 相关联的值的字符串长度(string length)。如果给定的键或者域不存在, 那么命令返回 0 。
    时间复杂度: O(1)
    返回值: 一个整数,对应字符串的长度。
    在这里插入图片描述

  3. HINCRBY
    格式: HINCRBY key field increment
    功能: 为哈希表 key 中的域 field 的值加上增量 increment 。增量也可以为负数,相当于对给定域进行减法操作。如果 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。如果域 field 不存在,那么在执行命令前,域的值被初始化为 0 。对一个储存字符串值的域 field 执行 HINCRBY 命令将造成一个错误。
    时间复杂度: O(1)
    返回值: 执行 HINCRBY 命令之后,哈希表 key 中域 field 的值。
    在这里插入图片描述

  4. HINCRBYFLOAT
    格式: HINCRBYFLOAT key field increment
    功能: 哈希表 key 中的域 field 加上浮点数增量 increment 。如果哈希表中没有域 field ,那么 HINCRBYFLOAT 会先将域 field 的值设为 0 ,然后再执行加法操作。如果键 key 不存在,那么 HINCRBYFLOAT 会先创建一个哈希表,再创建域 field ,最后再执行加法操作。
    时间复杂度: O(1)
    返回值: 执行加法操作之后 field 域的值。

当以下任意一个条件发生时,返回一个错误:

  • 域 field 的值不是字符串类型(因为 redis 中的数字和浮点数都以字符串的形式保存,所以它们都属于字符串类型)

  • 域 field 当前的值或给定的增量 increment 不能解释(parse)为双精度浮点数(double precision floating point number)

在这里插入图片描述

异常的小数位,是因为float精度造成的,具体参考《float,double等精度丢失问题(详)》

  1. HMSET
    格式: HMSET key field value [field value …]
    功能: 同时将多个 field-value (域-值)对设置到哈希表 key 中。此命令会覆盖哈希表中已存在的域。如果 key 不存在,一个空哈希表被创建并执行 HMSET 操作。
    时间复杂度: O(N), N 为 field-value 对的数量
    返回值: 如果命令执行成功,返回 OK 。当 key 不是哈希表(hash)类型时,返回一个错误。

  2. HMGET
    格式: HMGET key field [field …]
    功能: 返回哈希表 key 中,一个或多个给定域的值。如果给定的域不存在于哈希表,那么返回一个 nil 值。因为不存在的 key 被当作一个空哈希表来处理,所以对一个不存在的 key 进行 HMGET 操作将返回一个只带有 nil 值的表。
    时间复杂度: O(N), N 为给定域的数量。
    返回值: 一个包含多个给定域的关联值的表,表值的排列顺序和给定域参数的请求顺序一样。
    在这里插入图片描述

  3. HKEYS
    格式: HKEYS key
    功能: 返回哈希表 key 中的所有域。
    时间复杂度: O(N), N 为哈希表的大小。
    返回值: 一个包含哈希表中所有域的表。当 key 不存在时,返回一个空表。
    在这里插入图片描述

  4. HVALS
    格式: HVALS key
    功能: 返回哈希表 key 中所有域的值。
    时间复杂度: O(N), N 为哈希表的大小。
    返回值: 一个包含哈希表中所有值的表。当 key 不存在时,返回一个空表。
    在这里插入图片描述

  5. HGETALL
    格式: HGETALL key
    功能: 返回哈希表 key 中,所有的域和值。在返回值里,紧跟每个域名(field name)之后是域的值(value),所以返回值的长度是哈希表大小的两倍。
    时间复杂度: O(N), N 为哈希表的大小。
    返回值: 以列表形式返回哈希表的域和域的值。若 key 不存在,返回空列表。
    在这里插入图片描述

  6. HSCAN
    格式: HSCAN key cursor [MATCH pattern] [COUNT count]
    功能: 用于迭代哈希键中的键值对。
    时间复杂度: 增量式迭代命令每次执行的复杂度为 O(1) , 对数据集进行一次完整迭代的复杂度为 O(N) , 其中 N 为数据集中的元素数量。
    返回值: 返回类似HGETALL的返回值,以列表形式返回哈希表的域和域的值。若 key 不存在,返回空列表。
    在这里插入图片描述

3、List的命令
  1. LPUSH
    格式: LPUSH key value [value …]
    功能: 将一个或多个值 value 插入到列表 key 的表头。
    时间复杂度: O(1)
    返回值: 执行 LPUSH 命令后,列表的长度。
      如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头: 比如说,对空列表 mylist 执行命令 LPUSH mylist a b c ,列表的值将是 c b a ,这等同于原子性地执行 LPUSH mylist a 、 LPUSH mylist b 和 LPUSH mylist c 三个命令。
      如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。
      当 key 存在但不是列表类型时,返回一个错误。
      在Redis 2.4版本以前的 LPUSH 命令,都只接受单个 value 值。
    在这里插入图片描述

  2. LPUSHX
    格式: LPUSHX key value
    功能: 将值 value 插入到列表 key 的表头,当且仅当 key 存在并且是一个列表。
    时间复杂度: O(1)
    返回值: 返回列表的长度

  3. RPUSH
    格式: RPUSH key value [value …]
    功能: 将一个或多个值 value 插入到列表 key 的表尾(最右边)。如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表尾:比如对一个空列表 mylist 执行 RPUSH mylist a b c ,得出的结果列表为 a b c ,等同于执行命令 RPUSH mylist a 、 RPUSH mylist b 、 RPUSH mylist c 。如果 key 不存在,一个空列表会被创建并执行 RPUSH 操作。当 key 存在但不是列表类型时,返回一个错误。
    时间复杂度: O(1)
    返回值: 执行 RPUSH 操作后,表的长度。

在 Redis 2.4 版本以前的 RPUSH 命令,都只接受单个 value 值。

  1. RPUSHX
    格式: RPUSHX key value
    功能: 将值 value 插入到列表 key 的表尾,当且仅当 key 存在并且是一个列表。
    时间复杂度: O(1)
    返回值: RPUSHX 命令执行之后,表的长度。

  2. LPOP
    格式: LPOP key
    功能: 移除并返回列表 key 的头元素。
    时间复杂度: O(1)
    返回值: 列表的头元素。 当 key 不存在时,返回 nil 。
    在这里插入图片描述

  3. RPOP
    格式: RPOP key
    功能: 移除并返回列表 key 的尾元素。
    时间复杂度: O(1)
    返回值: 列表的尾元素。 当 key 不存在时,返回 nil 。
    在这里插入图片描述

  4. RPOPLPUSH
    格式: RPOPLPUSH source destination
    功能: RPOP、LPUSH二合一命令,原子操作。
    时间复杂度: O(1)
    返回值: 被弹出的元素。

  命令 RPOPLPUSH 在一个原子时间内,执行以下两个动作:

  • 将列表 source 中的最后一个元素(尾元素)弹出,并返回给客户端。

  • 将 source 弹出的元素插入到列表 destination ,作为 destination 列表的的头元素。

  举个例子,你有两个列表 source 和 destination , source 列表有元素 a, b, c , destination 列表有元素 x, y, z ,执行 RPOPLPUSH source destination 之后, source 列表包含元素 a, b , destination 列表包含元素 c, x, y, z ,并且元素 c 会被返回给客户端。
  如果 source 不存在,值 nil 被返回,并且不执行其他动作。
  如果 source 和 destination 相同,则列表中的表尾元素被移动到表头,并返回该元素,可以把这种特殊情况视作列表的旋转(rotation)操作。

  1. LREM
    格式: LREM key count value
    功能: 根据参数 count 的值,移除列表中与参数 value 相等的元素。
    时间复杂度: O(N), N 为列表的长度。
    返回值: 被移除元素的数量。 因为不存在的 key 被视作空表(empty list),所以当 key 不存在时, LREM 命令总是返回 0 。

其中,count 的值可以是以下几种:

  • count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。

  • count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。

  • count = 0 : 移除表中所有与 value 相等的值。

  • 在这里插入图片描述

  1. LLEN
    格式: LLEN key
    功能: 返回列表 key 的长度。如果 key 不存在,则 key 被解释为一个空列表,返回 0 。如果 key 不是列表类型,返回一个错误。
    时间复杂度: O(1)
    返回值: 列表 key 的长度。

  2. LINDEX
    格式: LINDEX key index
    功能: 返回列表 key 中,下标为 index 的元素。
    时间复杂度: O(N), N 为到达下标 index 过程中经过的元素数量。因此,对列表的头元素和尾元素执行 LINDEX 命令,复杂度为O(1)。
    返回值: 列表中下标为 index 的元素。 如果 index 参数的值不在列表的区间范围内(out of range),返回 nil 。
      下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。如果 key 不是列表类型,返回一个错误。

  3. LINSERT
    格式: LINSERT key BEFORE|AFTER pivot value
    功能: 将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。当 pivot 不存在于列表 key 时,不执行任何操作。当 key 不存在时, key 被视为空列表,不执行任何操作。
    如果 key 不是列表类型,返回一个错误。
    时间复杂度: O(N), N 为寻找 pivot 过程中经过的元素数量。
    返回值: 如果命令执行成功,返回插入操作完成之后,列表的长度。 如果没有找到 pivot ,返回 -1 。 如果 key 不存在或为空列表,返回 0 。
    在这里插入图片描述

  4. LSET
    格式: LSET key index value
    功能: 将列表 key 下标为 index 的元素的值设置为 value 。当 index 参数超出范围,或对一个空列表( key 不存在)进行 LSET 时,返回一个错误。
    时间复杂度: 对头元素或尾元素进行 LSET 操作,复杂度为 O(1)。其他情况下,为 O(N), N 为列表的长度。
    返回值: 操作成功返回 ok ,否则返回错误信息。
    在这里插入图片描述

  5. LRANGE
    格式: LRANGE key start stop
    功能: 返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定。
    时间复杂度: O(S+N), S 为偏移量 start , N 为指定区间内元素的数量。
    返回值: 一个列表,包含指定区间内的元素。
      下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。
      你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
    超出范围的下标值不会引起错误。
      如果 start 下标比列表的最大下标 end ( LLEN list 减去 1 )还要大,那么 LRANGE 返回一个空列表。如果 stop 下标比 end 下标还要大,Redis将 stop 的值设置为 end 。

  6. LTRIM
    格式: LTRIM key start stop
    功能: 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
    时间复杂度: O(N), N 为被移除的元素的数量。
    返回值: 命令执行成功时,返回 ok 。

  举个例子,执行命令 LTRIM list 0 2 ,表示只保留列表 list 的前三个元素,其余元素全部删除。
  下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。
  你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
  当 key 不是列表类型时,返回一个错误。
  超出范围的下标值不会引起错误。如果 start 下标比列表的最大下标 end ( LLEN list 减去 1 )还要大,或者 start > stop , LTRIM 返回一个空列表(因为 LTRIM 已经将整个列表清空)。如果 stop 下标比 end 下标还要大,Redis将 stop 的值设置为 end 。

  1. BLPOP
    格式: BLPOP key [key …] timeout
    功能: BLPOP 是列表的阻塞式(blocking)弹出原语。
    时间复杂度: O(1)
    具体参考《Redis参考命令-BLPOP 》

  2. BRPOP
    格式: BRPOP key [key …] timeout
    功能: BRPOP 是列表的阻塞式(blocking)弹出原语。
    时间复杂度: O(1)
    具体参考《Redis参考命令-BRPOP》

  3. BRPOPLPUSH
    格式: BRPOPLPUSH source destination timeout
    功能: BRPOPLPUSH 是 RPOPLPUSH source destination 的阻塞版本,当给定列表 source 不为空时, BRPOPLPUSH 的表现和 RPOPLPUSH source destination 一样。
    时间复杂度: O(1)
    具体参考《Redis参考命令-BRPOPLPUSH》

set 和zset的相关命令,在后续内容中继续。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姠惢荇者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值