Redis 哈希表操作实战(全)

目录

[HSET 添加](#HSET 添加)

[HSETNX 添加](#HSETNX 添加)

[HMSET 批量添加](#HMSET 批量添加)

[HGET 获取元素](#HGET 获取元素)

[HGETALL 获取所有](#HGETALL 获取所有)

[HMGET 批量查询](#HMGET 批量查询)

[HEXISTS 判断是否存在](#HEXISTS 判断是否存在)

[HINCRBY 增加整数](#HINCRBY 增加整数)

[HINCRBYFLOAT 添加浮点数](#HINCRBYFLOAT 添加浮点数)

[HLEN 查Field数量](#HLEN 查Field数量)

[HKEYS 查所有Field](#HKEYS 查所有Field)

[HVALS 查所有Field值](#HVALS 查所有Field值)

[HSCAN 迭代](#HSCAN 迭代)

[HDEL 删除Field](#HDEL 删除Field)


HSET 添加

HSET key field value:将哈希表 key 中的域 field 的值设为 value。

  • key不存在,创建新的哈希表并hset操作。

  • key存在,覆盖旧值。

    127.0.0.1:6379> flushdb
    OK

    field不存在,hset成功返回 1

    127.0.0.1:6379> hset person name 'cxian'
    (integer) 1
    127.0.0.1:6379> hset person age '22'
    (integer) 1

    field已存在并覆盖值,hset成功返回 0

    127.0.0.1:6379> hset person age '25'
    (integer) 0
    127.0.0.1:6379> set name 100
    OK

    对已存在的key执行hset报错

    127.0.0.1:6379> hset name high 1.75
    (error) WRONGTYPE Operation against a key holding the wrong kind of value

时间复试度为O(1)。

返回值:

  • 返回1:field不存在并值设置成功。
  • 返回0:field已存在并覆盖旧值成功。
  • 报错:key为类型。

HSETNX 添加

HSETNX key field value:将哈希表 key 中的域 field 的值设置为 value。

  • 若field已存在,该操作无效。

    127.0.0.1:6379> flushdb
    OK
    127.0.0.1:6379> hsetnx person age 10
    (integer) 1

    age已存在

    127.0.0.1:6379> hsetnx person age 12
    (integer) 0

时间复杂度O(1)。

设置成功返回1,field已存在则操作不成功返回0。

HMSET 批量添加

HMSET key field value [field value ...]:同时将多个 field-value (域-值)对设置到哈希表 key 中。

  • 此命令会覆盖哈希表中已存在的域。

  • 如果 key 不存在,一个空哈希表被创建并执行 HMSET 操作。

    127.0.0.1:6379> flushdb
    OK
    127.0.0.1:6379> hmset person age 12 name cxian
    OK
    127.0.0.1:6379> hmget person age name

    1. "12"
    2. "cxian"

时间复杂度O(N),N为field-value的数量。

执行成功返回OK,当key不是hash表类型时报错。

HGET 获取元素

HGET key field:返回哈希表 key 中给定域 field 的值。

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> hset person age 88
(integer) 1
127.0.0.1:6379> hget person age
"88"

# key不存在或field不存在
127.0.0.1:6379> hget person1 age
(nil)
127.0.0.1:6379> hget person age1
(nil)

时间复杂度O(1)。

返回给定域的值。

  • key不存在或field不存在,返回nil。

HGETALL 获取所有

HGETALL key:返回哈希表 key 中,所有的域和值。

  • 返回值里,紧跟每个域名(field name)之后是域的值(value),所以返回值的长度是哈希表大小的两倍。

    127.0.0.1:6379> flushdb
    OK
    127.0.0.1:6379> hset person age 88
    (integer) 1
    127.0.0.1:6379> hget person age
    "88"
    127.0.0.1:6379> hset person name cxian
    (integer) 1
    127.0.0.1:6379> hgetall person

    1. "age" # field
    2. "88" # value
    3. "name"
    4. "cxian"

    key不存在

    127.0.0.1:6379> hgetall person1
    (empty array)

时间复杂度O(N),N为哈希表的大小。

以列表形式返回哈希表的域和域的值。

  • 若key不存在返回空列表。

HMGET 批量查询

HMGET key field [field ...]:返回哈希表 key 中,一个或多个给定域的值。

  • 域不存在于哈希表,那么返回一个 nil 值。

  • 若key不存在,列表返回对应field数量的nil值。

    127.0.0.1:6379> flushdb
    OK
    127.0.0.1:6379> hset person age 88
    (integer) 1
    127.0.0.1:6379> hget person age
    "88"

    127.0.0.1:6379> hmget person age name address

    1. "88"
    2. "cxian"
    3. (nil)

    key不存在

    127.0.0.1:6379> hmget person1 age name

    1. (nil)
    2. (nil)

时间复杂度O(N),N为field的数量。

返回一个包含多个给定域的关联值的表。

  • 表值的排列顺序和给定域参数的请求顺序一样。

HEXISTS 判断是否存在

HEXISTS key field:查看哈希表 key 中,给定域 field 是否存在。

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> hset person age 88

127.0.0.1:6379> hexists person age
(integer) 1

# 不存在field或不存在的key
127.0.0.1:6379> hexists person age1
(integer) 0
127.0.0.1:6379> hexists person1 age
(integer) 0

时间复杂度为O(1)。如果key和field都存在返回1,否则返回0。

HINCRBY 增加整数

HINCRBY key field increment:为哈希表 key 中的域 field 的值加上增量 increment。

  • 若increment为负数相当于相减。

  • 若key或field不存在,创建(默认值为0)并执行hincrby命令。

  • 若field对应值不为数字,则报错。

  • 本操作的值被限制在 64 位(bit)有符号数字表示之内。

    127.0.0.1:6379> flushdb
    OK
    127.0.0.1:6379> keys *
    (empty array)

    key和field不存在

    127.0.0.1:6379> hincrby person age 22
    (integer) 22
    127.0.0.1:6379> hget person age
    "22"

    increment为负数

    127.0.0.1:6379> hincrby person age -10
    (integer) 12
    127.0.0.1:6379> hget person age
    "12"
    127.0.0.1:6379>
    127.0.0.1:6379> hset person name cxian
    (integer) 1

    field对应值不为数字

    127.0.0.1:6379> hincrby person name 12
    (error) ERR hash value is not an integer

时间复杂度O(1)。

返回执行hincrby之后field对应的值。

HINCRBYFLOAT 添加浮点数

HINCRBYFLOAT key field increment

  • 与HINCRBY key field increment相似。

  • 不同点是HINCRBYFLOAT的increment必须是双精度浮点数且可以用指数符号形式表示(如2.0e7 、 3e5 、 90e-2等)。

    127.0.0.1:6379> hincrbyfloat person age 23.8
    "35.8"
    127.0.0.1:6379> hincrbyfloat person age -8.9
    "26.9"

HLEN 查Field数量

HLEN key:返回哈希表 key 中域的数量。

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> hmset person age 23 name cxian
OK
127.0.0.1:6379> hlen person
(integer) 2

时间复杂度O(1)。

返回哈希表中field的数量。

  • key不存在时返回0。

HKEYS 查所有Field

HKEYS key:返回哈希表 key 中的所有field。

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> hmset person age 23 name cxian
OK
127.0.0.1:6379> hlen person
(integer) 2
127.0.0.1:6379> hkeys person
1) "age"
2) "name"

# key不存在
127.0.0.1:6379> hkeys person1
(empty array)

时间复杂度为O(N),N为field的数量。

一个包含哈希表中所有域的表。

  • 当key不存在时返回空表。

HVALS 查所有Field值

HVALS key:返回哈希表 key 中所有域的值。

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> hmset person age 23 name cxian
OK

127.0.0.1:6379> hvals person
1) "23"
2) "cxian"

# key不存在
127.0.0.1:6379> hvals person1
(empty array)
127.0.0.1:6379> 

时间复杂度为O(N),N为field数量。

返回一个包含哈希表中所有值的表。

  • 当key不存在时返回空表。

HSCAN 迭代

HSCAN key cursor [MATCH pattern] [COUNT count]:迭代哈希键中的键值对。

HDEL 删除Field

HDEL key field [field ...]:删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。

127.0.0.1:6379> hgetall person
1) "age"
2) "23"
3) "name"
4) "cxian"
127.0.0.1:6379> hdel person age
(integer) 1

# field不存在 或 key不存在
127.0.0.1:6379> hdel person age1
(integer) 0


127.0.0.1:6379> hgetall person
1) "name"
2) "cxian"

时间复杂度O(N),N为field的数量。

返回被移除的field的数量。

相关推荐
little redcap1 小时前
第十九次CCF计算机软件能力认证-乔乔和牛牛逛超市
数据结构·c++·算法
muyierfly2 小时前
34.贪心算法1
算法·贪心算法
luthane4 小时前
python 实现average mean平均数算法
开发语言·python·算法
静心问道4 小时前
WGAN算法
深度学习·算法·机器学习
杰九5 小时前
【算法题】46. 全排列-力扣(LeetCode)
算法·leetcode·深度优先·剪枝
manba_5 小时前
leetcode-560. 和为 K 的子数组
数据结构·算法·leetcode
liuyang-neu5 小时前
力扣 11.盛最多水的容器
算法·leetcode·职场和发展
忍界英雄5 小时前
LeetCode:2398. 预算内的最多机器人数目 双指针+单调队列,时间复杂度O(n)
算法·leetcode·机器人
Kenneth風车5 小时前
【机器学习(五)】分类和回归任务-AdaBoost算法-Sentosa_DSML社区版
人工智能·算法·低代码·机器学习·数据分析
C7211BA5 小时前
使用knn算法对iris数据集进行分类
算法·分类·数据挖掘