【redis】hash基本命令和内部编码

ops/2025/3/18 19:55:14/

文章目录

  • 表示形式
  • 命令
    • HSET 和 HGET
  • HEXISTS
  • HDEL
  • HKEYS
  • HVALS
  • HGETALL
  • HMGET
  • HLEN
  • HSETNX
  • HINCRBY
  • HINCRBYFLOAT
  • 命令小结
  • 内部编码

表示形式

Redis 自身已经是键值对结构了
Redis 自身的键值对就是通过哈希的方式来组织的

key 这一层组织完成之后,到了 value 这一层,value 这一层也可以是哈希image.png

  • 哈希类型中的映射关系通常称为 field-value,用于区分 Redis 整体的键值对(key-value),注意这里的 value 是指 field 对应的值,不是 key 对应的值,注意 value 在不同上下文的作用

命令

HSET 和 HGET

设置/获取 hash 中指定的字段(field)的值(value


语法:

redis">HSET key field value [field value...]HGET key field
  • HSET 的返回值是设置成功的键值对(field-value)的个数
  • 时间复杂度: O ( 1 ) O(1) O(1) image.png|263

HEXISTS

判断 hash 中是否有指定的字段


语法:

redis">HEXISTS key field
  • 返回值:1 表示存在,0 表示不存在
  • 时间复杂度: O ( 1 ) O(1) O(1)
    image.png|374

HDEL

删除 hash 中指定的字段

  • del 删除的是 key
  • hdel 删除的是 field

语法:

redis">HDEL key field [field...]
  • 返回值是本次删除的字段个数
  • 时间复杂度:删除一个元素为 O ( 1 ) O(1) O(1),删除 N N N 个位 O ( N ) O(N) O(N)(几十几百个就视为 1)image.png|276
  • HDEL 是删除 key 对应的 valuefield-value) 中的键值对 field
  • DEL 是直接删除 key 对应的 value(里面所有的键值对全删)

HKEYS

获取 hash 中的所有字段


语法:

redis">HKEYS key
  • 这个操作,会先根据 key 找到对应的 hash O ( 1 ) O(1) O(1)),然后再遍历 hash O ( N ) O(N) O(N) N N Nhash 的元素个数)

谈到 O ( N ) O(N) O(N),有的时候, N N N 表示:

  1. Redis 整体 key 的个数
  2. 当前命令中 key 的个数 (因为我们一般不会弄太多 key,所以一般可以直接看做 O ( 1 ) O(1) O(1))
  3. 当前 key 对应的 value 里面的元素个数

HVALS

获取 hash 中的所有的值


语法:

redis">HVALS key
  • 时间复杂度: O ( N ) O(N) O(N) N N N 是哈希的元素个数,如果哈希非常大,这个操作就可能导致 Redis 服务器被阻塞住)
    image.png|334

HGETALL

获取 hash 中的所有字段以及对应的值

  • 相当于结合了 HKEYSHVALS

语法:

redis">HGETALL key
  • 时间复杂度: O ( N ) O(N) O(N) N N N 是哈希的元素个数,如果哈希非常大,这个操作就可能导致 Redis 服务器被阻塞住)image.png|332

这个操作,还是风险比较大。多数情况下,不需要查询所有的 field,可能只查其中的几个 key

HMGET

一次获取 hash 中多个字段的值


语法:

