当前位置: 首页 > news >正文

Redis——数据结构介绍

Redis是一个key-value的数据库,key一般是String类型,不过value的类型是多样的:

  1. String:hello word
  2. Hash:{name:"Jack",age:21}
  3. List:[A -> B -> C -> D]
  4. Set:{A,B,C}
  5. SortedSet:{A:1,B:2,C:3}
  6. GEO:{A:(120.3,30.5)}(地理坐标)
  7. BitMap:01101101010111010000100
  8. HyperLog:01101101010111010000100

前五种是基本类型,后三种是特殊类型

对于数据结构的操作是使用命令的方式去操作数据,Redis的命令操作分为通用操作和不同的数据类型对应的特有操作,这些命令在官网中都可以查到:

这里的分组就是根据不同的数据对应不同数据的特有操作去查询对应的操作。

通用命令

通用命令是不分数据类型的,都可以使用的指令,在官网中对应的分组是Generic

除了在官网上可以看到对应的命令的描述之外,还可以在命令行中使用help的方式去查看命令的使用方法:

在命令行中的提示并没有官网中的详细。

常见的有:

  1. keys:查看符合模板的所有的key,模板为通配符表达式,其中*表示所有,?表示匹配单个字符,类似于模糊查询。由于执行效率慢,所以不建议在生产环境下使用。

  1. del:删除一个指定的key,可以传入多个key同时删除多个。

删除多个

  1. exists:判断某个key是否存在,可以判断一个或多个

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

  1. expire:给一个key设置有效期,有效期到期时该key会被自动删除。他有两个参数,第一个参数是key,第二个参数是有效期,以秒为单位
  2. ttl:查看一个key剩余的有效期

在每次查看的时候这个Key的有效期都会减少

最终到时间,一般消失的时候有效期会显示为-2,这时候就会消失:

在不使用expire设置有效期的时候,数据的有效期为-1,表示永久有效。

String类型

String类型,也就是字符串类型,是Redis中最简单的存储类型。

其value是字符串,不过根据字符串的格式不同,又可以分为3类:

  1. String:普通字符串
  2. int:整数类型,可以做自增,自减操作
  3. float:浮点类型,可以做自增,自减操作

不管是那种形式,底层都是字节数组形式存储,只不过是编码方式不同。字符类型的最大空间不能超过512m

String类型的常见命令

String的常见命令有:

  1. SET:添加或者修改已经存在的一个String类型的键值对
  2. GET:根据key获取String类型的value
  3. MSET:批量添加多个String类型的键值对
  4. MGET:根据多个key获取多个String类型的value
  5. INCR:让一个整形的key自增1
  6. INCRBY:让一个整形的key自增并指定步长,例如:incrby num 2让num值自增2
  7. INCRBYFLOAT:让一个浮点类型的数字自增并指定步长
  8. SETNX:添加一个String类型的键值对,前提是这个key不存在,否则不执行
  9. SETEX:添加一个String类型的键值对,并且指定有效期

Redis中key的结构

Redis的key允许有多个单词形成层级结构,多个单词之间用【:】隔开,格式如下:

项目名:业务名:类型:id

这个格式并不是强制的,而是一种约定,可以按照自己的情况去修改这个约定。

例如,当我们有两个ID都为1的数据,比如用户的ID为1,而我的商品的ID也是1,那么就可以使用层级的方式区分这两个ID,例如:

user相关的ID:project:user:1

商品相关的ID:project:product:1

如果value是一个对象,例如一个User对象,则可以将对象序列化为JSON字符串后存储:

product:user:1 = {"id":1,"name":"Jack","age":21}

product:product:1 = {"id":1,"name":"小米11","price":4999}

注意在插入的时候,在JSON字符串的外面有一个引号包裹着:

HASH类型

HASH类型,也叫散列,其value是一个无序字典,类似于Java中的HashMap结构。

String结构是将对象序列化为JSON字符串后存储,当需要修改对象某个字段时很不方便:

HASH结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD:

HASH类型的常见命令:

HSET key field value:添加或者修改hash类型key的field的值

HGET key field:获取一个hash类型key的field的值

HMSET:批量添加多个hash类型key的field的值

HMGET:批量获取多个hash类型key的field的值

HGETALL:获取一个hash类型的key中的所有的field和value

HKEYS:获取一个hash类型的key中的所有的field

HVALS:获取一个hash类型的key中的所有的value

HINCRBY:让一个hash类型key的字段值自增并指定步长

HSETNX:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行

LIST类型

Redis中的List类型与]ava中的LinkedList类似,可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索。

特征也与LinkedList类似:

  1. 有序
  2. 元素可以重复
  3. 插入和删除快
  4. 查询速度一般

