Redis中Hash类型的命令
目录
哈希类型的命令
hset
hget
hexists
hdel
hkeys
hvals
hgetall
hmget
hlen
hsetnx
hincrby
hincrbyfloat
内部编码
Hash类型的应用场景
作为缓存
哈希类型和关系型数据库的两点不同之处
缓存方式对比
Redis自身已经是键值对的结构了,Redis自身的键值对就是通过哈希的方式来组织的.
把key这一层组织完成之后,到了value这一层,value还可以是哈希.
在Redis中哈希类型的映射关系通常称为field-value,用于区分Redis整体的键值对(key-value).所以哈希类型当中value指的是field对应的值,不是键key对应的值.
字符串和哈希类型的比较
当我们需要存储一个uid为1的用户对象,姓名是zhangsan,年龄是18.
用字符串时,我们需要设置两个key-value,一个user:1:name-zhangsan和user:1:age-18.
而我们使用哈希时只需要一个键即可user:1->name-zhangsan,age-18.
哈希类型的命令
hset
设置hash中指定的field的value.
返回值是设置成功的键值对(field-value)的个数.
注意hash类型中的value只能是字符串类型的.
hget
hget key field
获取哈希中指定字段的值.
返回值是字段对应的值或者是nil.
.
hexists
hexists key field
判断hash中是否有指定字段的值.
返回1表示存在,0表示不存在.
hdel
hdel key field [field......]
删除hash中指定的字段.
注意del命令删除的key而hdel命令删除的是field.
返回的是本次操作删除的字段个数.
hkeys
hkeys key
获取hash中所有的字段.
返回的是字段列表.
hvals
hvals key
获取hash中所有的值.
返回的是所有的val值.
hgetall
hgetall key
获取hash中所有的字段以及其对应的值.
返回的是字段和对应的值.
field和value是交替出现的.
hmget
hmget key field [field......]
一次获取hash中多个字段的值.
返回的是字段对应的值或者是nil.
hash中也有hmset能够一次设置多个field和value,但是我们不需要使用,因为hset已经支持一次设置多个field和values了.
hlen
hlen key
获取hash中所有字段的个数.
返回的是字段个数.
hsetnx
hsetnx key field value
在字段不存在的情况下,设置hash中字段的值.
返回1表示设置成功,返回0表示设置失败.
如果key也不存在,也会创建key.
hincrby
hincrby key field increment
将hash中字段对应的数值添加指定的值.此时value必须能被当作数字处理.
hincrbyfloat
这是hincrby的浮点数版本.
hincrbyfloat key field increment
hstrlen
hstrlen key field
计算value的字符串长度.
内部编码
哈希类型的内部编码是ziplist和hashtable.
使用ziplist目的是为了节省内存空间,因为当数据元素不多的时候,使用一个hash表来表示,可能会造成空间的浪费,hash首先是一个数组,数组上的有些位置上有元素,有的元素可能就没有元素,就会造成浪费.但是数据元素过多的时候,此时在使用ziplist,读写元素的速度会比较慢,此时就要使用hashtable来组织和存储数据.
如果哈希中的元素比较少,使用ziplist表示,元素个数比较多的时候使用hashtable来表示.
如果每个value的值的长度都比较短,使用ziplist表示,如果某个value的长度太长了,也会转换哼hashtable.
对于多少个元素是多,多长的value算长,redis中有两个配置.
hash-max-ziplist-entries配置.(默认是512个).
hash-max-ziplist-value配置.(默认是64字节).
我们可以在redis的配置文件中对其进行修改.根据不同的业务场景选择更加契合当前业务的值.
Hash类型的应用场景
作为缓存
string类型也可以作为缓存使用,但是存储结构话的数据,使用hash更加合适一些.
比如mysql中有一个表.
使用hash可以更加直观的表示表中的每一条记录.
上述场景使用string类型也可以做到,要用到json这样的数据格式.
如果使用string(json格式)来表示userinfo,万一只想获取其中的一个field或者修改某个field的值,就需要把整个json都读出来,解析成对象,在操作field,最后重新转写成json字符串,在写回去.
如果使用hash的方式来表示userinfo.就可以使用field表示对象的某个属性,此时就可以非常方便的修改/获取任何一个属性的值了.
使用hash的方式读写field更加直观高效,但是付出的是空间的代价.
哈希类型和关系型数据库的两点不同之处
1.哈希类型是稀疏的,而关系型数据库是完全结构化的.例如哈希的每个键都可以有不同的field,而关系型数据库一旦添加新的列,所有行都要为其设置值,即使是null也要设置.
2.关系型数据库可以做复杂的关系查询,而redis去模拟关系型复杂查询基本不可能,维护成本很高.
缓存方式对比
目前,我们已经掌握了三种缓存用户信息的方法.
1.原生字符串类型-使用字符串类型,每个属性一个键
优点:实现比较简单,针对个别属性的操作更加灵活.
缺点:占用过多的键,内存的占用量较大,同时用户的信息在redis中比较分散,缺少内聚性,所以这种方案基本没有实用性.
2.序列化字符串类型-json格式
优点:针对总是以整体作为操作的场景比较合适,编程也简单.同时,如果序列化的方案选择合适,内存的使用效率很高.
缺点:本身的序列化和反序列化需要一定的开销,同时如果针对某个属性进行操作会变的不灵活.
3.哈希类型
优点:简单,直观,灵活.尤其是针对信息的局部变更.
缺点:需要控制哈希在两种内部编码之间的转换,可能会造成内存的较大消耗.
相关文章:

Redis中Hash类型的命令
目录 哈希类型的命令 hset hget hexists hdel hkeys hvals hgetall hmget hlen hsetnx hincrby hincrbyfloat 内部编码 Hash类型的应用场景 作为缓存 哈希类型和关系型数据库的两点不同之处 缓存方式对比 Redis自身已经是键值对的结构了,Redis自身的键值对就…...
Java 函数式编程
1.Lambda 1.1 格式 JDK 从 1.8 版本开始支持 Lambda 表达式,通过 Lambda 表达式我们可以将一个函数作为参数传入方法中。在 JDK 1.8 之前,我们只能通过匿名表达式来完成类似的功能,但是匿名表达式比较繁琐,存在大量的模板代码&…...

类的成员函数总结
前言: 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现,编译器会生成的…...

java高级之单元测试、反射
1、Junit测试工具 Test定义测试方法 1.被BeforeClass标记的方法,执行在所有方法之前 2.被AfterCalss标记的方法,执行在所有方法之后 3.被Before标记的方法,执行在每一个Test方法之前 4.被After标记的方法,执行在每一个Test方法之后 public …...

MSQL系列(十三) Mysql实战-left/right/inner join 使用详解及索引优化
Mysql实战-left/right/inner join 使用详解及索引优化 前面我们讲解了BTree的索引结构,也详细讲解下Join的底层驱动表 选择原理,今天我们来了解一下为什么会出现内连接外连接,两种连接方式,另外实战一下内连接和几种最常用的join…...

前端面试题之HTML篇
1、src 和 href 的区别 具有src的标签有:script、img、iframe 具有href的标签有:link、a 区别 src 是source的缩写。表示源的意思,指向资源的地址并下载应用到文档中。会阻塞文档的渲染,也就是为什么js脚本放在底部而不是头部的…...
Django ORM:数据库操作的Python化艺术
Django的对象关系映射器(ORM)是其核心功能之一,允许开发者使用Python代码来定义、操作和查询数据库。这篇文章将带你深入了解Django ORM的强大之处,从基本概念到高级查询技巧,提供丰富的示例帮助你掌握使用Django ORM进…...
react受控组件与非受控组件
React中的组件可以分为受控组件和非受控组件: 受控组件:受控组件是指组件的值受到React组件状态的控制。通常在组件中,我们会通过state来存储组件的值,然后再将state的值传递给组件的props,从而实现组件的双向数据绑定…...
小米产品面试题:淘宝为何需要确认收货?京东为何不需要?
亲爱的小米粉丝们,大家好!我是小米,一个热爱技术、热衷于分享的小编。今天,我要和大家聊聊一个有趣的话题:为什么淘宝购物需要确认收货,而京东不需要?这可是一个让很多人纳闷的问题,…...