redis">HMGET key field [field...]
  • 时间复杂度:删除一个元素为 O ( 1 ) O(1) O(1),删除 N N N 个位 O ( N ) O(N) O(N)(几十几百个就视为 1)
  • 返回值:字段对应的值或者 nil image.png
  • 上述 HKEYSHVALSHGETALL 都是存在一定风险的。hash 元素个数太多,执行的时间就会比较长,从而阻塞 Redis
    • 一条命令,就能完成所有的遍历操作
  • HSCAN 遍历 Redishash,“渐进式遍历
    • 敲一次命令,遍历一小部分
    • 再敲一次命令,再遍历一小部分
    • 连续执行多次,就可以完成整个遍历过程(化整为零

ConcurrentHashMap 线程安全的哈希表

HLEN

获取 hash 中的所有字段的个数


语法:

redis">HLEN key
  • 时间复杂度: O ( 1 ) O(1) O(1)
  • 返回值:字段个数image.png

HSETNX

在字段不存在的情况下,设置 hash 中的字段和值


语法:

redis">HSETNX key field value
  • 时间复杂度: O ( 1 ) O(1) O(1)
  • 返回值:1 表示成功,0 表示失败image.png|277

HINCRBY

hash 中字段对应的数字添加指定的值


语法:

redis">HINCRBY key field increment
  • 时间复杂度: O ( 1 ) O(1) O(1)
  • 返回值:该字段变化后的值image.png

HINCRBYFLOAT

HINCRBY 的浮点数版本


语法:

redis">HINCRBYFLOAT key field increment
  • 时间复杂度: O ( 1 ) O(1) O(1)
  • 返回值:该字段变化后的值image.png

命令小结

image.png

内部编码

哈希的内部编码有两种:

  1. ziplist:压缩列表
  2. hashtable:哈希表

压缩:

  • rar
  • zip
  • gzip
  • 7z

  • 这是一些具体的压缩算法。

压缩的本质,是针对数据进行重新编码。不同的数据,有不同的特点,结合这些特点,进行精妙的设计,重新编码之后,就能够缩小体积

比如,现在有字符串:abcccddddeeeee

  • 重新编码表示:1a2b3c4d5e
  • 重新编码后的结果就比原来的短了(粗糙)

ziplist 内部的数据结构也是精心设计的(目的是节省内存空间)

  • 表示一个普通的 hash 表,可能会浪费一定的空间(hash 首先是一个数组,数组上有些位置有元素,有些没有元素)
  • 付出的代价是进行读写元素,速度是比较慢的。如果元素个数少,慢的不明显,但如果元素多了,慢就会雪上加霜

如果:

  1. 哈希中的元素个数比较少,使用 ziplist 表示;元素较多,就用 hashtable 来表示
  2. 每个 value 的值,长度都比较短,使用 ziplist 表示;如果某个 value 的长度太长了,也会转换成 hashtable

image.png

  • 可以在 redis。conf 文件中,调整 hash-max-ziplist-entries 配置和 hash-max-ziplist-value 配置


http://www.ppmy.cn/ops/166851.html

相关文章

Python中存储数据——json模块

很多时候,程序要把信息存储在列表和字典等数据结构中。一种简单的方式是使用json模块来存储数据。 json模块能够将简单的Python数据结构存储到文件中,并在程序运行时加载文件中的数据。还可以使用json在Python程序之间分享数据。更重要的是,J…

【开源免费】基于SpringBoot+Vue.JS电商应用系统(JAVA毕业设计)

本文项目编号 T 242 ,文末自助获取源码 \color{red}{T242,文末自助获取源码} T242,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

Deepseek结合企业数据挖掘平台能够给企业提升哪些效益?

Deepseek(深度求索)作为智能系统,在政务办公领域可通过AI技术优化流程、提升效率,具体应用场景分析如下: 1. 智能公文处理与流转 自动分类与审核 利用NLP解析公文内容,自动分类(如请示、报告、通…

LeetCode 解题思路 19(Hot 100)

解题思路(递归): 终止条件: 若节点为空,返回深度0。递归步骤: 分别计算左子树和右子树的最大深度,取较大者并加1(当前节点)。 Java代码: class Solution {…

Useage of Generic in Java

the usage of generic in class // public class A <T>{ //without specify a parent class or implemented interface as the super bound for generic typeT n;public void printstr(){System.out.println(n);}A(T a){this.na;System.out.println("A构建成功…

java使用(Preference、Properties、XML、JSON)实现处理(读写)配置信息或者用户首选项的方式的代码示例和表格对比

在Java应用程序中&#xff0c;处理应用首选项&#xff08;preferences&#xff09;有多种方法&#xff0c;包括使用java.util.prefs.Preferences类、属性文件&#xff08;如.properties文件&#xff09;、XML文件和JSON文件。下面是每种方法的详细说明和代码示例&#xff0c;最…

python-数据结构汇总,树图、代码讲解(字符串、数组、字典、集合、元组)

一、字符串&#xff08;str&#xff09; 1.增操作 1.1‘’符号拼接字符串 str1"I love"; str2"you"; #直接使用‘’符号拼接字符串变成一个字符串 str str1str2 print(str) #打印出 I love you 1.2join()方法&#xff0c;可以将列表、元组中的字符串合…

DeepSeek 3FS集群化部署临时笔记

DeepSeek 3FS集群化部署临时笔记 一、3FS集群化部署1、环境介绍2、对应的软件包安装3、编译4、部署4.1 部署monitor_collector_mainStep 2: Admin clientStep 3: Mgmtd serviceStep 4: Meta serviceStep 5: Storage serviceStep 6: Create admin user, storage targets and cha…