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的数量。

相关推荐
AI人工智能+电脑小能手4 小时前
【大白话说Java面试题】【Java基础篇】第22题:HashMap 和 HashSet 有哪些区别
java·开发语言·哈希算法·散列表·hash
昵称小白4 小时前
复杂度分析方法
算法
科研前沿4 小时前
2026 数字孪生前沿科技:全景迭代报告 —— 镜像视界生成式孪生(Generative DT)技术白皮书
大数据·人工智能·科技·算法·音视频·空间计算
学涯乐码堂主6 小时前
有趣的“打擂台算法”
c++·算法·青少年编程·gesp
Tutankaaa6 小时前
知识竞赛题库设计全攻略
人工智能·算法
WolfGang0073217 小时前
代码随想录算法训练营 Day50 | 图论 part08
数据结构·算法·图论
aini_lovee9 小时前
多目标粒子群优化(MOPSO)双适应度函数MATLAB实现
人工智能·算法·matlab
yong99909 小时前
图像融合与拼接:完整MATLAB工具箱
算法·计算机视觉·matlab
春风不语5059 小时前
深入理解主成分分析(PCA)
算法
apollowing9 小时前
启发式算法WebApp实验室:从搜索策略到群体智能的能力进阶(二十二)
算法·启发式算法·web app