Redis命令学习【2】之Hash&List 型 Value 操作命令


在这里插入图片描述

  • 一路向前一路狂奔

一 Hash 型 Value 操作命令

1.1 概述

  • Redis存储数据的 Value 可以是一个 Hash 类型【Hash 表、字典等】。
  • Hash 表就是一个映射表 Map也是由键-值对构成为了与整体的 key 进行区分这里的键称为 field值称为 value。
  • 注意Redis 的 Hash 表中的 field-value 对均为 String 类型。
命令解释
hset将哈希表 key 中的域 field 的值设为 value
hget返回哈希表 key 中给定域 field 的值
hmset同时将多个field-value (域-值)对设置到哈希表 key
hmget按照给出顺序返回哈希表 key 中一个或多个域的值。
hgetall返回哈希表 key 中所有的域和值
hsetnx将哈希表 key 中的域 field 的值设置为 value 当且仅当域 field 不存在。
hdel删除哈希表 key 中的一个或多个指定域不存在的域将被忽略。
hexists查看哈希表 key 中给定域 field 是否存在。
hincrby 与 hincrbyfloat为哈希表 key 中的域 field 的值加上增量 incrementhincrby 命令只能增加整数值而 hincrbyfloat 可以增加小数值。
hkeys 与 hvals返回哈希表 key 中的所有域/值。
hlen返回哈希表 key 中域的数量。
hstrlen返回哈希表 key 中 与给定域 field 相关联的值的字符串长度string length。

1.2 hset

  • 格式HSET key field value
  • 功能将哈希表 key 中的域 field 的值设为 value
  • 说明
    • 如果 key 不存在一个新的哈希表被创建并进行 HSET 操作。如果域 field 已经存在于哈希表中旧值将被覆盖。
    • 如果 field 是哈希表中的一个新建域并且值设置成功返回 1 。如果哈希表中域 field 已经存在且旧值已被新值覆盖返回 0 。
      在这里插入图片描述

1.3 hget

  • 格式HGET key field
  • 功能返回哈希表 key 中给定域 field 的值。
  • 说明当给定域不存在或是给定 key 不存在时返回 nil 。
    在这里插入图片描述

1.4 hmset

  • 格式HMSET key field value [field value ...]
  • 功能同时将多个field-value (域-值)对设置到哈希表 key 中。
  • 说明此命令会覆盖哈希表中已存在的域。如果 key 不存在一个空哈希表被创建并执行 HMSET 操作。如果命令执行成功返回 OK。当 key 不是哈希表(hash)类型时返回一个错误。
    在这里插入图片描述

1.5 hmget

  • 格式HMGET key field [field ...]
  • 功能按照给出顺序返回哈希表 key 中一个或多个域的值。
  • 说明如果给定的域不存在于哈希表那么返回一个 nil 值。因为不存在的 key 被当作一个空哈希表来处理所以对一个不存在的 key 进行 HMGET 操作将返回一个只带有 nil 值的表
    在这里插入图片描述

1.6 hgetall

  • 格式HGETALL key
  • 功能返回哈希表 key 中所有的域和值。
  • 说明在返回值里紧跟每个域名(field name)之后是域的值(value)所以返回值的长度是哈希表大小的两倍。 若 key 不存在返回空列表。若 key 中包含大量元素则该命令可能会阻塞 Redis 服务。所以生产环境中一般不使用该命令而使用 hscan 命令代替。
    在这里插入图片描述

1.7 hsetnx

  • 格式HSETNX key field value
  • 功能将哈希表 key 中的域 field 的值设置为 value 当且仅当域 field 不存在。
  • 说明若域 field 已经存在该操作无效。如果 key 不存在一个新哈希表被创建并执行 HSETNX 命令。
    在这里插入图片描述

1.8 hdel

  • 格式HDEL key field [field ...]
  • 功能删除哈希表 key 中的一个或多个指定域不存在的域将被忽略。
  • 说明返回被成功移除的域的数量不包括被忽略的域。
    在这里插入图片描述

1.9 hexists

  • 格式HEXISTS key field
  • 功能查看哈希表 key 中给定域 field 是否存在。
  • 说明如果哈希表含有给定域返回 1 。如果不含有给定域或 key 不存在返回 0
    在这里插入图片描述

