Redis模块四:常见的数据类型和使用

news2024/12/25 23:57:41

目录

Redis 的 5 大基础数据类型

①字符串类型(String)

②字典类型(Hash)  

③列表类型(List)  

④集合类型(Set)   

⑤有序集合类型(ZSet)


Redis 的 5 大基础数据类型

String——字符串类型
Hash——字典类型

List——列表类型
Set——集合类型
ZSet——有序集合类型  

其中最常用的是字符串字典类型。  

①字符串类型(String)

字符串类型(Simple Dynamic Strings 简称 SDS),译为:简单动态字符串,它是以键值对 key-value 的形式进⾏存储的,根据 key 来存储和获取 value 值,它的使⽤相对来说⽐较简单,但在实际项⽬中应⽤⾮常⼴泛。   

字符串的使用如下:  

127.0.0.1:6379> set k1 v1 # 添加数据
OK
127.0.0.1:6379> get k1 # 查询数据
"v1"
127.0.0.1:6379> strlen k1 # 查询字符串的⻓度
(integer) 2

我们也可以使⽤ ex(expires)参数来设置字符串的过期时间,如下代码所示: 

127.0.0.1:6379> set k1 v1 ex 1000 # 设置 k1 1000s 后过期(删除)
OK  

字符串的常见使用场景: 

存放用户(登录)信息;
存放文章详情和列表信息;
存放和累计网页的统计信息。
......  

②字典类型(Hash)  

字典类型 (Hash) 又被称为散列类型或者是哈希表类型,它是将⼀个键值 (key) ⼀个特殊的“哈希表”关联起来,这个“哈希表”包含两列数据:字段和值它就相当于 Java 中的Map<String,Map<String,String>> 结构。  

假如我们使用字典类型来存储⼀篇⽂章的详情信息,存储结构如下图所示:  

同理我们也可以使用字典类型来存储用户信息(String)并且使用字典类型来存储此类信息就无需手动序列化和反序列化数据了,所以使⽤起来更加的方便和高效。  

字典类型的使⽤如下:  

127.0.0.1:6379> hset myhash key1 value1 # 添加数据
(integer) 1
127.0.0.1:6379> hget myhash key1 # 查询数据
"value1"  

单值hset:

多值hmset:

字典类型的数据结构,如下图所示:  

通常情况下字典类型会使用数组的⽅式来存储相关的数据,但发⽣哈希冲突时才会使用链表的结构来存储数据。   

③列表类型(List)  

列表类型 (List) 是⼀个使⽤链表结构存储的有序结构,它的元素插⼊会按照先后顺序存储到链表结构中,因此它的元素操作 (插⼊和删除) 时间复杂度为 O(1),所以相对来说速度还是⽐较快的,但它的查询时间复杂度为 O(n),因此查询可能会⽐较慢。

扩展:

Redis的列表(List)是一种基于Reactor模式的双端队列结构,它支持在列表的一端插入元素,并在另一端弹出元素。
在Redis中,列表是通过两个指针(即表头和表尾)来维护的。当插入一个新元素时,它会被添加到表尾,而当弹出元素时,将会从表头删除。这种设计使得插入和弹出操作可以在O(1)时间复杂度内完成。
由于Redis的列表是按照插入的先后顺序进行存储的,因此最新的元素总是位于表尾,而最早插入的元素则位于表头。这意味着你可以通过使用LPUSH命令将新元素插入到表头,或者使用RPUSH命令将新元素插入到表尾
以下是Redis的列表操作的一些常用命令:

LPUSH key value:将一个或多个值插入到列表的头部。
RPUSH key value:将一个或多个值插入到列表的尾部。
LPOP key:移除并返回列表的第一个元素。
RPOP key:移除并返回列表的最后一个元素。
LLEN key:返回列表的长度。

需要注意的是,Redis的列表并不是一个完全的队列结构,因为它们不支持在中间插入或删除元素但是,你可以使用Redis的其它数据结构(如有序集合ZSet、哈希表Hash)来实现完全的队列行为。

列表类型的使⽤如下: 

127.0.0.1:6379> rpush list 1 2 3 # 将新元素插入到表尾
(integer) 3
127.0.0.1:6379> lpop list # 获取并删除列表的第⼀个元素

