【redis】数据类型之hash

Redis中的Hash数据类型是一种用于存储键值对集合的数据结构。与Redis的String类型不同,Hash类型允许你将多个字段(field)和值(value)存储在一个单独的key下,从而避免了将多个相关数据存储为多个独立的key。这样做的好处是减少了key的数量,使得数据的管理和操作更加高效。

hash这个数据类型类似java中的HashMap,都由key-value键值对组成。

有关hash类型的命令可以通过help @hash命令来查看。有关命令的使用可以通过help 命令来查看,例如help hset

HSET

hset:设置hash指定字段的值。

语法:

HSET key field value [field value ...]

使用:

127.0.0.1:6379> hset h1 name morris age 18
(integer) 2

HGET

hget:获取hash指定字段的值。

语法:

HGET key field

使用:

127.0.0.1:6379> hget h1 name
"morris"

HKEYS

hkeys:获取hash所有的字段。

语法:

HKEYS key

使用:

127.0.0.1:6379> hkeys h1
1) "name"
2) "age"

HVALS

hvals:获取hash所有的值。

语法:

HVALS key

使用:

127.0.0.1:6379> hvals h1
1) "morris"
2) "18"

HGETALL

hgetall:获取hash所有的字段和值。

语法:

HGETALL key

使用:

127.0.0.1:6379> hgetall h1
1) "name"
2) "morris"
3) "age"
4) "18"

HEXISTS

hexists:判断hash中某个字段是否存在。

语法:

HEXISTS key field

使用:

127.0.0.1:6379> hexists h1 name
(integer) 1

HLEN

hlen:返回hash中键值对的个数。

语法:

HLEN key

使用:

127.0.0.1:6379> hlen h1
(integer) 2

HINCRBY

hincrby:给hash中指定字段的值增加一个整型。

语法:

INCRBY key increment

使用:

127.0.0.1:6379> hincrby h1 age 1
(integer) 19

HINCRBYFLOAT

hincrbyfloat:给hash中指定字段的值增加一个浮点型。

语法:

INCRBYFLOAT key increment

使用:

127.0.0.1:6379> hincrbyfloat h1 age 0.5
"19.5"

HSTRLEN

hstrlen:获取hash指定字段的值的长度。

语法:

HSTRLEN key field

使用:

127.0.0.1:6379> hstrlen h1 name
(integer) 6

HMSET

hmset:批量设置hash,这个跟hset命令一样了,只是hset只支持设置一个,能保证原子性。

语法:

HMSET key field value [field value ...]

使用:

127.0.0.1:6379> hmset k k1 v1 k2 v2 k3 v3
OK

127.0.0.1:6379> hgetall k
1) "k1"
2) "v1"
3) "k2"
4) "v2"
5) "k3"
6) "v3"

HMGET

hmget:批量获取hash的字段对应的值。

语法:

HMGET key field [field ...]

使用:

127.0.0.1:6379> hmget k k1 k2 k3
1) "v1"
2) "v2"
3) "v3"

HSETNX

hsetnx:字段不存在则设置成功,类似setnx命令,只能设置一个字段。

语法:

HSETNX key field value

使用:

127.0.0.1:6379> hsetnx kk name bob
(integer) 1

HDEL

hdel:删除字段。

语法:

HDEL key field [field ...]

使用:

127.0.0.1:6379> hdel k k1
(integer) 1

127.0.0.1:6379> hkeys k
1) "k2"
2) "k3"

HRANDFIELD

hrandfield:用于随机返回一个或多个存储在指定key中的哈希表(hash)里字段的值。

语法:

HRANDFIELD key [count [WITHVALUES]]

使用:

127.0.0.1:6379> hrandfield h1 1 withvalues
1) "age"
2) "18"

HSCAN

hscan:用于迭代哈希表(Hashes)中键值对的命令,有点类似于SCAN。

语法:

HSCAN key cursor [MATCH pattern] [COUNT count]

使用:

127.0.0.1:6379> hscan h1 0 MATCH a* COUNT 1
1) "0"
2) 1) "age"
   2) "18"

内部编码

哈希类型的内部编码有两种:

  • ziplist(压缩列表):当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个)、同时所有值都小于hash-max-ziplist-value配置(默认64字节)时,Redis会使用ziplist作为哈希的内部实现,ziplist使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀。

  • hashtable(哈希表):当哈希类型无法满足ziplist的条件时,Redis会使用hashtable作为哈希的内部实现,因为此时ziplist的读写效率会下降,而hashtable的读写时间复杂度为O(1)。

127.0.0.1:6379> object encoding h1
"ziplist"

127.0.0.1:6379> hset y str "one string is bigger than 64 byte...............one string is bigger than 64 byte..............."
(integer) 1