1.10 hincrby 与 hincrbyfloat

  • 格式HINCRBY key field increment
  • 功能为哈希表 key 中的域 field 的值加上增量 incrementhincrby 命令只能增加整数值而 hincrbyfloat 可以增加小数值。
  • 说明增量也可以为负数相当于对给定域进行减法操作。如果 key 不存在一个新的哈希表被创建并执行 HINCRBY 命令。如果域 field 不存在那么在执行命令前域的值被初始化为 0。对一个储存字符串值的域 field 执行 HINCRBY 命令将造成一个错误。
    在这里插入图片描述

1.11 hkeys 与 hvals

  • 格式HKEYS key 或 HVALS key
  • 功能返回哈希表 key 中的所有域/值。
  • 说明当 key 不存在时返回一个空表。
    在这里插入图片描述

1.12 hlen

  • 格式HLEN key
  • 功能返回哈希表 key 中域的数量。
  • 说明当 key 不存在时返回 0 。
    在这里插入图片描述

1.13 hstrlen

  • 格式HSTRLEN key field
  • 功能返回哈希表 key 中 与给定域 field 相关联的值的字符串长度string length。
  • 说明如果给定的键或者域不存在 那么命令返回 0 。
    在这里插入图片描述

1.14 应用场景

  • Hash 型 Value 非常适合存储对象数据。key 为对象名称value 为描述对象属性的 Map对对象属性的修改在 Redis 中就可直接完成。

二 List 型 Value 操作命令

2.1 概述

  • Redis 存储数据的 Value 可以是一个 String 列表类型数据。即该列表中的每个元素均为String 类型数据。列表中的数据会按照插入顺序进行排序。
  • 该列表的底层实际是一个无头节点的双向链表所以对列表表头与表尾的操作性能较高但对中间元素的插入与删除的操作的性能相对较差。