列表的典型使⽤场景有以下两个: 

  • 消息队列:列表类型可以使⽤ rpush 实现在列表末尾添加数据的功能,同时又可以使用 lpop 轻松的弹出(查询并删除)第⼀个元素,所以列表类型可以⽤来实现消息队列;
  • 文章列表:对于博客站点来说,当⽤户和⽂章都越来越多时,为了加快程序的响应速度,我们可以把用户自己的⽂章存⼊到 List 中,因为 List 是有序的结构,所以这样又可以完美的实现分页功能,从而加速了程序的响应速度。---现在这种用法几乎不存在  

④集合类型(Set)   

集合类型 (Set) 是⼀个无序并唯⼀的键值集合。  

集合类型的使用如下:

127.0.0.1:6379> sadd myset v1 v2 v3 # 添加数据
(integer) 3
127.0.0.1:6379> smembers myset # 查询集合中的所有数据
1) "v1"
2) "v3"
3) "v2"  

集合类型的经典使用场景如下: 

  • 微博关注我的⼈和我关注的⼈都适合⽤集合存储,可以保证⼈员不会重复;
  • 中奖⼈信息也适合⽤集合类型存储,这样可以保证⼀个⼈不会重复中奖。 

集合类型(Set)和列表类型(List)的区别如下:   

  • 列表可以存储重复元素,集合只能存储⾮重复元素;
  • 列表是按照元素的先后顺序存储元素的,⽽集合则是⽆序⽅式存储元素的。  

⑤有序集合类型(ZSet)

有序集合类型 (Sorted Set) 相比于集合类型多了⼀个排序属性 score(分值),对于有序集合 ZSet 来说,每个存储元素相当于有两个值组成的,⼀个是有序集合的元素值⼀个是排序值。有序集合的存储元素值也是不能重复的,但分值是可以重复的

拓展:

Redis的有序集合(Sorted Set)是string类型元素的集合,每个成员都是一个String,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。对于相同分数的成员会按照字母序的顺序进行排序
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。集合中最大的成员数为232-1(4294967295,每个集合可存储40多亿个成员)。

ps:

哈希表是集合的一种实现方式,是一种使用哈希函数组织数据,以支持快速插入和搜索的数据结构。
哈希表由一个个的桶组成,每个桶中可以存放一个或多个键值对。每个键值对之间没有明确的顺序关系,查找某个元素时,通过哈希函数计算出对应的桶,然后在桶中查找对应的键值对,就可以找到所查元素。
哈希表具有查找速度快,插入、删除也很快的特点,其时间复杂度都是O(1),即无论数据量多大,只要哈希函数设计合理,都可以在常数时间内完成查找、插入、删除等操作。

有序集合的用法如下: 

ZADD key score member:将一个成员元素加入到有序集合当中。如果这个元素已经存在于集合中,那么更新这个元素的分数。
ZINCRBY key increment member:为有序集合中的指定成员的分数加上增量increment。
ZCARD key:返回有序集合的成员数。
ZCOUNT key min max:返回有序集合中指定分数范围内的成员数。
ZLEXCOUNT key min max:返回有序集合中指定字典序范围内的成员数。
ZRANK key member:返回有序集合中指定成员的升序排名。
ZREVRANK key member:返回有序集合中指定成员的降序排名。
ZPOPMIN key [key ...] timeout:阻塞式的zpopmin命令,timeout为秒级精度。命令依次检查给定的有序集合,并从第一个非空集合弹出分值最小元素,否则阻塞当前客户端直到有元素或超出超时时间返回nil。成功弹出元素时将返回一个列表,包含被弹出元素所在有序集合、成员以及分值。 

当我们把学生的成绩存储在有序集合中时,它的存储结构如下图所示: 

有序集合类型的使用如下:   

127.0.0.1:6379> zadd zset1 3 golang 4 sql 1 redis # 添加数据
(integer) 3
127.0.0.1:6379> zrange zset 0 -1 # 查询所有数据
1) "redis"
2) "golang"
3) "sql"  

有序集合的经典使用场景如下: 

  • 学生成绩排名;
  • 粉丝列表,根据关注的先后时间排序。


 

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

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