常用来存储一个有序数据,例如: 朋友圈点赞列表,评论列表等。

LIST类型的常见命令

List的常见命令有:

LPUSH key element...:向列表左侧插入一个或多个元素

LPOP key:移除并返回列表左侧的第一个元素,没有则返回nil

RPUSH key element...:向列表右侧插入一个或多个元素

RPOP key:移除并返回列表右侧的第一个元素

LRANGE key star end:返回一段角标范围内的所有元素

BLPOP和BRPOP:与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil

L表示左侧,也就是队首的位置,R表示右侧,也就是队尾的位置。B表示阻塞,即如果没有取到值,则会等待一段时间之后才会结束。

当使用LPUSH的时候,实际存储的元素和你输入的元素位置是相反的:

比如,当我们使用LPUSH将数据输出进入,但是实际的存储顺序与输入的顺序相反:

使用RPUSH就是正常的输入顺序就是存储顺序:

实际的存储顺序如下图所示:

并且,需要注意的是,当你执行POP操作之后,数组里面的内容会消失:

当我们执行POP操作,POP两个元素:

在储存中就消失了两个元素。

阻塞指的是当我们获取某一个key对应的值的时候,这个值可能当时没有,但是经过一段时间的延迟之后才会被传入进去,这时候我们等待一段时间才能判断确实获取失败:

我们开启两个会话窗口,其中一个使用阻塞方法获取元素,另一个正常填充元素,但是我们现在首先启动阻塞方法去获取元素:

此时没有数据,他并不会马上就报错,而是等待一段时间,这个时间就是后面的参数,以秒为单位,比如上面我设置的是100秒,当100秒之后还没有数据,才会报错,现在我们执行另一个窗口中的传入元素的命令:

在另一个会话传入数据的一瞬间,另一边的阻塞获取数据的方法也会结束并获取到我们在另一个会话窗口中传入的数据。

如何利用LIST模拟一个栈

  1. 栈的特性是先入后出,则入口和出口在同一边,即,在传入元素的时候,使用LPOSH,则出的时候,使用LPOP,同理,如果进入的时候使用的是RPOSH,则出的时候也要使用RPOP

如何使用LIST模拟一个队列

  1. 队列的特定是陷先入先出,则入口和出口在两边,即传入元素的时候,使用LPOSH,则出的时候,使用RPOSH,同理,如果进入的时候使用的是RPOSH,则出的时候就要使用LPOP

如何使用LIST模拟一个阻塞队列

  1. 首先阻塞队列是一个队列,则使用上面的队列的顺序,只不过将普通方法换成阻塞方法即可。

SET类型

Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。因为也是一个hash表,因此具备与HashSet类似的特征:

  1. 无序
  2. 元素不可重复
  3. 查找快
  4. 支持交集、并集、差集等功能

SET的常用命令

在Redis中SET除了支持对单个SET的操作,还支持对多个SET之间的操作,就是求交集,并集,差集等操作,首先看对单个SET的操作指令:

SADD key member...:向set中添加一个或多个元素

SREM key member ...:移除set中的指定元素

SCARD key:返回set中元素的个数

SISMEMBER key member:判断一个元素是否存在于set中

SMEMBERS:获取set中的所有元素

然后是对多个SET的操作指令:

SINTER key1 key2…:求key1与key2的交集

SDIFF key1 key2…:求key1与key2的差集

SUNION key1 key2 …:求key1和key2的并集

SET的练习

--Set命令练习

-- 将下列数据用Redis的Set集合来存储

-- 张三的好友有:李四、王五、赵六

-- 李四的好友有:王五、麻子、二狗

SADD zhangsan lis wangwu zhaoliu

SADD lisi wangwu mazi ergou

-- 利用Set的命令实现下列功能:

-- 计算张三的好友有几人

SCARD zhangsan

-- 计算张三和李四有哪些共同好友

SINTER zhangsan lisi

-- 查询哪些人是张三的好友却不是李四的好友

SDIFF zhangsan lisi

-- 查询张三和李四的好友总共有哪些人

SUNION zhangsan lisi

-- 判断李四是否是张三的好友

SISMEMBER zhangsan lisi

-- 判断张三是否是李四的好友

SISMEMBER lisi zhangsan

-- 将李四从张三的好友列表中移除

SREM zhangsan lisi

SORTEDSET类型

Redis的SortedSet是一个可排序的set集合,与]ava中的TreeSet有些类似,但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkipList)加 hash表

SortedSet具备下列特性:

  1. 可排序
  2. 元素不重复
  3. 查询速度快

因为SortedSet的可排序特性,经常被用来实现排行榜这样的功能。

Redis并不是基于元素本身进行排序,而是基于元素自带的score属性进行排序。

