Redis数据结构之哈希表

这里的哈希表说的是value的类型是哈希表

一.相关命令

1.hset key field value

一次可以设置多个

返回值是设置成功的个数

注意,哈希表中的键值对,键是唯一的而值可以重复

所以有下面的结果:

key中原来已经有了f1,所以再使用hset时,返回值是0,表示没有设置新的字段,但是根据hget的结果可以知道,f1的value已经修改了

2.hget key field获取指定的字段的值

这里的字段指的是field,而不是key

时间复杂度:O(1)

3.hexists key field 判官是否有指定的字段

这里的字段指的是field

一次只能判断一个字段

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

时间复杂度:O(1)

4.hdel key field

一次可以删除多个

返回值是成功删除掉的个数

时间复杂度:O(1)

5.hkeys key获取hash中的所有列表

时间复杂度:O(N),N表示key中field的个数,所以当field很少时,就可以看成O(1)

与keys一样有一定的风险,如果field很多,就可能造成其他命令无法及时接收,导致请求偏向mySql,造成mySql崩溃

6.hvals获取hash中所有的值

时间复杂度:O(N)

7.hgetall key 获取hash中所有的字段以及值

时间复杂度:O(N),N表示字段的个数

8.hmget key field [field]一次获取多个字段的值

9.hlen key 获取hash中所有字段的个数

10.hsetnx 在字段不存在的情况下才设置

注意,不存在hsetex

11.hincrby key field increment

返回值是增加后的结果

12.hincrbyfloat key field increment

可以对整数进行加浮点数的操作,也可以对浮点数进行加整数的操作

二.内部编码

redis中hash表的内部编码有两种:ziplist和hashtable

ziplist:压缩列表。

我们常说的rar、zip、gzip、7z……都是一些常见的压缩算法。

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

例如:abbcccdee,重新编码为1a2b3c1d2e

事实上,上述压缩算法都是精妙设计的,ziplist也同理,内部的数据结构也是精心设计的,节省内存空间。

但是ziplist进行压缩会有代价:读取速度慢。如果元素个数少,则慢的不明显,多了则雪上加霜。

而hashtable的读写时间复杂度是O(1)。

所以只有当hash表中字段个数较少并且每个字段的值也很短时才会使用ziplist,如果元素个数多或者某些字段的值很长就会使用hashtable

三.使用场景

当作缓存,存储结构化数据

前面说过,String也可以作为缓存使用,但是针对于存储结构化数据,使用哈希表类型会更合适

如下是一张关系型数据表保存用户信息:

将它映射到redis中存储,其中value是hash类型,如下:

这里的user1和user2就是键,后面的哈希表就是值。

但是要是使用string字符串存储,就需要用到json这样的数据格式。

就比如某个场景下只需要获取其中的一个field或者修改其中的一个field,那就得把整个json格式的数据全部读取出来,然后解析成对象,再去操作field。操作完毕后再将对象转化成json格式字符串再重新存储。这样真的很麻烦。但要是使用hash来表示userinfo,就可以使用field表示对象的每一个属性,获取时也可以单个field获取,这样的话,读取field更高效。

但是,虽然读取field更高效,却付出了空间的代价!!!因为要控制hash在ziplist和hashtable这两种存储方式的转换中,可能造成内存的大量消耗

哈希类型和关系型数据库的区别

1.哈希类型是稀疏的,而关系型数据库是完全结构化的。就是说哈希类型的每个键可以有不同的value,比如其中一个键设置了地址信息,而另一个键就可以不设置。但要是关系型数据库,一旦添加了新的列,就必须设置值,要么就设置成NULL

缓存方式对比

截至目前,我们已经能够使用三种方式来作为缓存,下面给出三种方式的优缺点

1.原生字符串类型

set user:1:name John

set user:1:age 23

set user:1:address Beijing

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

缺点:占用过多的键,内存占用量较大,同时用户信息再redis中比较分散,缺少内聚性,所以这种方案基本上没有实用性,是低内聚的表现。但是程序设计助球队是高内聚低耦合(高内聚就是把所有相关联的东西放在一起;耦合指的是两个代码/模块之间的关联关系,关联关系越大,相互的影响就越大,耦合度就越高)

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

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

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

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

3.哈希类型

hmset user:1 name John age 23 address Beijing

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

缺点

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

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

相关文章

RTSP学习

RTSP基本原理 实时流传输协议(RTSP:RealTimeStreaming Protocol1)是一种网络传输协议,旨在发送低延迟流。 该协议由RealNetworks,Netscape和哥伦比亚大学的专家在1996年开发。它定义了应如何打包流中的数据以进行传输。 类似一个控制命令的协议play teardown 负责音视频的数据…

C++ STL之栈stack

一.概述 C 中的 std::stack 是一种容器适配器,提供了一种后进先出(LIFO, Last In First Out)的数据结构。它只允许在栈顶进行插入和删除操作,不支持随机访问。 主要特性: 后进先出(LIFO)&…

二叉树(Java)

一.1.树形结构概念的概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:…

[SDX35+WCN6856]SDX35 +WCN6856 remount firmware出现失败问题原因及解决方案

SDX35 SDX35介绍 SDX35设备是一种多模调制解调器芯片,支持 4G/5G sub-6 技术。它是一个4nm芯片专为实现卓越的性能和能效而设计。它包括一个 1.9 GHz Cortex-A7 应用处理器。 SDX35主要特性 ■ 3GPP Rel. 17 with 5G Reduced Capability (RedCap) support. Backward compati…