(1)上位机底部栏 UI如何设置
上位机如果像设置个多页面切换: 位置: 代码如下: "tabBar": {"color": "black","selectedColor": "#d43c33","borderStyle":"black","backgroundColor": …...

中国多主数据库:压强投入,期待破茧
拿破仑曾说:“战争的艺术就是在某一点上集中最大优势兵力”,强调了力量集中的重要性。 如今,国际形势风云变幻,西方世界对中国的围剿不再仅仅体现在军事和地缘政治上,而更多表现在经济与科技上。在科技领域࿰…...
JavaScript在ES6及后续新增的常用新特性
JavaScript经历了不同标本的迭代,在不断完善中会添加不同的新特性来解决前一个阶段的瑕疵,让我们开发更加便捷与写法更加简洁! 1、箭头函数: 箭头函数相比传统的函数语法,具有更简洁的语法、没有自己的this值、不会绑…...

试试流量回放,不用人工写自动化测试case了
大家好,我是洋子,接触过接口自动化测试的同学都知道,我们一般要基于某种自动化测试框架,编写自动化case,编写自动化case的依据来源于接口文档,对照接口文档里面的请求参数进行人工添加接口自动化case 其实…...
密钥管理系统功能及作用简介 安当加密
密钥管理系统的功能主要包括密钥生成、密钥注入、密钥备份、密钥恢复、密钥更新、密钥导出和服务,以及密钥的销毁等。 密钥生成:通过输入一到多组的密钥种子,按照可再现或不可再现的模式生成所需要的密钥。一般采用不可再现模式作为密钥生成…...
vue中watch属性的用法
在Vue中,watch属性用于监听一个数据的变化,并且在数据变化时执行一些操作。它可以观察一个具体的数据对象,从而在该数据对象发生变化时触发对应的回调函数。 使用watch属性的步骤如下: 在Vue实例中添加一个watch对象 new Vue({…...

Redis-使用java代码操作Redis
🏅我是默,一个在CSDN分享笔记的博主。📚📚 🌟在这里,我要推荐给大家我的专栏《Linux》。🎯🎯 🚀无论你是编程小白,还是有一定基础的程序员,这…...

0基础学习PyFlink——事件时间和运行时间的窗口
大纲 定制策略运行策略Reduce完整代码滑动窗口案例参考资料 在 《0基础学习PyFlink——时间滚动窗口(Tumbling Time Windows)》一文中,我们使用的是运行时间(Tumbling ProcessingTimeWindows)作为窗口的参考时间: reducedkeyed.window(TumblingProcess…...

Git Rebase 优化项目历史
在软件开发过程中,版本控制是必不可少的一环。Git作为当前最流行的版本控制系统,为开发者提供了强大的工具来管理和维护代码历史。git rebase是其中一个高级特性,它可以用来重新整理提交历史,使之更加清晰和线性。本文将详细介绍g…...

两种MySQL OCP认证应该如何选?
很多同学都找姚远老师说要参加MySQL OCP认证培训,但绝大部分同学并不知道MySQL OCP认证有两种,以MySQL 8.0为例。 一种是管理方向,叫:Oracle Certified Professional, MySQL 8.0 Database Administrator(我考试的比较…...

Java用log4j写日志
日志可以方便追踪和调试问题,以前用log4net写日志,换Java了改用log4j写日志,用法和log4net差不多。 到apache包下载下载log4j的包,解压后把下图两个jar包引入工程 先到网站根下加一个log4j2.xml的配置文件来配置日志的格式和参…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...