127.0.0.1:6379> object encoding y
"hashtable"

使用场景

hash常用来存储关系型数据库中的记录。

假设现在数据库有一张user表,如下:

1653388638422.png

下面给出三种方案来缓存用户信息。

  1. 使用原生字符串类型存储,每个属性一个键。

1653388638821.png

127.0.0.1:6379> mset user:1:name morris user:1:age 18 user:1:city beijing
OK

127.0.0.1:6379> mset user:2:name bob user:1:age 20 user:1:city hongkong
OK

127.0.0.1:6379> keys user:1:*
1) "user:1:age"
2) "user:1:name"
3) "user:1:city"

127.0.0.1:6379> mget user:1:name user:1:age user:1:city
1) "morris"
2) "20"
3) "hongkong"

优点:简单直观,每个属性都支持更新操作。

缺点:占用过多的键,内存占用量较大,同时用户信息内聚性比较差。

  1. 将数据库中的一行记录序列化为json,用一个key保存。
127.0.0.1:6379> set user:1 '{"id":1,"name":"morris","age":18,"city":"beijing"}'
OK

127.0.0.1:6379> get user:1
"{"id":1,"name":"morris","age":18,"city":"beijing"}"

127.0.0.1:6379> set user:2 '{"id":2,"name":"bob","age":20,"city":"hongkong"}'
OK

127.0.0.1:6379> get user:2
"{"id":2,"name":"bob","age":20,"city":"hongkong"}"

优点:简化编程,如果合理的使用序列化可以提高内存的使用效率。

缺点:序列化和反序列化有一定的开销,同时每次更新属性都需要把全部数据取出进行反序列化,更新后再序列化到Redis中。

  1. 使用hash存储,每行记录的一列对应一个field-value。

1653388639211.png

127.0.0.1:6379> hset user:1 name morris age 18 city beijing
(integer) 3

127.0.0.1:6379> hset user:2 name bob age 20 city hongkong
(integer) 3

127.0.0.1:6379> hgetall user:1
1) "name"
2) "morris"
3) "age"
4) "18"
5) "city"
6) "beijing"

127.0.0.1:6379> hgetall user:2
1) "name"
2) "bob"
3) "age"
4) "20"
5) "city"
6) "hongkong"

优点:简单直观,如果使用合理可以减少内存空间的使用。

缺点:要控制哈希在ziplist和hashtable两种内部编码的转换,hashtable会消耗更多内存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/966662.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

5.2Internet及其作用

5.2.1Internet概述 Internet称为互联网,又称英特网,始于1969年的美国ARPANET(阿帕网),是全球性的网络。 互连网指的是两个或多个不同类型的网络通过路由器等网络设备连接起来,形成一个更大的网络结构。互连…

深度学习模型蒸馏技术的发展与应用

随着人工智能技术的快速发展,大型语言模型和深度学习模型在各个领域展现出惊人的能力。然而,这些模型的规模和复杂度也带来了显著的部署挑战。模型蒸馏技术作为一种优化解决方案,正在成为连接学术研究和产业应用的重要桥梁。本文将深入探讨模…

网络与数据安全