大模型培训讲师叶梓:Llama Factory 微调模型实战分享提纲

LLaMA-Factory ——一个高效、易用的大模型训练与微调平台。它支持多种预训练模型,并且提供了丰富的训练算法,包括增量预训练、多模态指令监督微调、奖励模型训练等。 LLaMA-Factory的优势在于其简单易用的界面和强大的功能。用户可以在不编写任何代码的…

golang学习笔记28——golang中实现多态与面向对象

推荐学习文档 golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔…

【速成Redis】03 Redis 五大高级数据结构介绍及其常用命令 | 消息队列、地理空间、HyperLogLog、BitMap、BitField

前言: 上篇博客我们讲到redis五大基本数据类型(也是就下图的第一列)。 【速成Redis】02 Redis 五大基本数据类型常用命令-CSDN博客文章浏览阅读1k次,点赞24次,收藏10次。该篇适用于速成redis。本篇我们将讲解&#…

探秘链表:十大经典题目全解析

目录 💯前言 💯常见链表题目类型 ⭐反转链表 ⭐合并两个有序链表 ⭐检测链表中是否存在环 ⭐找到链表的中间节点 ⭐删除链表中的节点 ⭐判断两个链表是否相交 ⭐找到链表中环的入口节点 ⭐复制带随机指针的链表 💯解题技巧与注意事…

Leetcode 2246. 相邻字符不同的最长路径(一般树)树形dp C++实现

问题:Leetcode 2246. 相邻字符不同的最长路径 给你一棵 树(即一个连通、无向、无环图),根节点是节点 0 ,这棵树由编号从 0 到 n - 1 的 n 个节点组成。用下标从 0 开始、长度为 n 的数组 parent 来表示这棵树&#x…

001.从0开始实现线性回归(pytorch)

000动手从0实现线性回归 0. 背景介绍 我们构造一个简单的人工训练数据集,它可以使我们能够直观比较学到的参数和真实的模型参数的区别。 设训练数据集样本数为1000,输入个数(特征数)为2。给定随机生成的批量样本特征 X∈R10002 …

【Delphi】扩展现有组件创建新的 FireMonkey 组件(步骤二)

实现指定格式的属性 步骤 1 中创建的 TClockLabel 组件需要在显示当前时间时定义日期时间格式作为属性,以便组件用户可以指定。 一、实现指定格式的属性 要实现格式属性,请在 TClockLabel class 的发布部分添加以下一行: property Form…

Mybatis-Plus使用例过程中BaseMapper中的一些selectList方法找不到的问题

如果需要用到Mybatis-Plus里面BaseMapper的默认实现的一些方法,而不通过mapper.xml的方式自定义方法,那么在构建SqlSessionFactory的时候需要注意应该通过Mybatis-Plus中的MybatisSqlSessionFactoryBean来获取SqlSessionFactory,使用Mybatis中…

CST电磁仿真77GHz汽车雷达保险杠

77G毫米波雷达仿真时,要考虑天线罩和保险杠的影响。通常保险杠都是多层结构,有的层非常薄。如果采用传统的3D建模方法,会导致网格数量巨大,进而影响到求解效率。 三维保险杠(bumper)模型如下图所示&…

vue3.5新特性

vue在2024.09.03发布了3.5正式版本,其中包含多方面的升级和优化 性能优化 响应式系统重构优化,在内存占用、性能方面均有收益 Memory Usage Improvements Given a test case with 1000 refs 2000 computeds (1000 chained pairs) 1000 effects sub…

【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析

文章目录 C string 类详解:从入门到精通前言第一章:C 语言中的字符串 vs C string 类1.1 C 语言中的字符串1.2 C string 类的优势 第二章:string 类的构造与基础操作2.1 string 类的构造方法2.1.1 示例代码:构造字符串 2.2 string…

二期 1.4 Nacos安装部署 - Window版

本文目录 Nacos支持三种部署模式环境准备下载Nacos启动登录服务注册与查看Nacos支持三种部署模式 单机模式 - 用于测试和单机试用。集群模式 - 用于生产环境,确保高可用。多集群模式 - 用于多数据中心场景。以 Window单机模式 抛转引玉,其它部署方式参考官方文档: https://n…

使用Python实现深度学习模型:智能电影制作与剪辑

随着人工智能技术的飞速发展,深度学习在各个领域的应用越来越广泛。在电影制作与剪辑领域,深度学习技术也展现出了巨大的潜力。本文将介绍如何使用Python实现一个简单的深度学习模型,用于智能电影制作与剪辑。我们将使用TensorFlow和Keras库来构建和训练模型,并展示如何应用…

部署自己的对话大模型,使用Ollama + Qwen2 +FastGPT 实现

部署资源 AUTODL 使用最小3080Ti 资源,cuda > 12.0使用云服务器,部署fastGPT oneAPI,M3E 模型 操作步骤 配置代理 export HF_ENDPOINThttps://hf-mirror.com下载qwen2模型 - 如何下载huggingface huggingface-cli download Qwen/Qwen2-…

Python编程入门指南

本文为初学者提供了全面的Python编程入门指南,涵盖了基础语法、控制结构、函数、数据结构、文件操作、异常处理、模块与包、面向对象编程以及一些高级特性,帮助读者快速掌握Python编程的核心知识。通过详细解释Python编程的各个方面,文章旨在…