SORTEDSET类型的常用命令:

ZADD key score member:添加一个或多个元素到sorted set,如果已经存在则更新其score值

ZREM key member:删除sorted set中的一个指定元素

ZSCORE key member:获取sorted set中的指定元素的score值

ZRANK key member:获取sorted set 中的指定元素的排名

ZCARD key:获取sorted set中的元素个数

ZCOUNT key min max:统计score值在给定范围内的所有元素的个数

ZINCRBY key increment member:让sorted set中的指定元素自增,步长为指定的increment值

ZRANGE key min max:按照score排序后,获取指定排名范围内的元素

ZRANGEBYSCORE key min max:按照score排序后,获取指定score范围内的元素

ZDIFF、ZINTER、ZUNION:求差集、交集、并集

注意:所有的排名默认都是升序,如果要降序则在命令的Z后面添加REV即可

SortedSet命令练习

-- SortedSet命令练习

-- 将班级的下列学生得分存入Redis的SortedSet中

-- Jack 85, Lucy 89, Rose 82, Tom 95, Jerry 78, Amy 92, Miles 76

ZADD student 85 Jack 89 Locy 82 Rose 95 Tom 78 Jerry 92 Amy 76 Miles

-- 并实现下列功能:

-- 删除Tom同学

ZREM student Tom

-- 获取Amy同学的分数

ZSCORE student Amy

-- 获取Rose同学的排名

ZREVRANK student Rose

-- 查询80分以下有几个学生

ZCOUNT student 0 80

-- 给Amy同学加2分

ZINCRBY student 2 Amy

-- 查出成绩前3名的同学

ZREVRANGE student 0 2

-- 查出成绩80分以下的所有同学

ZRANGEBYSCORE student 0 80

相关文章:

Redis——数据结构介绍

Redis是一个key-value的数据库,key一般是String类型,不过value的类型是多样的: String:hello wordHash:{name:"Jack",age:21}List:[A -> B -> C -> D]Set:{A,B,C}SortedSet…...

附录2-将三国演义按章节存储为不同的txt(bs4)

地址 《三国演义》全集在线阅读_史书典籍_诗词名句网 目录 1 项目分析 2 代码 1 项目分析 我们可以在首页中找到所有的章节 每一个章节是一个a标签,a标签连接到该章节的内容 但这个网站他有bug,章节都是乱套的,我们无视这种错误&#…...

现代C++中的从头开始深度学习:【6/8】成本函数

现代C中的从头开始深度学习:成本函数 一、说明 在机器学习中,我们通常将问题建模为函数。因此,我们的大部分工作都包括寻找使用已知模型近似函数的方法。在这种情况下,成本函数起着核心作用。 这个故事是我们之前关于卷积的讨论的…...

Vue——vue3中的ref和reactive数据理解以及父子组件之间props传递的数据

ref()函数 这是一个用来接受一个内部值,返回一个响应式的、可更改的 ref 对象,此对象只有一个指向其内部值的属性 .value。 作用:创建一个响应式变量,使得某个变量在发生改变时可以同步发生在页面上。 模板语句中使用这个变量时…...

新手如何备考PMP考试?

回头看来,从战略上来说: 备考第一重点:要有一个清晰的目标——我要过! 第二重点:足够重视它——把它的优先级调整到仅次于工作:万籁俱寂,唯有学习。 第三重点:自律——有了第一点…...

FPGA输出lvds信号点亮液晶屏

1 概述 该方案用于生成RGB信号,通过lvds接口驱动逻辑输出,点亮并驱动BP101WX-206液晶屏幕。 参考:下面为参考文章,内容非常详细。Xilinx LVDS Output——原语调用_vivado原语_ShareWow丶的博客http://t.csdn.cn/Zy37p 2 功能描述 …...

算法面试-深度学习基础面试题整理(2023.8.29开始,每天下午持续更新....)

一、无监督相关(聚类、异常检测) 1、常见的距离度量方法有哪些?写一下距离计算公式。 1)连续数据的距离计算: 闵可夫斯基距离家族: 当p 1时,为曼哈顿距离;p 2时,为欧…...

FireFox禁用HTTP2

问题 最近需要调试接口,但是,Chrome都是强制使用h2协议,即HTTP/2协议。为了排除h2协议排除对接口调用的影响,需要强制浏览器使用HTTP1协议。 解决 FireFox 设置firefox的network.http.http2.enabled为禁用,这样就禁…...

搭建HTTPS服务器

HTTPS代理服务器的作用与价值 HTTPS代理服务器可以帮助我们实现网络流量的转发和加密,提高网络安全性和隐私保护。本文将指导您从零开始搭建自己的HTTPS代理服务器,让您更自由、安全地访问互联网。 1. 准备工作:选择服务器与操作系统 a. 选…...

