Redis的数据结构到底是一种什么样的结构?
有了上一篇NoSQL的基础,我们也都知道了Redis就是一种典型的NoSql,那我们就先简简单单的介绍一下Redis:
Redis是什么?
Redis(Remote Dictionary Server)是一个开源的使用ANSI C语言编写的高性能键值存储系统,它以键值对(key-value)的形式存储数据,并提供了快速、稳定的数据读写操作。
以下是Redis的一些重要特点和结构:
- 键值存储:Redis使用键值对来存储数据。每个键都是唯一的,并且可以使用各种不同的数据类型作为值。
- 数据类型:Redis支持多种数据类型,包括字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(sorted set)等。这些数据类型提供了灵活的数据操作方式。
- 内存存储:Redis的数据通常存储在内存中,这使得它能够提供非常快的数据读写速度。同时,Redis也支持将数据持久化到硬盘上,以便在重启后恢复数据。
- 持久化方式:Redis提供了两种持久化方式,即RDB(Redis Database)快照和AOF(Append-Only File)日志。RDB可以在指定时间间隔内将数据集快照存储到硬盘上,而AOF则记录了每个写操作的日志,通过重放日志来恢复数据。
- 高性能:Redis使用了多种优化技术来提供高性能的数据读写操作。其中包括使用单线程模型、基于内存的操作、异步IO等。
总的来说,Redis是一个高性能、灵活、可靠的键值存储系统,适用于各种场景,如缓存、消息队列、计数器、实时排行榜等。它不仅仅是一个简单的缓存工具,还提供了丰富的数据结构和强大的功能,使得开发人员可以更便捷地构建复杂的应用程序。
Redis的键和值分别是什么?
在Redis中,键和值分别指存储在Redis数据库中的数据对中的两部分。
键是什么?键是用来唯一标识某个数据项的标识符。它是一个字符串,用于将数据存储在Redis中并在需要时检索。键是唯一的,具有相同键的数据项将会被覆盖。
值是什么?值是存储在Redis数据库中与键相关联的实际数据。值可以是不同的数据类型,如字符串、哈希、列表、集合、有序集合等。根据不同的数据类型,值可以具有不同的操作和结构。
总结一下:通过上面的描述,我们知道,Redis的键通常只是String类型,而我们通常所说的Redis的数据类型,其实指的就是Redis的一个键值对的值,值的数据类型时多种多样的。这就是我们要学习Redis数据结构之前需要先了解的最重要的一点。
Redis常用五种数据结构?
1.String类型(字符串)
String类型,也就是字符串类型,是Redis中最简单的存储类型。其value是字符串,不过根据字符串的格式不同,又可以分为3类:
-
string:普通字符串
-
int:整数类型,可以做自增、自减操作
-
float:浮点类型,可以做自增、自减操作
不管是那种格式,底层都是字节数组形式存储,只不过是编码方式不同。字符串类型的最大空间不能超过512m
String类型的常见命令

key的层级结构
Redis的key允许有多个单词形成层级结构,多个单词之间用':'隔开,格式如下:
我们用:隔开后,会很自然的形成层级结构:
如果Value是一个Java对象,例如一个User对象,则可以将对象序列化为JSON字符串(实质还是string类型)后存储:
2.哈希类型
Hash类型,也叫散列,其value是一个无序字典,类似于Java中的HashMap结构。
为什么会有这种结构?
因为String结构存储json时是将对象序列化为JSON字符串后存储,当需要修改对象某个字段时很不方便,而Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD:
String存json如下:

Hash结构存如下:

并且value中可以有多个字段,优势在于更加灵活,可以操作具体的value中的某个字段,而String不能做到。
Hash类型中的常见命令

3.list列表
Redis中的list类型与Java中的LinkedList类似,可以看做是一个双向链表结构。即可以支持正向检索也可以支持反向检索。
结构:user(键) 1 2 3(都是值)

值有多个;且是有序的,有索引。
特征也与LinkedList类似
-
有序
-
元素可以重复
-
插入和删除一样块
-
查询速度一般
常用命令:

4.set
Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。因为也是一个hash表,因此具备与HashSet类似的特征:
-
无序
-
元素不可重复
-
查找快
-
支持交集、并集、差集等功能
存储的元素们是无序的,就是不按照添加的顺序,也不重复。
单个集合的操作:
sadd key 元素1,元素2,... 添加元素
srem key 元素 删除元素
smembers key 查看指定key中所有元素
scard key 查看元素数量
sismember key member:判断一个元素是否存在于set中
smembers:获取set中所有元素
多个集合之间的操作:
sinter key1 key2... :求key1与key2的交集
sdiff key1 key2... :求key1与key2的差集
sunion key1 key2... :求key1和key2的并集
5.zset
(sorted set:有序集合)
存储的元素们是可以排序(可以自己指定排序的规则)的set集合,也是不允许重复的。
Redis的SortedSet是一个可排序的set集合,与Java中的TreeSet有些类似,但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkipList)加hash表。SortedSet具备下列特性:
-
可排序
-
元素不重复
-
查询速度快
因为SortedSet的可排序特性,经常被用来实现排行榜这样的功能。

注:member指添加进来的元素。
常见操作:
zadd key score member:添加一个或多个元素到sorted set。同时需要加入分数,这个分数是我们自己加入的。如果已经存在则更新其score值。
zrem key member:删除sorted set中的一个指定元素。
zscore key member:获取key中value指定元素member的score值。
zrank key member:获取key中指定元素member的排名。
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即可。
总结
Redis是一个key-value的数据库,key一般是String类型,不过value的类型多种多样,以下的类型一般我们都指的是value的类型,键多是String,可能最多只会有什么层级结构;而value是多样的,比如value是set类型,那么存进去的就是多个set元素,相当于value就是一个set集合;再比如value类型是hash类型,就相当于与value中也进行键值对存储,而且可以有多对。
以上就是Redis中常用的数据结构,需要注意的是,上面提及的命令都是需要在控制端输入的,当然我们也可以使用一些可视化工具进行数据的操作。

