Redis命令学习【2】之Hash&List 型 Value 操作命令
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
文章目录
- 一路向前一路狂奔
一 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 | 将哈希表 ke y 中的域 field 的值设置为 value 当且仅当域 field 不存在。 |
hdel | 删除哈希表 key 中的一个或多个指定域不存在的域将被忽略。 |
hexists | 查看哈希表 key 中给定域 field 是否存在。 |
hincrby 与 hincrbyfloat | 为哈希表 key 中的域 field 的值加上增量 increment 。hincrby 命令只能增加整数值而 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 。
- 如果 key 不存在一个新的哈希表被创建并进行
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
- 功能将哈希表
ke
y 中的域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 的值加上增量increment
。hincrby
命令只能增加整数值而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 / brpop | BLPOP/BRPOP 是列表的阻塞式(blocking)弹出命令 |
rpoplpush | 命令 RPOPLPUSH 在一个原子时间内将 source 弹出的元素插入到列表 destination 作为 destination 列表的的头元素 |
brpoplpush | BRPOPLPUSH是 RPOPLPUSH的阻塞版本当给定列表 source 不为空时 BRPOPLPUSH的表现和 RPOPLPUSH 一样。当列表 source为空时 BRPOPLPUSH命令将阻塞连接直到等待超时或有另一个客户端对 source执行 LPUSH或 RPUSH` 命令为止。 |
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
被返回并且不执行其他动作。如果source
和destination
相同则列表中的表尾元素被移动到表头并返回该元素可以把这种特殊情况视作列表的旋转(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
- 功能
BRPOPLPUSH
是RPOPLPUSH
的阻塞版本当给定列表source
不为空时BRPOPLPUSH
的表现和RPOPLPUSH
一样。当列表source
为空时BRPOPLPUSH
命令将阻塞连接直到等待超时或有另一个客户端对source
执行LPUSH
或RPUSH
命令为止。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 也可以实现相同效果只不过操作的方向正好相反。