[Redis]Hash类型

基本命令

hset命令

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

返回值:添加的字段的个数(注意是添加的个数,而不包括修改的)

hset key field value [field value ...]

 hget命令

获取 hash 中指定字段的值

返回值:字段对应的值或者 nil

hget key field

 

hexists命令

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

返回值:1 表⽰存在,0 表⽰不存在

hexists key field

 

 hdel命令

删除 hash 中指定的字段

返回值:本次操作删除的字段个数 

hdel key field [field ...]

 

hkeys命令

获取 hash 中的所有字段

返回值:字段列表

hkeys key 

hvals命令

获取 hash 中的所有的值

返回值:所有的值

hvals key 

hgetall命令

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

返回值:字段和对应的值

hgetall key

 

 hmget命令

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

返回值:字段对应的值或者 nil

HMGET key field [field ...]

 在使用 hgetall 时,如果哈希元素个数比较多,会存在阻塞 Redis 的可能。如果开发人员只需要获取部分 field,可以使用 HMGET,如果一定要获取全部 field,可以尝试使用 hscan 命令,该命令采用渐进式遍历哈希类型

 hlen命令

获取 hash 中的所有字段的个数,(返回键值对的个数)

返回值:字段个数

hlen key

 

hsetnx命令

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

返回值:1 表示设置成功,0 表示失败

hsetnx key field value

 

hincrby命令

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

返回值:该字段变化之后的值 

hincrby key field increment

hincrbyfloat命令

hincrby的浮点数版本

返回值:该字段变化之后的值

hincrbyfloat key field increment 

 

 

内部编码

哈希的内部编码有两种:

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

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

 

 总结:

默认设置下,通常内部编码是ziplist,当有value大于64字节时,内部编码会转换为 hashtable,或者field超过512个时,内部编码也会转换为 hashtable

使用场景

存储用户信息

结构

相比于使用 JSON 格式的字符串缓存用户信息,哈希类型变得更加直观,并且在更新操作上变得 更灵活。可以将每个用户的 id 定义为键后缀,多对 field-value 对应用户的各个属性

 

但是需要注意的是哈希类型和关系型数据库有两点不同之处:

• 哈希类型是稀疏的,而关系型数据库是完全结构化的,例如哈希类型每个键可以有不同的 field,而关系型数据库一旦添加新的列,所有行都要为其设置值,即使为 null

• 关系数据库可以做复杂的关系查询,而 Redis 去模拟关系型复杂查询,例如联表查询、聚合查询等基本不可能,维护成本高。 

缓存方式

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

set user:1:name James

set user:1:age 23

set user:1:city Beijing

优点:实现简单,针对个别属性变更也很灵活。

缺点:占用过多的键,内存占用量较大,同时用户信息在 Redis 中比较分散,缺少内聚性,所以这种方案基本没有实用性。 

2.序列化字符串类型,例如 JSON 格式 

set user:1 经过序列化后的用户对象字符串

优点:针对总是以整体作为操作的信息比较合适,编程也简单。同时,如果序列化方案选择合适,内存的使用效率很高。

缺点:本身序列化和反序列需要一定开销,同时如果总是操作个别属性则非常不灵活。 

 3.哈希类型

hmset user:1 name James age 23 city Beijing

优点:简单、直观、灵活。尤其是针对信息的局部变更或者获取操作。

缺点:需要控制哈希在 ziplist 和 hashtable 两种内部编码的转换,可能会造成内存的较大消耗。 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

InnoDB Data Locking - Part 2 “Locks“

什么是数据库“锁”? 当我熟悉数据库术语时,我发现非常困惑的一件事是“锁【lock】”这个词在数据库中的含义与在编程中的含义不同。 在编程中,如果你有一个“锁”,那么它就是内存中存储在某个地址下的单个对象,然后有…

springboot mqtt收发消息

​在Spring Boot中&#xff0c;可以使用MQTT协议来收发消息。以下是一个简单的示例&#xff1a; 1. 添加依赖 在pom.xml文件中添加以下依赖&#xff1a; xml <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-in…

【linux】在linux操作系统下快速熟悉开发环境并上手开发工具——体验不一样的开发之旅

个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 祝福语&#xff1a;愿你拥抱自由的风 目录 vim编辑器 Linux编译器&#xff1a;gcc/g使用 gcc和g的选项 编译过程 动静态库的链接 Linux项目的自动化构建 生成可执行程序 清理可执行程序 Linux调试器-gdb使用 git和git…

DBeaver添加DM8驱动(maven下载和jar包下载配置)

DBeaver 24.0.3添加DM8驱动 下载DBeaver下载DM达梦驱动下载 安装配置使用自带Dameng自行添加达梦驱动 因为最近公司项目有信创要求&#xff0c;所以下载了达梦数据库。使用自带的达梦管理工具不是很方便&#xff0c;于是换了DBeaver。 哼哧哼哧安装好后&#xff0c;创建数据库连…

CSS:font-family作用

font-family作用 介绍代码举例示例分析示例分析 常用方法1.使用字体族2.使用系统字体3.使用Web字体4.使用CSS变量5.使用font-face规则 通用字体族补充 介绍 在Web开发中&#xff0c;font-family 是CSS的一个属性&#xff0c;用于指定一个网页元素应该使用哪些字体样式。font-f…

#centos7搭建php8+nginx环境#

场景:为了实现上传的pdf文件转成png图片,需要搭建一个php8nginx的运行环境&#xff0c;最后安装imagic扩展 安装顺序 php-> linux-> imagemagick -> ghostscript -> imagick 一&#xff1a;安装phpnginx环境 1、安装remi扩展源 remi源是Remi repository是包含最新…

