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.mzph.cn/pingmian/13513.shtml

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

相关文章

【Qt 学习笔记】Qt常用控件 | 布局管理器 | 网格布局Grid Layout

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 布局管理器 | 网格布局Grid Layout 文章编号&#xff1a…

Go 切片常用操作与使用技巧

1.什么是切片 在 Go 语言中的切片&#xff08;slice&#xff09;是一种灵活的动态数组&#xff0c;它可以自动扩展和收缩&#xff0c;是 Go 语言中非常重要的数据结构之一。切片是基于数组实现的&#xff0c;它的底层是数组&#xff0c;可以理解为对底层数组的抽象。它会生成一…

必应崩了?

目录 今天使用必应发现出现了不能搜索&#xff0c;弹出乱码的情况。 搜了一下&#xff0c;发现其他人也出现了同样的问题。 使用Edge浏览器的话&#xff0c;可以试着改一下DNS&#xff0c;有可能会恢复正常&#xff08;等官方修复了记得改回来&#xff09; 使用谷歌浏览器打开…

桂林电子科技大学计算机工程学院、广西北部湾大学计信学院莅临泰迪智能科技参观交流

5月18日&#xff0c;桂林电子科技大学计算机工程学院副院长刘利民、副书记杨美娜、毕业班辅导员黄秀娟、广西北部湾大学计信学院院长助理刘秀平莅临广东泰迪智能科技股份有限公司产教融合实训基地参观交流。泰迪智能科技副总经理施兴、广西分公司郑廷和、梁霜、培训业务部孙学镂…

中国医学健康管理数字化发展风向标——专家共话未来趋势

随着科技的飞速发展&#xff0c;数字化已经成为中国医学健康管理领域的重要发展方向。 2024年5月20日由中国管理科学研究院智联网研究所、中国民族医药协会医养教育委员会、国家卫健委基层健康服务站、中国老龄事业发展基金会、中国智联网健康管理系统平台、中国医学健康管理数…

express.js--token中间件验证及token解析(三)

主要作用 访问路由接口时&#xff0c;哪些需要校验token 通过token解析身份信息&#xff0c;就可以知道是哪个人 框架基本搭建express.js--基本用法及路由模块化(一)-CSDN博客 如何生成tokenexpress.js--生成token(二)-CSDN博客 middleware/index.js const jwt require(…

【openlayers系统学习】3.1-3.2彩色GeoTIFF图像渲染

一、彩色GeoTIFF图像渲染 Sentinel-2 卫星任务收集并传播覆盖地球陆地表面的图像&#xff0c;重访频率为 2 至 5 天。传感器收集多波段图像&#xff0c;其中每个波段都是电磁频谱的一部分。 2A 级 (L2A) 产品提供以下频段的表面反射率测量&#xff1a; BandDescriptionCentra…

LVDS与IDELAY

摘要&#xff1a;LVDS&#xff08;Low-Voltage Differential Signaling&#xff09;低电压差分信号&#xff0c;是一种低功耗、低误码率、低串扰和低辐射的差分信号技术&#xff1b;LVDS会被经常使用到&#xff0c;使用的过程中难免会碰到时序问题&#xff0c;需要借助IDELAY进…

【Qt问题】QStringLiteral、QString、QLatin1String简单区分

【Qt问题】QStringLiteral、QString、QLatin1String简单区分 最近在看项目代码的时候&#xff0c;一个频繁使用的关键词——“QStringLiteral”&#xff0c;引起了我的注意&#xff0c;关键是我竟然对它非常模糊&#xff0c;这不是一个Qter能够轻易接受的事情。 于是我秉承着…

前端学习-day08

文章目录 01-相对定位02-绝对定位03-绝对定位居中04-固定定位05-堆叠顺序06-CSS精灵-基本使用07-案例-京东服务08-字体图标10.垂直对齐方式11-过度12-透明度13-光标类型14-轮播图 01-相对定位 <!DOCTYPE html> <html lang"en"> <head><meta ch…

动态规划(算法)---01.斐波那契数列模型_第N个泰波那契数

前言&#xff1a; 有一个很著名的公式 “程序数据结构算法”。 算法是模型分析的一组可行的&#xff0c;确定的&#xff0c;有穷的规则。通俗的说&#xff0c;算法也可以理解为一个解题步骤&#xff0c;有一些基本运算和规定的顺序构成。但是从计算机程序设计的角度看&#xff…

【C++】牛客 ——NC138 矩阵最长递增路径

✨题目链接&#xff1a; NC138 矩阵最长递增路径 ✨题目描述 给定一个 n 行 m 列矩阵 matrix &#xff0c;矩阵内所有数均为非负整数。 你需要在矩阵中找到一条最长路径&#xff0c;使这条路径上的元素是递增的。并输出这条最长路径的长度。 这个路径必须满足以下条件&#…

【STM32项目】基于stm32智能鱼缸控制系统的设计与实现(完整工程资料源码)

实物演示效果 基于stm32智能鱼缸控制系统的设计与实现 目录&#xff1a; 实物演示效果 目录&#xff1a; 一、 绪论 1.1 项目研究目的及意义 1.1.1 选题目的 1.1.2 选题意义 1.2 国内外研究现状 1.2.1 国外发展现状 1.2.2 国内发展现状 1.3 项目研究内容 二、智能鱼缸系统总体设…

一文读懂Linux

前言 为了便于理解&#xff0c;本文从常用操作和概念开始讲起。虽然已经尽量做到简化&#xff0c;但是涉及到的内容还是有点多。在面试中&#xff0c;Linux 知识点相对于网络和操作系统等知识点而言不是那么重要&#xff0c;只需要重点掌握一些原理和命令即可。为了方便大家准…

2024年5月19日优雅草蜻蜓K知识付费系统旗舰版v1.0.9进度更新

v1.1.0更新 v1.1.0更新 2024年5月19日优雅草蜻蜓K知识付费系统旗舰版v1.0.9进度更新&#xff0c;首页体育栏目完善新增用户发布页面 开发进度 首页体育栏目完善 新增用户发布页面 新增用户登录完善 新增学习课程页面完善-过往课程数据完成 去掉其他三方登录&#xff0c;新增…

java文档管理系统的设计与实现源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的文档管理系统的设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 文档管理系统的…

第二证券今日投资参考:5月国产游戏版号发放 猪价加速上涨

昨日&#xff0c;两市股指盘中震荡上扬&#xff0c;沪指盘中续创年内新高&#xff0c;创业板指一度涨超1%。到收盘&#xff0c;沪指涨0.54%报3171.15点&#xff0c;深证成指涨0.43%报9750.82点&#xff0c;创业板指涨0.59%报1875.93点&#xff0c;上证50指数涨0.34%&#xff1b…

小程序-收货地址管理模块实现

页面结构代码&#xff1a; address-form.vue --->新建地址和修改地址页面 <template><view class"content"><form><!-- 表单内容 --><view class"form-item"><text class"label">收货人</text>…

登录安全分析报告:创蓝云智注册

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

# 分布式链路追踪_skywalking_学习(1)

分布式链路追踪_skywalking_学习&#xff08;1&#xff09; 一、APM 系统概述 1、什么是 APM 系统&#xff1f; APM &#xff1a;全称 Application Performance Management 即应用性能管理系统。是对企业系统即时监控以实现对应用程序性能管理和故障管理的系统化的解决方案。…