Redis常见数据类型(4) - hash, List

hash

命令小结

命令执行效果时间复杂度
hset key field value设置值O(1)
hget key field获取值O(1)
hdel key field [field...]删除值O(k), k是field个数
hlen key计算field个数O(1)
hgetall key获取所有的field-valueO(k), k是field的个数
hmget field [field...]批量获取field-valueO(k). k是field的个数
hmset field value [field value...]批量设置field-valueO(k), k是field的个数
hexists key field判断field是否存在O(1)
hkeys key获取所有的fieldO(k), k是field个数
hvals key获取所有的valueO(k), k是field个数
hsetnx key field value设置值, 但必须在field不存在时才能设置成功O(1)
hincrby key field increment对应field-value + nO(1)
hincrbyfloat key field n对应field-value + nO(1)
hstrlen key field计算value的字符串长度O(1)

内部编码

哈希的内部编码有两种:

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

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

使用场景

 我们之前学过sql型数据库, 我们知道它是使用表的形式来组织数据的, 而在Redis是使用映射方式来保存映射信息.

下面来看一下两者的不同之处:

哈希类型是稀疏的, 而关系型数据库是完全结构化的, 例如哈希类型每个键都可以有不同的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两种内部编码的转换, 可能会造成内存较大的消耗. 

List列表

列表类型是用来存储多个有序的字符串, 如图: a,b,c,d,e五个元素从左到右组成了一个有序的列表, 列表中的每个字符串称为元素,, 一个列表中最多可以存储 2 ^ 32 - 1个元素. 在Redis中, 可以对两端插入和弹出, 还可以获取指定范围的元素列表, 获取指定索引下标的元素等. 列表是一种比较灵活的数据结构, 它可以充当栈和队列的角色, 在实际开发上有很多应用场景.

结构(基本操作)演示:

 

列表类型特点:

第一: 列表中的元素是有序的, 这意味着可以通过索引下标获取某个元素或者某个范围的元素列表.

第二: 列表中的元素是可以重复的

命令

lpush/rpush

将一个或者多个元素从左/右侧放入到list中.

语法:

 lpush key element [element ...]

时间复杂度: 只插入一个元素为O(1) , 插入多个元素为O(N), N为插入元素个数.

返回值: 插入后list的长度

lpushx/rpushx

在key存在时, 将一个或者多个元素从左/右侧放入(头/尾插到)list中. 不存在, 直接返回.

lpushx key element [element ...]

 时间复杂度: 只插入一个元素为O(1) , 插入多个元素为O(N), N为插入元素个数.

返回值: 插入后list的长度

 lrange

获取从start到end区间所有的元素, 左闭右闭.

语法:

lrange key start stop

时间复杂度: O(N)

返回值: 指定区间的元素.

lpop/rpop

从list左侧/右侧取出元素(即头删/尾删).

语法:

lpop key

时间复杂度: O(1)

返回值: 取出的元素或者nil. 

 

lindex

获取从左数第index位置的元素.

语法:

lindex key index 

时间复杂度: O(N)

返回值: 取出的元素或者nil.

linsert 

在特定位置插入元素.

语法:

linsert key <before | after> pivot element

时间复杂度: O(N)

返回值: 插入后的list长度

llen

获取list长度

语法:

len key 

时间复杂度: O(1)

返回值: list的长度.

 

阻塞版本的命令

blpop和brpop是lpop和rpop的阻塞版本, 和对应非阻塞版本的作用基本一致. 除了:

在列表有元素的情况下, 阻塞和非阻塞的表现是一致的. 但如果列表中没有元素, 非阻塞版本会立即返回nil, 但阻塞版本会根据timeout, 阻塞一段时间, 期间Redis可以执行其它命令(就是再开一个客户端可以继续执行其它操作, 包括向对应列表中插入元素, 在阻塞的客户端中会立即返回该元素), 但要求执行该命令的客户端会表现为阻塞状态

命令中设置了多个键, 那么会从左向右进行遍历键, 一旦有一个对应的列表可以弹出元素, 命令立刻返回.

如果多个客户端同时多一个键执行pop, 则最先执行命令的客户端会得弹出的元素.