相关文章

后发而先至的腾讯混元大模型,到底有哪些技术亮点?

2023年的夏天已经结束了&#xff0c;但是&#xff0c;围绕AIGC大模型的关注热度&#xff0c;却丝毫没有衰退的意思。 在过去的大半年里&#xff0c;我们亲眼见证了大模型浪潮的崛起&#xff0c;甚至可以说是疯狂。截止7月&#xff0c;国内的大模型数量&#xff0c;已经超过130个…

MySQL与ES数据同步之异步调用

文章目录 简述SpringBoot项目引入依赖配置文件项目结构实体类配置类RabbitMQ交换机队列声明&#xff0c;绑定配置类回调接口配置类 Mapper接口UserMapper接口UserEsMapper Controller类Service接口Service实现类监听类/消费者 简述 上一篇是同步调用&#xff0c;我们在中间加上…

【海思SS626 | 开发环境】VMware17安装Ubuntu 18.04.6

目录 一、下载 Ubuntu 18.04.6 LTS二、VMware17创建虚拟机三、安装Ubuntu18.04LTS四、安装其他软件五、总结 一、下载 Ubuntu 18.04.6 LTS 问题&#xff1a;为什么要下载 Ubuntu18.04.6 LTS 而不是使用最新的&#xff0c;或者其他Linux发行版&#xff1f; 答&#xff1a;在ss6…

Python 图形化界面基础篇:使用框架( Frame )组织界面

Python 图形化界面基础篇&#xff1a;使用框架&#xff08; Frame &#xff09;组织界面 引言什么是 Tkinter 框架&#xff08; Frame &#xff09;&#xff1f;步骤1&#xff1a;导入 Tkinter 模块步骤2&#xff1a;创建 Tkinter 窗口步骤3&#xff1a;创建框架&#xff08; F…

如何做到安全上网

随着信息化的发展&#xff0c;企业日常办公越来越依赖互联网&#xff0c;而访问互联网过程中&#xff0c;会遇到各种各样不容忽视的风险&#xff0c;例如员工主动故意的数据泄漏&#xff0c;后台应用程序偷偷向外部发信息&#xff0c;木马间谍软件的外联&#xff0c;以及各种挖…

聚观早报 | 荣耀V Purse定档;哪吒S迎来最新OTA升级

【聚观365】9月13日消息 荣耀V Purse定档 哪吒S迎来最新OTA升级 宝马将向其英国工厂投资7.5亿美元 英伟达称霸AI芯片领域致初创公司融资难 甲骨文第一财季收入约125亿美元增长9% 荣耀V Purse定档 不久前&#xff0c;荣耀官方推出了全新的荣耀Magic V2内折叠屏旗舰&#x…

【Linux从入门到精通】信号(信号保存 信号的处理)

本篇文章接着信号&#xff08;初识信号 & 信号的产生&#xff09;进行讲解。学完信号的产生后&#xff0c;我们也了解了信号的一些结论。同时还留下了很多疑问&#xff1a; 上篇文章所说的所有信号产生&#xff0c;最终都要有OS来进行执行&#xff0c;为什么呢&#xff1f;…

在Android studio 创建Flutter项目运行出现问题总结