浅谈云原生安全

一、云原生安全的层级概念 "4C" Code-Container-Cluster-Cloud 二、云原生各个层级的安全实践有哪些&#xff1f; 1、针对于Cloud针对的是公有云层面&#xff0c;其实就一点 1、使用主账号子角色&#xff0c;赋予最小权限原则进行资源管理。 2、对于Cluster 1、从C…

【数据结构】二叉树-堆(下)-链式二叉树

个人主页~ 二叉树-堆&#xff08;上&#xff09; 栈和队列 二叉树 四、堆的代码实现Heap.hHeap.ctest.c 五、堆的应用堆排序思想进行排序 六、二叉树链式结构的实现BTree.hBTree.ctest.c 四、堆的代码实现 Heap.h #pragma once#include <stdio.h> #include <stdlib…

如何在C#代码中判断当前C#的版本和dotnet版本

代码如下&#xff1a; using System.Reflection; using System.Runtime.InteropServices;var csharpVersion typeof(string).Assembly.GetCustomAttributes(typeof(AssemblyFileVersionAttribute), false).OfType<AssemblyFileVersionAttribute>().FirstOrDefault()?.…

09- Redis 中的 Stream 数据类型和应用场景

1. 介绍 Redis Stream 是 Redis 5.0 版本新增加的数据类型&#xff0c;Redis 专门为消息队列设计的数据类型。 在 Redis 5.0 Stream 没出来之前&#xff0c;消息队列的实现方式都有着各自的缺陷&#xff0c;例如&#xff1a; 发布订阅模式&#xff0c;不能持久化也就无法可靠…

Python魔法之旅-魔法方法(05)

目录 一、概述 1、定义 2、作用 二、应用场景 1、构造和析构 2、操作符重载 3、字符串和表示 4、容器管理 5、可调用对象 6、上下文管理 7、属性访问和描述符 8、迭代器和生成器 9、数值类型 10、复制和序列化 11、自定义元类行为 12、自定义类行为 13、类型检…

Linux系统使用Docker安装Drupal结合内网穿透实现远程访问管理后台

目录 前言 1. Docker安装Drupal 2. 本地局域网访问 3 . Linux 安装cpolar 4. 配置Drupal公网访问地址 5. 公网远程访问Drupal 6. 固定Drupal 公网地址 前言 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊Linux系统使用Docker安装Drupal…

golang开发 gorilla websocket的使用

很多APP都需要主动向用户推送消息&#xff0c;这就需要用到长连接的服务&#xff0c;即我们通常提到的websocket&#xff0c;同样也是使用socket服务&#xff0c;通信协议是基本类似的&#xff0c;在go中用的最多的、也是最简单的socket服务就是gorilla/websocket&#xff0c;它…

Mybatis 查询TypeHandler使用,转译查询数据(逗号分隔转List)

创建自定义的Hanndler /*** Package: com.datalyg.common.core.handler* ClassName: CommaSeparatedStringTypeHandler* Author: dujiayu* Description: 用于mybatis 解析逗号拼接字符串* Date: 2024/5/29 10:03* Version: 1.0*/ public class CommaSeparatedStringTypeHandle…

SAP Build引言

前言 SAP Build 似乎是一个整合了很多低代码或无代码产品的平台&#xff0c;最早的时候应该都是各自分开的几个产品&#xff0c;近年合并到一块上了SAP Build平台 现在看官网的介绍应该是有三四个产品被集成进来了&#xff0c;分别是SAP IRPA&#xff0c;SAP Workflow&#xf…

c# 输出二进制字符串

参考链接 C#二进制输出数据_c# 输出二进制 123.5的方法-CSDN博客https://blog.csdn.net/a497785609/article/details/4572112标准数字格式字符串 - .NET | Microsoft Learnhttps://learn.microsoft.com/zh-cn/dotnet/standard/base-types/standard-numeric-format-strings#BFo…

linux 配置端口转发

当我们内网服务器没有公网IP&#xff0c;但需要将服务暴露出去时&#xff0c;可以采用如下方式&#xff0c;即通过跳板机&#xff08;带公网IP&#xff09;做转发&#xff0c;下面得例子演示将mysql 3306 服务暴露出去 192.168.10.25 运行mysql服务3306192.168.10.30跳板机&…

13、电科院FTU检测标准学习笔记-录波功能1

作者简介&#xff1a; 本人从事电力系统多年&#xff0c;岗位包含研发&#xff0c;测试&#xff0c;工程等&#xff0c;具有丰富的经验 在配电自动化验收测试以及电科院测试中&#xff0c;本人全程参与&#xff0c;积累了不少现场的经验 ———————————————————…

js高级—基础深入总结

文章目录 1. 数据类型1.1. 常见数据类型1.2.数据类型判断&#xff1a;1.3.underfined与null的区别1.4.什么时候给变量赋值为null1.5. 严格区别变量类型与数据类型&#xff1a; 2. 数据变量和内存2.1. 什么是数据2.2. 什么是内存2.3. 什么是变量2.4.内存、数据、变量三者关系问题…

【面试题】Node.js高频面试题

简述 Node. js 基础概念 &#xff1f; Node.js是一个基于Chrome V8引擎的JavaScript运行环境。它使得JavaScript可以在服务器端运行&#xff0c;从而进行网络编程&#xff0c;如构建Web服务器、处理网络请求等。Node.js采用事件驱动、非阻塞I/O模型&#xff0c;使其轻量且高效…