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

news2024/12/23 9:39:13

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.coloradmin.cn/o/1684994.html

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

相关文章

springboot+jsp校园理发店美容美发店信息管理系统0h29g

前台管理:会员管理、会员预定、开单点单、收银结帐、技师提成 后台管理:数据维护、物料管理、数据查询、报表分析、系统设置等 灵活的付款方式&#xff0c;支持现金、挂帐、会员卡&#xff0c;同时支持多种折扣方式并可按用户要求设置多种结帐类型善的充值卡管理模块:支持优惠卡…

重谈端口号(五元组标识通信),netstat命令介绍

目录 重谈端口号 引入 介绍 知名端口 查看 netstat 引入 介绍 第一列 其他列 选项 重谈端口号 引入 我们已经介绍了很多关于网络协议/网络相关知识了,这里,我们重新回过头再来看看端口号 之前介绍端口号的博客 -- 网络通信另个角度的认识(进程间通信),端口号(为什么…

ctfshow web 萌新赛

给他 谐音.git 用githack还原文件 <?php $passsprintf("and pass%s",addslashes($_GET[pass])); $sqlsprintf("select * from user where name%s $pass",addslashes($_GET[name])); ?>用addslashes函数进行转义 它会在以下字符前添加反斜杠&am…

【施磊】C++语言基础提高:深入学习C++语言先要练好的内功

课程总目录 文章目录 一、进程的虚拟地址空间内存划分和布局二、函数的调用堆栈详细过程三、程序编译链接原理1. 编译过程2. 链接过程 一、进程的虚拟地址空间内存划分和布局 任何的编程语言 → \to → 产生两种东西&#xff1a;指令和数据 编译链接完成之后会产生一个可执行…

【笔记】软件架构师要点记录(2)

【笔记】软件架构师要点记录 20240523案例一案例二案例三案例四案例五案例六案例七案例十 20240523 基于前10个架构案例场景&#xff0c;对用到的专业术语进行整理&#xff0c;方便后续查看。 案例一 MVC架构风格组件交互方式 MVC是一种用来构建用户界面时采用的架构设计风格…

SpringBoot中使用AOP实现日志记录功能

目录 一、SpringBoot框架介绍 二、什么是 AOP 三、日志记录的必要性 四、SpringBoot中如何使用AOP实现日志记录功能 一、SpringBoot框架介绍 SpringBoot是一个开源的Java开发框架&#xff0c;旨在简化基于Spring框架的应用程序的开发。它提供了一套开箱即用的工具&#xf…

企业知识库智能问答系统的实践

1、页面效果 PC端 2、页面效果 手机端 3、主要支持功能 新建会话 历史会话 2、智能问答 支持 文本分类和意图识别&#xff0c;支持基于大模型的对话理解&#xff0c;支持流式对话 3、支持手机端 语音识别 4、主要服务包括 向量库Milvus 向量计算和文本分类服务 …

吃透一道题day2:Java算法中的“如何找到给定字符串中的不同字符“

写在开头&#xff1a;很久没有开启有关算法的内容了,在正式开启开启今天这段算法之旅之前,跟大家谈一谈上周五歌手也就是第二期我的一些直观感受:相比第一期(chante moore的if i aint got you和faouzia的crazy带给我的经验)没有任何特别的惊艳之处,很平淡甚至可以说是心如止水,…

使用docker+jenkins构建前端项目发布到nginx

1.准备环境 为了方便公司开发优化代码&#xff0c;不需要反复地将项目包发送给运维部署&#xff0c;我们对开发环境的前端项目利用jenkinsCI/CD进行自动化部署 需要两台服务器 一台jenkins 一台发布服务器,这里发布服务器 我直接使用开发环境的服务器 将admin界面与云计算展示…

优化电源设计:反激二极管选择与注意事项

反激二极管也被称为续流二极管、缓冲二极管、抑制二极管、钳位二极管或换向二极管&#xff0c;是一种电子元件&#xff0c;通常应用在开关电源和其他涉及电感性负载的电路中。它的主要功能是保护电路&#xff0c;防止感性负载在开关断开时产生的反激电压&#xff08;或反电动势…

Paddle 傅里叶变换基础及领域应用

Paddle 傅里叶变换基础及领域应用 1. 傅里叶变换基础 1.1 傅里叶变换简介 傅里叶变换是一种重要的信号处理技术&#xff0c;它可以将一个信号从时域转换到频域。在频域中&#xff0c;信号的频率特性更加明显&#xff0c;有利于分析和处理。傅里叶变换的基本思想是将一个信号…

P6【知识点】【数据结构】【树tree】C++版

树是由一个集合以及在该集合上定义的一种关系构成的&#xff0c;集合中的元素称为树的结点&#xff0c;所定义的关系称为父子关系。父子关系在树的结点之间建立了一个层次结构&#xff0c;在这种层次结构中有一个结点具有特殊的地位&#xff0c;这个结点称为该树的根结点。 二叉…

接口测试怎么测?为什么要做接口测试?

一、前言 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间及内部各个子系统之间的交互点。测试的重点是检查数据的交换、传递和控制管理过程&#xff0c;以及系统间的逻辑依赖关系等。 简单地说&#xff0c;接口测试就是通过URL向服务器或者…

【强训笔记】day25

NO.1 思路&#xff1a;哈希质数判断。 代码实现&#xff1a; #include <iostream> #include<string> #include<cmath> using namespace std;bool isprime(int n) {if(n<2) return false;for(int i2;i<sqrt(n);i){if(n%i0) return false;}return true…

AppInventor2要在界面上做一个电量图标,有什么好的思路吗?

问&#xff1a;要在界面上做一个电量图标&#xff0c;有什么好的思路吗&#xff1f; 答&#xff1a;首先&#xff0c;很容易想到使用进度条相关的组件&#xff0c;原生”滑动条“组件可以吗&#xff1f; 答案显而易见&#xff0c;首先它的样式自定义不够&#xff0c;UI不外乎上…

cPanel中如何为数据库添加用户权限

本周有一个客户&#xff0c;购买Hostease的主机&#xff0c;询问我们的在线客服&#xff0c;他的网站安装后再还是无法访问。 客户购买的是Linux虚拟主机&#xff0c;带cPanel面板的。网站访问有如下数据库连接错误: 随后检查发现客户创建的数据库没有添加数据库用户权限。 下面…

企业文件加密软件推荐:迅软DSE加密软件你用了吗?

一、挑选企业文件加密软件需考虑的因素&#xff1f; 1、安全性&#xff1a;软件应采用业界认可的强加密算法&#xff0c;以确保数据的安全性。 迅软特有的256位高强度加密算法&#xff0c;从根本上阻止一切破解的可能性。 2、易用性&#xff1a;软件应该易于部署和管理&…

二进制部署k8s集群 部署高可用master节点

目录 本次部署的环境 一、master02 节点部署 二、负载均衡部署 安装nginx服务 部署keepalive服务 修改node节点上的配置文件 在master节点上创建pod 三、部署 Dashboard 二进制部署k8s集群部署的步骤总结 &#xff08;1&#xff09;k8s的数据存储中中心的搭建 etcd &…

K8S认证|CKA题库+答案| 2. 查看Pod CPU资源使用量

2、查看集群中运行Pod CPU资源使用量 您必须在以下Cluster/Node上完成此考题&#xff1a; Cluster Master node Worker node k8s …

java集合类详解

目录 1、数组导入&#xff1a; 2、单列集合 List接口 1、ArrayList&#xff1a;数组列表 ArrayList类中的方法 2、LinkedList&#xff1a;链表列表 3、Vector&#xff1a;数组列表 4、list集合的遍历 1、for循环遍历 2、增强for循环 3、迭代器遍历 Set接口 1、Has…