在Android studio 中配置Flutter出现的问题 A problem occurred configuring root project ‘android’出现这个问题。解决办法 首先找到flutter配置的位置 在D:\xxx\flutter\packages\flutter_tools\gradle位置中的flutter.gradle buildscript { repositories { googl…

相机坐标系 -> 像素坐标系

代码链接&#xff1a;https://github.com/PanJinquan/python-learning-notes/blob/master/modules/utils_3d/camera_tools.py def __cam2pixel(cam_coord, f, c):"""相机坐标系 -> 像素坐标系: (f / dx) * (X / Z) f * (X / Z) / dxcx,ppx260.166; cy,ppy…

分库分表---理论

目录 一、垂直切分 1、垂直分库 2、垂直分表 3、垂直切分优缺点 二、水平切分 1、水平分库 2、水平分表 3、水平切分优缺点 三、数据分片规则 1、Hash取模分表 2、数值Range分表 3、一致性Hash算法 四、分库分表带来的问题 1、分布式事务问题 2、跨节点关联查询…

【FAQ】本地录像视频文件如何推送到视频监控平台EasyCVR进行AI视频智能分析?

安防监控平台EasyCVR支持多协议、多类型设备接入&#xff0c;可以实现多现场的前端摄像头等设备统一集中接入与视频汇聚管理&#xff0c;并能进行视频高清监控、录像、云存储与磁盘阵列存储、检索与回放、级联共享等视频功能。视频汇聚平台既具备传统安防监控、视频监控的视频能…

Vue2电商前台项目——完成Search搜索模块业务

Vue2电商前台项目——完成Search搜索模块业务 Vue基础知识点击此处——Vue.js 文章目录 Vue2电商前台项目——完成Search搜索模块业务一、项目开发的步骤二、各种请求数据并展示数据1、写Search模块的接口2、写Vuex中的search仓库3、组件拿到search仓库的数据&#xff08;1&…

详解HPE MSA 2040存储初始化配置划分卷

哈喽大家好&#xff0c;欢迎来到虚拟化时代君&#xff08;XNHCYL&#xff09;。 “ 大家好&#xff0c;我是虚拟化时代君&#xff0c;一位潜心于互联网的技术宅男。这里每天为你分享各种你感兴趣的技术、教程、软件、资源、福利……&#xff08;每天更新不间断&#xff0c;福…

mock技术在测试中的应用

技术简介 mock技术又叫测试桩、挡板 在软件测试中&#xff0c;对于一些不容易构造、获取的对象&#xff0c;用一个虚拟的对象来代替它&#xff0c;以达到相同的效果&#xff0c;这个虚拟的对象就是mock。 mock技术并不是只有测试领域用&#xff0c;最早是在开发领域应用&…

互联网电视流氓乱收费被市场惩罚,传统品牌合力挤压互联网电视

市调机构洛图科技&#xff08;RUNTO&#xff09;公布的6月份数据显示&#xff0c;传统电视品牌强势反弹&#xff0c;海信、TCL、创维的销量分别为60万台、58万台、57万台&#xff0c;名次分别为第一名、第三名、第四名&#xff0c;而曾连续数年位居国内电视行业第一名的某互联网…

精品基于NET实现的汽配网上商城系统

《[含文档PPT源码等]精品基于NET实现的汽配网上商城系统》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等 软件开发环境及开发工具&#xff1a; 开发软件&#xff1a;VS 2017 &#xff08;版本2017以上即可&#xff0c;不能低于2017&#xff09; 数…

第十二章总结

一.集合类概述 java.util包中提供了一些集合类&#xff0c;这些集合类又被称为容器。 集合类与数组的不同之处&#xff1a; 数组的长度是固定的&#xff0c;集合的长度是可变的&#xff1a;数组用来存放基本类型的数据&#xff0c;集合用来存放对象的引用。 常…

windows10系统下Python3.11中安装Numpy库教程

Python3.11中安装Numpy库目录 项目场景&#xff1a;问题描述解决方案&#xff1a;①下载Numpy文件②把NumPy文件放到Python安装的Scripts文件夹里。③安装numpy④安装验证 项目场景&#xff1a; numpy是开源的数值计算扩展&#xff0c;用于数据分析、机器学习、科学计算的重要…

(第十一天)初识SpringMVC SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录

SSM框架的学习与应用(Spring Spring MVC MyBatis)-Java EE企业级应用开发学习记录&#xff08;第十一天&#xff09;初识SpringMVC 今天我们要来学习一下SSM框架的最后一个框架SpringMVC 一、初认SpringMVC 基本概念&#xff1a; ​ Spring MVC&#xff08;Model-View-Co…

Qt应用开发(基础篇)——菜单 QMenu

一、前言 QMenu类继承于QWidget&#xff0c;它提供了一个菜单样式的小部件&#xff0c;用于菜单栏、上下文菜单和一些弹出式菜单。 QMenu菜单的选项是可选的&#xff0c;它可以是一个下拉的菜单&#xff0c;也可以是独立的上下文菜单。下拉菜单通常作用于当用户单击相应的项目或…