无人化在线静电监控系统的组成

无人化在线静电监控系统是一种用于检测和监控静电情况的系统,它可以自动地实时监测各个区域的静电水平,并在出现异常情况时发出报警信号。静电监控报警器则是该系统中的一个重要组成部分,用于接收和传达报警信号。 无人化在线静电监控系统通…...

element ui级联选择器数据处理

后端同事返回的级联选择器数据的children是childrens&#xff0c;而组件渲染只识别children&#xff0c;所以需要props自定义传入&#xff0c;代码如下 <el-form-item label"应用页面&#xff1a;" prop"appId"><el-cascader:props"{ child…...

zookeeper-3.6.4集群搭建

1、上传zookeeper安装包并解压 上传路径&#xff1a;/opt/software/ 解压路径&#xff1a;/opt/module/ 2、创建数据目录及日志目录 #数据目录&#xff1a;/data/zookeeper/data/ #3台机器创建存储目录&#xff1a; sudo mkdir -p /data/zookeeper/data#日志目录&#xff1a…...

15种下载文件的方法文件下载方法汇总超大文件下载

15种下载文件的方法&文件下载方法汇总&超大文件下载 15种下载文件的方法Pentesters经常将文件上传到受感染的盒子以帮助进行权限提升&#xff0c;或者保持在计算机上的存在。本博客将介绍将文件从您的计算机移动到受感染系统的15种不同方法。对于那些在盒子上存在且需要…...

Windows安装配置Rust(附CLion配置与运行)

Windows安装配置Rust&#xff08;附CLion配置与运行&#xff09; 前言一、下载二、安装三、配置标准库&#xff01;&#xff01;&#xff01;四、使用 CLion 运行 rust1、新建rust项目2、配置运行环境3、运行 前言 本文以 windows 安装为例&#xff0c;配置编译器为 minGW&…...

【ROS】例说mapserver静态地图参数(对照Rviz、Gazebo环境)

文章目录 例说mapserver静态地图参数1. Rviz中显示的地图2. mapserver保存地图详解3. 补充实验 例说mapserver静态地图参数 1. Rviz中显示的地图 在建图过程中&#xff0c;rviz会显示建图的实时情况&#xff0c;其输出来自于SLAM&#xff0c;浅蓝色区域为地图大小&#xff0c…...

【RapidAI】P0 项目总览

RapidAI 项目总览 ** 内容介绍 ** Author&#xff1a; SWHL、omahs Github&#xff1a; https://github.com/RapidAI/Knowledge-QA-LLM/ CSDN Author&#xff1a; 脚踏实地的大梦想家 UI Demo&#xff1a; ** 读者须知 ** 本系列博文&#xff0c;主要内容为将 RapidAI 项目逐…...

初识c++

文章目录 前言一、C命名空间1、命名空间2、命名空间定义 二、第一个c程序1、c的hello world2、std命名空间的使用惯例 三、C输入&输出1、c输入&输出 四、c中缺省参数1、缺省参数概念2、缺省参数分类3、缺省参数应用 五、c中函数重载1、函数重载概念2、函数重载应用 六、…...

【面试经典150题】跳跃游戏Ⅱ

题目链接 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i]i j < n 返回到达 nums[n…...

20230831-完成登录框的按钮操作,并在登录成功后进行界面跳转

登录框的按钮操作&#xff0c;并在登录成功后进行界面跳转 app.cpp #include "app.h" #include <cstdio> #include <QDebug> #include <QLineEdit> #include <QLabel> #include <QPainter> #include <QString> #include <Q…...

039 - sql逻辑操作符

前提&#xff1a; 做两个表employee和movie&#xff0c;用来练习使用&#xff1b; 表一&#xff1a;employee -- 创建表employee CREATE TABLE IF NOT EXISTS employee(id INT NOT NULL AUTO_INCREMENT,first_name VARCHAR(100) NOT NULL,last_name VARCHAR(100) NOT NULL,t…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

安卓基础(Java 和 Gradle 版本)

1. 设置项目的 JDK 版本 方法1&#xff1a;通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分&#xff0c;设置 Gradle JDK 方法2&#xff1a;通过 Settings File → Settings... (或 CtrlAltS)…...

基于鸿蒙(HarmonyOS5)的打车小程序

1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...

恶补电源:1.电桥

一、元器件的选择 搜索并选择电桥&#xff0c;再multisim中选择FWB&#xff0c;就有各种型号的电桥: 电桥是用来干嘛的呢&#xff1f; 它是一个由四个二极管搭成的“桥梁”形状的电路&#xff0c;用来把交流电&#xff08;AC&#xff09;变成直流电&#xff08;DC&#xff09;。…...