使用语法:

blpop key[key ...] timeout

返回值: 取出的元素或nil. 

使用图示:

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

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

相关文章

Orcle查询组合字段重复的数据

oracle拼接字符串 在Oracle中&#xff0c;可以使用||运算符或CONCAT函数来拼接字符串。 使用||运算符&#xff1a; SELECT Hello, || World! AS concatenated_string FROM dual;使用CONCAT函数&#xff1a; SELECT CONCAT(Hello, , World!) AS concatenated_string FROM d…

智慧医疗时代:探索互联网医院开发的新篇章

在智慧医疗时代&#xff0c;互联网医院开发正引领着医疗服务的创新浪潮。通过将先进的技术与医疗服务相结合&#xff0c;互联网医院为患者和医生提供了全新的互动方式&#xff0c;极大地提升了医疗服务的便捷性和效率。本文将深入探讨互联网医院的开发&#xff0c;介绍其技术实…

如何彻底搞懂迭代器(Iterator)设计模式?

说起迭代器&#xff08;Iterator&#xff09;&#xff0c;相信你并不会陌生&#xff0c;因为我们几乎每天都在使用JDK中自带的各种迭代器。那么&#xff0c;这些迭代器是如何构建出来的呢&#xff1f;就需要用到了今天内容要介绍的迭代器设计模式。在日常开发过程中&#xff0c…

多尺度注意力机制突破性成果!低成本、高性能兼备

与传统的注意力机制相比&#xff0c;多尺度注意力机制引入了多个尺度的注意力权重&#xff0c;让模型能够更好地理解和处理复杂数据。 这种机制通过在不同尺度上捕捉输入数据的特征&#xff0c;让模型同时关注局部细节和全局结构&#xff0c;以提高对细节和上下文信息的理解&a…

开源大模型与闭源大模型:技术哲学的较量

目录 前言一、 开源大模型的优势1. 社区支持与合作1.1 全球协作网络1.2 快速迭代与创新1.3 共享最佳实践 2. 透明性与可信赖性2.1 审计与验证2.2 减少偏见与错误2.3 安全性提升 3. 低成本与易访问性3.1 降低研发成本3.2 易于定制化3.3 教育资源丰富 4. 促进标准化5. 推动技术进…

3d选择模型后不能旋转什么原因?怎么解决?---模大狮模型网

在3D建模和渲染的过程中&#xff0c;旋转模型是常见的操作。然而&#xff0c;有时在选择了模型后&#xff0c;却发现无法进行旋转&#xff0c;这可能会让许多用户感到困扰。本文将探讨3D选择模型后不能旋转的可能原因&#xff0c;并提供相应的解决方法。 一、3D选择模型后不能旋…

Zynq-Linux移植学习笔记之68- 国产ZYNQ添加用户自定义版本信息

1、背景介绍 在使用复旦微zynq时&#xff0c;有时候虽然针对uboot源码进行了改动&#xff0c;但由于uboot基线版本只有一个&#xff08;2018-07-fmsh&#xff09;&#xff0c;导致无法区分版本信息&#xff0c;虽然可以通过编译时间来区分&#xff0c;但没有版本号直观。内核也…

快速搭建 WordPress 外贸电商网站指南

本指南全面解析了在 Hostinger 平台上部署 WordPress 外贸电商网站的详细步骤&#xff0c;涵盖托管方案选择、WordPress 一键安装、主题挑选与演示数据导入、主题个性化定制、SEO插件插件 AIOSEO 安装、通过 GTranslate 实现多语言自动翻译、地区访问控制插件&#xff0c;助力用…

高中数学:平面向量-数量积(向量与向量的乘积)与投影

一、引题 物理上的力做功 二、数量积与投影 1、数量积 θ的范围是[0,π] 2、投影 向量的投影&#xff0c;依然是一个向量&#xff01; 3、运算法则 易错点&#xff1a; 4、重要性质 这里对性质(2)要注意一下&#xff1a;如果 a → \mathop{a}\limits ^{\rightarrow…

30.包名的修改和新建后端模块