相关文章:
Redis的数据结构到底是一种什么样的结构?
有了上一篇NoSQL的基础,我们也都知道了Redis就是一种典型的NoSql,那我们就先简简单单的介绍一下Redis: Redis是什么? Redis(Remote Dictionary Server)是一个开源的使用ANSI C语言编写的高性能键值存储系统…...
eclipse 导入项目js报错问题
eclipse 导入项目后会出现项目中的js文件报错(红叉),如下图所示,有时候报错的文件很多,需要集中处理。 解决办法: 右键项目名称》Properties》MyEclipse》JavaScript》Include Path,在右侧选择“…...
《HeadFirst设计模式(第二版)》第七章代码——外观模式
代码文件目录: Subsystem: Amplifier package Chapter7_AdapterAndFacadePattern.FacadePattern.Subsystem;/*** Author 竹心* Date 2023/8/8**///扬声器 public class Amplifier {int volume 0;//音量public void on(){System.out.println("The amplifier …...
前端杂项-个人总结八股文的背诵方案
个人总结八股文的背诵方案 URL到显示网页的过程 浏览器解析URL,获取协议,主机名,端口号,路径等信息,并通过DNS查询将主机名转换为对应的IP地址浏览器与服务器建立TCP,进行三次握手。浏览器向服务器发送HT…...
利用 3D 地理空间数据实现Cesium的沉浸式环境
推荐:使用 NSDT场景编辑器 助你快速搭建可编辑的3D应用场景 为了将大量异构 3D 地理空间数据处理和分散到各行各业的地理空间应用程序和运行时引擎,Cesium 创建了 3D Tiles,这是一种用于高效流式传输和渲染大量异构数据集的开放标准。3D Tile…...
微服务——ES实现自动补全
效果展示 在搜索框根据拼音首字母进行提示 拼音分词器 和IK中文分词器一样的用法,按照下面的顺序执行。 # 进入容器内部 docker exec -it elasticsearch /bin/bash# 在线下载并安装 ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch…...
北斗+5G 织就精确定位的“天罗地网”
今年,邓中亮更忙了。 外部会议,内部讨论,课题研究,还有疫情困扰期间没能出的差铆足劲似的补上,一天里,从离开床和回到床中间的时间都被工作冠名了。 北京邮电大学教授邓中亮 忙碌的加速键在2020年按下暂停…...
Ansible Roles详解
Ansible 的角色(Roles)是一种组织和管理任务和变量的方法,可以帮助您更好地组织和重用 Ansible 代码。角色是一个可重用的、自包含的 Ansible 单元,它封装了一组任务和变量,可以在不同的剧本中轻松地重用。 角色的目录…...
微服务学习笔记-基本概念
微服务是一种经过良好架构设计的分布式架构方案。根据业务功能对系统做拆分,每个业务功能模块作为独立项目开发,称为一个服务。 微服务的架构特征: 单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力&…...
Linux查看GPU显卡/CPU内存/硬盘信息
显卡信息命令/CPU内存/硬盘 1.显卡2、CPU内存3、硬盘 1.显卡 nvidia-smi nvidia-smi(显示一次当前GPU占用情况) nvidia-smi -l(每秒刷新一次并显示) watch -n 5 nvidia-smi (其中,5表示每隔6秒刷新一次终端…...
SQLAlchemy 入门:Python 中的 SQL 工具包和 ORM
SQLAlchemy 是 Python 中一款非常流行的数据库工具包,它对底层的数据库操作提供了高层次的抽象。在本篇文章中,我们将介绍 SQLAlchemy 的两个主要组成部分:SQL 工具包 (SQL Toolkit) 和对象关系映射器 (Object-Relational Mapper, ORM) 的基本…...
react Hook+antd封装一个优雅的弹窗组件
前言 在之前学vue2的时候封装过一个全局的弹窗组件,可以全局任意地方通过this调用,这次大创项目是用react技术栈,看了一下项目需求,突然发现弹窗还是比较多的,主要分为基础的弹窗以及form表单式的弹窗,如果…...
HICP学习--BGP综合小实验
需要完善 一、实验拓扑 二、实验需求 1、R2-7每台路由器均存在一个环回接口用于建立邻居,同时还存在一个环回来代表连接用户的接口;最终这些连接用户的接口网络需要可以和R1/8的环回通讯 2、AS2网段地址172.16.0.0/16 减路由条目数量 三、实验步骤 首先配置IP R…...
grafana中利用变量来添加dashboard详情页地址实现点击跳转
背景 最近弄grafana的dashboard,突然想到各个dashboard之前可以直接跳转到不同详细页面的面板,于是找了找实现方法 实现 以stat 格式的面板为例,显示出各个pod的对应状态, PromQL是(avg(kube_pod_status_phase{phase"Running", namespace!"kube-system"…...
正则表达式练习
正则表达式练习 工具目的代码运行结果 工具 pycharm 目的 https://www.77xsw.cc/fenlei/1_1/:第一页的网址 https://www.77xsw.cc/fenlei/1_2/:第二页的网址 ... https://www.77xsw.cc/fenlei/1_10/:第十页的网址 代码 import requests im…...
leetcode做题笔记73矩阵置零
给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 思路一:记录行列值 void setZeroes(int** matrix, int matrixSize, int* matrixColSize){int row[matrixSize],col[*matrixColSize];fo…...
【2.1】Java微服务: Nacos的使用
目录 Nacos介绍 Nacos安装 下载和安装 修改端口 启动 服务注册与发现 导入Nacos管理依赖 导入服务依赖 配置Nacos的服务地址 启动服务,查看已注册的服务 服务分级存储模型 分级存储模型介绍 具体结构 配置实例集群 同集群优先的负载均衡策略 服务权重配置…...
vue安装及环境配置
vue安装及环境配置 1.安装 Node.js 2.配置默认安装目录和缓存日志目录 3.配置环境变量 4.配置淘宝镜像 5.安装vue和脚手架 6.创建并运行项目 1.安装 Node.js Download | Node.js 在这里👆下载的是最新版,如果要安装以前的版本👇&…...
java使用正则表达式时遇到的问题
标准的正则表达式是什么样的 Node.js(JavaScript) 在正则表达式中,斜杠(/)用来表示正则表达式的开始和结束。在JavaScript中,正则表达式可以使用斜杠包裹起来,以表示这是一个正则表达式的字面量。 在Node.js中&…...
Git介绍及常用命令详解
一、Git的概述 Git是一个分布式版本控制工具,通常用来对软件开发过程中的源代码文件进行管理。 Git 会跟踪我们对文件所做的更改,因此我们可以记录已完成的工作,并且可以在需要时恢复到特定或以前的版本。Git 还使多人协作变得更加容易&…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...