目录 数据加密对称加密(Symmetric Encryption)非对称加密(Asymmetric Encryption)哈希算法(Hash Functions)数字签名(Digital Signature)密钥管理(Key Management&#x…

< OS 有关 > 利用 google-drive-ocamlfuse 工具,在 Ubuntu 24 系统上 加载 Google DRIVE 网盘

Created by Dave On 8Feb.2025 起因: 想下载 StableDiffusion,清理系统文件时把 i/o 搞到 100%,已经删除到 apt 缓存,还差 89MB,只能另想办法。 在网上找能不能挂在 Google 网盘,百度网盘,或 …

05vue3实战-----配置项目代码规范

05vue3实战-----配置项目代码规范 1.集成editorconfig配置2.使用prettier工具2.1安装prettier2.2配置.prettierrc文件:2.3创建.prettierignore忽略文件2.4VSCode需要安装prettier的插件2.5VSCod中的配置2.6测试prettier是否生效 3.使用ESLint检测3.1VSCode需要安装E…

【漫话机器学习系列】084.偏差和方差的权衡(Bias-Variance Tradeoff)

偏差和方差的权衡(Bias-Variance Tradeoff) 1. 引言 在机器学习模型的训练过程中,我们常常面临一个重要的挑战:如何平衡 偏差(Bias) 和 方差(Variance),以提升模型的泛…

23.PPT:校摄影社团-摄影比赛作品【5】

目录 NO12345​ NO6 NO7/8/9/10​ 单元格背景填充表格背景填充文本框背景填充幻灯片背景格式设置添加考生文件夹下的版式 NO12345 插入幻灯片和放入图片☞快速:插入→相册→新建相册→文件→图片版式→相框形状→调整边框宽度左下角背景图片:视图→…

OpenCV:图像修复

目录 简述 1. 原理说明 1.1 Navier-Stokes方法(INPAINT_NS) 1.2 快速行进方法(INPAINT_TELEA) 2. 实现步骤 2.1 输入图像和掩膜(Mask) 2.2 调用cv2.inpaint()函数 2.3 完整代码示例 2.4 运行结果 …

快速建立私有化知识库(私有化训练DeepSeek,通过ollama方式)

简介 什么?!老是有人问你需求,不同版本的需求你记不清还得去扒拉过程文档、设计文档? 什么?!领导会询问功能使用情况、用户相关数据,你每次还得手动查询反馈? 什么?&…

python脚本实现windows电脑内存监控内存清理(类似rammap清空工作集功能)

import ctypes import psutil import time import sys import os from datetime import datetime import pyautogui# 检查管理员权限 def is_admin():try:return ctypes.windll.shell32.IsUserAnAdmin()except:return False# 内存清理核心功能 def cleanup_memory(aggressivene…

网络安全:挑战、技术与未来发展

📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 1. 引言 在数字化时代,网络安全已成为全球关注的焦点。随着互联网的普及和信息技术的高速发展,网络攻击的…

Verilog语言学习总结

Verilog语言学习! 目录 文章目录 前言 一、Verilog语言是什么? 1.1 Verilog简介 1.2 Verilog 和 C 的区别 1.3 Verilog 学习 二、Verilog基础知识 2.1 Verilog 的逻辑值 2.2 数字进制 2.3 Verilog标识符 2.4 Verilog 的数据类型 2.4.1 寄存器类型 2.4.2 …

35.Word:公积金管理中心文员小谢【37】

目录 Word1.docx ​ Word2.docx Word2.docx ​ 注意本套题还是与上一套存在不同之处 Word1.docx 布局样式的应用设计页眉页脚位置在水平/垂直方向上均相对于外边距居中排列:格式→大小对话框→位置→水平/垂直 按下表所列要求将原文中的手动纯文本编号分别替换…

Python----Python高级(并发编程:协程Coroutines,事件循环,Task对象,协程间通信,协程同步,将协程分布到线程池/进程池中)

一、协程 1.1、协程 协程,Coroutines,也叫作纤程(Fiber) 协程,全称是“协同程序”,用来实现任务协作。是一种在线程中,比线程更加轻量级的存在,由程序员自己写程序来管理。 当出现IO阻塞时,…

amis组件crud使用踩坑

crud注意 过滤条件参数同步地址栏 默认 CRUD 会将过滤条件参数同步至浏览器地址栏中,比如搜索条件、当前页数,这也做的目的是刷新页面的时候还能进入之前的分页。 但也会导致地址栏中的参数数据合并到顶层的数据链中,例如:自动…

机器学习8-卷积和卷积核1

机器学习8-卷积和卷积核1 卷积与图像去噪卷积的定义与性质定义性质卷积的原理卷积步骤卷积的示例与应用卷积的优缺点优点缺点 总结 高斯卷积核卷积核尺寸的设置依据任务类型考虑数据特性实验与调优 高斯函数标准差的设置依据平滑需求结合卷积核尺寸实际应用场景 总结 图像噪声与…

Dubbo 3.x源码(29)—Dubbo Consumer服务调用源码(1)服务调用入口

基于Dubbo 3.1,详细介绍了Dubbo Consumer服务调用源码。 此前我们学习了Dubbo服务的导出和引入的源码,现在我们来学习Dubbo服务调用的源码。 此前的文章中我们讲过了最上层代理的调用逻辑(服务引用bean的获取以及懒加载原理):业务引入的接口…

【信息系统项目管理师-案例真题】2016下半年案例分析答案和详解

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 试题一【问题1】4 分【问题2】12 分【问题3】3 分【问题4】6 分试题二【问题1】3 分【问题2】4 分【问题3】8 分【问题4】5 分【问题5】5 分试题三【问题1】4 分【问题2】8 分【问题3】5 分【问题4】8 分试题一…

pytest-xdist 进行多进程并发测试!

在软件开发过程中,测试是确保代码质量和可靠性的关键步骤。随着项目规模的扩大和复杂性的增加,测试用例的执行效率变得尤为重要。为了加速测试过程,特别是对于一些可以并行执行的测试用 例,pytest-xdist 提供了一种强大的工具&…

【R语言】数据分析

一、描述性统计量 借助R语言内置的airquality数据集进行简单地演示: 1、集中趋势:均值和中位数 head(airquality) # 求集中趋势 mean(airquality$Ozone, na.rmT) # 求均值 median(airquality$Ozone, na.rmT) # 求中位数 2、众数 众数(mod…