权限和第三方登录确实令人头疼,我们来学一点简单一点的。 另外,如果各位有属于自己的域名和ICP/IP备案,布置一个作业,自行实现第三方QQ登录。 我们所说的包名修改,是一次性修改ruoyi的全部包名,因为发现很多人有这样的需求,下载别人的代码,想要改成自己公司的包名,结…

当代家庭教育杂志社《当代家庭教育》杂志社24年第6期目录

家庭教育资讯 《家庭教育蓝皮书2024:中国家庭养育环境报告》出炉 4 2024年4月至7月北京市将开展“双减”专项行动 5 小学生玩“烟卡”到底该不该禁&#xff1f; 5 家庭教育理论探索 新时代家长家庭教育素养&#xff1a;意涵、关键要素及其培育 周起煌; 6-10 …

海外仓WMS系统多少钱?家庭海外仓怎么选合适的系统

作为海外仓管理的核心工具&#xff0c;WMS系统能够帮助企业实现仓库的可视化管理&#xff0c;流程自动化以及决策的数据化支持&#xff0c;进而提升海外仓的整体竞争力。 然而&#xff0c;许多海外仓企业在选择wms系统的时候&#xff0c;往往对价格的疑虑比较大&#xff0c;不…

微服务远程调用 RestTemplate

Spring给我们提供了一个RestTemplate的API&#xff0c;可以方便的实现Http请求的发送。 同步客户端执行HTTP请求&#xff0c;在底层HTTP客户端库(如JDK HttpURLConnection、Apache HttpComponents等)上公开一个简单的模板方法API。RestTemplate通过HTTP方法为常见场景提供了模…

Xinstall全渠道统计服务,洞悉App推广效果

在当今数字化时代&#xff0c;App已经成为企业和个人进行业务推广和服务提供的重要渠道。然而&#xff0c;随着App市场的日益饱和&#xff0c;如何有效地推广和运营App成为了众多广告主和开发者面临的难题。而App渠道统计作为衡量推广效果、优化运营策略的重要手段&#xff0c;…

大数据运维学习笔记之Ambari——筑梦之路

原则&#xff1a;分布式存储和分布式计算分开 今天就到这里啦。

Github上传时报错The file path is empty的解决办法

问题截图 文件夹明明不是空的&#xff0c;却怎么都上传不上去。 解决方案&#xff1a; 打开隐藏文件的开关&#xff0c;删除原作者的.git文件 如图所示&#xff1a; 上传成功&#xff01;

JS片段:如何将文本复制到剪贴板

在构建网站时&#xff0c;一个非常普遍的需求是能够通过单击按钮将文本复制到剪贴板。在现代浏览器中&#xff0c;使用navigator.clipboardAPI 访问系统剪切板&#xff0c;利用clipboard.writeText复制到剪贴板&#xff0c;再通过clipboard.readText获取剪贴板内容即可实现。 …

APH-Archives of Public Health

文章目录 一、期刊简介二、征稿信息三、期刊表现四、投稿须知五、投稿咨询 一、期刊简介 Archives of Public Health是一份范围广泛的公共卫生杂志&#xff0c;致力于出版公共卫生领域所有可靠的科学。该杂志旨在更好地了解人群的健康。该杂志有助于公共卫生知识&#xff0c;加…

Debug-010-git stash的用法及使用场景

问题原因&#xff1a; 其实也不是最近&#xff0c;就是之前就碰到过这个问题&#xff0c;那就是我正在新分支开发新功能&#xff0c;开发程度还没有到可以commit的程度&#xff0c;我不想提交(因为有些功能没有完全实现&#xff0c;而且没有自测的话很容易有问题&#xff0c;提…

智能车竞赛指南:从零到一,驶向自动驾驶的未来

智能车竞赛指南&#xff1a;从零到一&#xff0c;驶向自动驾驶的未来 一、智能车竞赛概览1.1 竞赛介绍1.2 竞赛分类 二、智能车开发技术基础2.1 硬件平台2.2 软件开发 三、实战案例&#xff1a;循线小车开发3.1 系统架构3.2 代码示例 四、技术项目&#xff1a;基于ROS的视觉导航…