命令解释
lpush/rpush将一个或多个值 value 插入到列表 key 的表头/表尾表头在左表尾在右
llen返回列表 key 的长度
lindex返回列表 key 中下标为 index 的元素。列表从 0 开始计数。
lset将列表 key 下标为 index 的元素的值设置为 value
lrange返回列表 key 中指定区间[start, stop]内的元素即包含两个端点。
lpushx 与 rpushx将值 value 插入到列表 key 的表头/表尾当且仅当 key 存在并且是一个列表。
linsert将值 value 插入到列表 key 当中位于元素 pivot 之前或之后。
lpop / rpop从列表 key 的表头/表尾移除 count 个元素并返回移除的元素。count 默认值 1
blpop / brpopBLPOP/BRPOP 是列表的阻塞式(blocking)弹出命令
rpoplpush命令 RPOPLPUSH 在一个原子时间内将 source 弹出的元素插入到列表 destination 作为 destination 列表的的头元素
brpoplpushBRPOPLPUSHRPOPLPUSH的阻塞版本当给定列表source 不为空时BRPOPLPUSH的表现和RPOPLPUSH 一样。当列表source为空时BRPOPLPUSH命令将阻塞连接直到等待超时或有另一个客户端对source执行LPUSHRPUSH` 命令为止。
lrem根据参数count 的值移除列表中与参数 value 相等的元素。
ltrim对一个列表进行修剪(trim)就是说让列表只保留指定区间内的元素不在指定区间之内的元素都将被删除。

2.2 lpush/rpush

  • 格式LPUSH key value [value ...] 或 RPUSH key value [value ...]
  • 功能将一个或多个值 value 插入到列表 key 的表头/表尾表头在左表尾在右
  • 说明如果有多个 value 值对于 lpush 来说各个value会按从左到右的顺序依次插入到表头对于rpush来说各个 value 会按从左到右的顺序依次插入到表尾。如果 key不存在一个空列表会被创建并执行操作。当 key 存在但不是列表类型时返回一个错误。执行成功时返回列表的长度。
    在这里插入图片描述

2.3 llen

  • 格式LLEN key
  • 功能返回列表 key 的长度。
  • 说明如果 key 不存在则 key 被解释为一个空列表返回 0 。如果 key 不是列表类型返回一个错误。
    在这里插入图片描述

2.4 lindex

  • 格式LINDEX key index
  • 功能返回列表 key 中下标为 index 的元素。列表从 0 开始计数。
  • 说明如果 index 参数的值不在列表的区间范围内(out of range)返回nil
    在这里插入图片描述

2.5 lset

  • 格式LSET key index value
  • 功能将列表 key 下标为 index 的元素的值设置为 value 。
  • 说明当 index 参数超出范围或对一个空列表key 不存在进行 LSET 时返回一个错误。
    在这里插入图片描述

2.6 lrange

  • 格式LRANGE key start stop
  • 功能返回列表 key 中指定区间[start, stop]内的元素即包含两个端点。
  • 说明List 的下标从 0 开始即以 0 表示列表的第一个元素以 1 表示列表的第二个元素以此类推。也可以使用负数下标以 -1 表示列表的最后一个元素 -2 表示列表的倒数第二个元素以此类推。超出范围的下标值不会引起错误。如果 start 下标比
    列表的最大下标 还要大那么 LRANGE 返回一个空列表。如果 stop 下标比最大下标还要大Redis 将 stop 的值设置为最大下标。
    在这里插入图片描述

2.7 lpushx 与 rpushx

  • 格式LPUSHX key value 或 RPUSHX key value
  • 功能将值 value 插入到列表 key 的表头/表尾当且仅当 key 存在并且是一个列表。
  • 说明当 key 不存在时命令什么也不做。若执行成功则输出表的长度。
    在这里插入图片描述

2.8 linsert

  • 格式LINSERT key BEFORE|AFTER pivot value
  • 功能将值 value 插入到列表 key 当中位于元素 pivot 之前或之后。
  • 说明当 pivot 元素不存在于列表中时不执行任何操作返回-1当 key 不存在时key 被视为空列表不执行任何操作返回 0如果 key 不是列表类型返回一个错误如果命令执行成功返回插入操作完成之后列表的长度。
    在这里插入图片描述

2.9 lpop / rpop

  • 格式LPOP key [count] 或 RPOP key [count]
  • 功能从列表 key 的表头/表尾移除 count 个元素并返回移除的元素。count 默认值 1
  • 说明当 key 不存在时返回 nil
    在这里插入图片描述

2.10 blpop / brpop

  • 格式BLPOP key [key ...] timeout 或 BRPOP key [key ...] timeout
  • 功能BLPOP/BRPOP 是列表的阻塞式(blocking)弹出命令。它们是 LPOP/RPOP 命令的阻塞版本当给定列表内没有任何元素可供弹出的时候连接将被 BLPOP/BRPOP 命令阻塞直到等待 timeout 超时或发现可弹出元素为止。当给定多个 key 参数时按参数 key的先后顺序依次检查各个列表弹出第一个非空列表的头元素。timeout 为阻塞时长单位为秒其值若为 0则表示只要没有可弹出元素则一直阻塞。
  • 说明假如在指定时间内没有任何元素被弹出则返回一个 nil 和等待时长。反之返回一个含有两个元素的列表第一个元素是被弹出元素所属的 key 第二个元素是被弹出元素的值。
    在这里插入图片描述

2.11 rpoplpush

  • 格式RPOPLPUSH source destination
  • 功能命令 RPOPLPUSH 在一个原子时间内执行以下两个动作
    • 将列表 source 中的最后一个元素(尾元素)弹出并返回给客户端。
    • source 弹出的元素插入到列表 destination 作为 destination 列表的的头元素。
    • 如果 source 不存在值 nil 被返回并且不执行其他动作。如果 sourcedestination相同则列表中的表尾元素被移动到表头并返回该元素可以把这种特殊情况视作列表的旋转(rotation)操作。
    127.0.0.1:6379[2]> lrange list 0 -1
    1) "second"
    2) "third"
    3) "first"
    4) "second"
    5) "third"
    # 旋转
    127.0.0.1:6379[2]> rpoplpush list list
    "third"
    # 源列表不存在
    127.0.0.1:6379[2]> rpoplpush list1 list
    (nil)
    # 目的列表不存在
    127.0.0.1:6379[2]> rpoplpush list list1
    "second"
    # 查看列表
    127.0.0.1:6379[2]> lrange list 0 -1
    1) "third"
    2) "second"
    3) "third"
    4) "first"
    127.0.0.1:6379[2]> lrange list1 0 -1
    1) "second"
    

2.12 brpoplpush

  • 格式BRPOPLPUSH source destination timeout
  • 功能BRPOPLPUSHRPOPLPUSH 的阻塞版本当给定列表 source 不为空时BRPOPLPUSH 的表现和 RPOPLPUSH 一样。当列表 source 为空时 BRPOPLPUSH 命令将阻塞连接直到等待超时或有另一个客户端对 source 执行 LPUSHRPUSH 命令为止。timeout 为阻塞时长单位为秒其值若为 0则表示只要没有可弹出元素则一直阻塞。
  • 说明假如在指定时间内没有任何元素被弹出则返回一个 nil 和等待时长。反之返回一个含有两个元素的列表第一个元素是被弹出元素的值第二个元素是等待时长。
    在这里插入图片描述

2.13 lrem

  • 格式LREM key count value
  • 功能根据参数count 的值移除列表中与参数 value 相等的元素。count 的值可以是以下几种
    • count > 0 : 从表头开始向表尾搜索移除与 value 相等的元素数量为 count
    • count < 0 : 从表尾开始向表头搜索移除与 value 相等的元素数量为 count 的绝对值。
    • count = 0 : 移除表中所有与 value 相等的值。
  • 说明返回被移除元素的数量。当 key 不存在时 LREM 命令返回 0 因为不存在的 key 被视作空表(empty list)。
    在这里插入图片描述

2.14 ltrim

  • 格式LTRIM key start stop
  • 功能对一个列表进行修剪(trim)就是说让列表只保留指定区间内的元素不在指定区间之内的元素都将被删除。
  • 说明
    • 下标(index)参数 start 和 stop 都以 0 为底也就是说以 0 表示列表的第一个元素以 1 表示列表的第二个元素以此类推。
    • 也可以使用负数下标以 -1 表示列表的最后一个元素 -2 表示列表的倒数第二个元素以此类推。
    • 当 key 不是列表类型时返回一个错误。如果 start 下标比列表的最大下标 end ( LLEN list 减去 1 )还要大或者 start > stop LTRIM 返回一个空列表因为 LTRIM 已经将整个列表清空。如果 stop 下标比 end 下标还要大Redis 将 stop 的值设置为 end 。
      在这里插入图片描述

2.15 应用场景

  • Value 为 List 类型的应用场景很多主要是通过构建不同的数据结构来实现相应的业务功能。

2.15.1 栈

  • 通过 lpush + lpop 可以实现栈数据结构效果先进后出。通过 lpush 从列表左侧插入数据通过 lpop 从列表左侧取出数据。当然通过 rpush + rpop 也可以实现相同效果只不过操作的是列表右侧。

2.15.2 队列

  • 通过 lpush + rpop 可以实现队列数据结构效果先进先出。通过 lpush 从列表左侧插入数据通过 rpop 从列表右侧取出数据。当然通过 rpush + lpop 也可以实现相同效果只不过操作的方向正好相反。

2.15.3 阻塞式消息队列

  • 通过 lpush + brpop 可以实现阻塞式消息队列效果。作为消息生产者的客户端使用 lpush从列表左侧插入数据作为消息消费者的多个客户端使用 brpop 阻塞式“抢占”列表尾部数据进行消费保证了消费的负载均衡与高可用性。brpop 的 timeout 设置为 0表示只要没有数据可弹出就永久阻塞。

2.15.4 动态有限集合

  • 通过 lpush + ltrim 可以实现有限集合。通过 lpush 从列表左侧向列表中添加数据通过ltrim 保持集合的动态有限性。像企业的末位淘汰、学校的重点班等动态管理都可通过这种动态有限集合来实现。当然通过 rpush + ltrim 也可以实现相同效果只不过操作的方向正好相反。
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: redis