Redis的数据结构到底是一种什么样的结构?

news/2024/11/17 23:37:53/

有了上一篇NoSQL的基础,我们也都知道了Redis就是一种典型的NoSql,那我们就先简简单单的介绍一下Redis:

Redis是什么?

Redis(Remote Dictionary Server)是一个开源的使用ANSI C语言编写的高性能键值存储系统,它以键值对(key-value)的形式存储数据,并提供了快速、稳定的数据读写操作。

以下是Redis的一些重要特点和结构:

  1. 键值存储:Redis使用键值对来存储数据。每个键都是唯一的,并且可以使用各种不同的数据类型作为值。
  2. 数据类型:Redis支持多种数据类型,包括字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(sorted set)等。这些数据类型提供了灵活的数据操作方式。
  3. 内存存储:Redis的数据通常存储在内存中,这使得它能够提供非常快的数据读写速度。同时,Redis也支持将数据持久化到硬盘上,以便在重启后恢复数据。
  4. 持久化方式:Redis提供了两种持久化方式,即RDB(Redis Database)快照和AOF(Append-Only File)日志。RDB可以在指定时间间隔内将数据集快照存储到硬盘上,而AOF则记录了每个写操作的日志,通过重放日志来恢复数据。
  5. 高性能: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中常用的数据结构,需要注意的是,上面提及的命令都是需要在控制端输入的,当然我们也可以使用一些可视化工具进行数据的操作。

 


http://www.ppmy.cn/news/1028505.html

相关文章

山西电力市场日前价格预测【2023-08-13】

日前价格预测 预测明日(2023-08-13)山西电力市场全天平均日前电价为351.64元/MWh。其中,最高日前电价为404.00元/MWh,预计出现在19: 30。最低日前电价为306.39元/MWh,预计出现在13: 15。 价差方向预测 1: 实…

macOS使用ffmpeg与QT进行音视频推拉流

1.先启动流服务器 ./mediamtx 2.开始推流: ffmpeg -re -stream_loop -1 -i /Users/hackerx/Desktop/test.mp4 -c copy -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/stream 3. 安装ffmpeg 4.4 brew install ffmpeg4 4.添加ffmpeg头文件目录与库目录 5.链接ffmpeg相关库…

Java地图专题课 基本API BMapGLLib 地图找房案例 MongoDB

本课程基于百度地图技术,由基础入门开始到应用实战,适合零基础入门学习。将企业项目中地图相关常见应用场景的落地实战,包括有地图找房、轻骑小程序、金运物流等。同时讲了基于Netty实现高性能的web服务,来处理高并发的问题。还讲…

软件测试基础篇——LAMP环境搭建

LAMP 1、Linux系统的其他命令 find命令:在目录下查找文件 ​ 格式一:find 路径 参数 文件名 ​ 路径:如果没有指定路径,默认是在当前目录下 ​ 参数:-name 根据文件名来查找,区分大小写; -…

相关C语言易错点

四区 我们想来介绍一下内存四区 栈区 局部变量,局部常量 空间自动开辟和释放,只能作用于局部,函数不能返回局部变量的空间地址 堆区 malloc,realloc,free 手动开辟,手动释放,如果不手动释放,那么会在程…

Java学习手册——第一篇Java简介

今后Java学习手册就来给大家梳理JavaSE的基础知识啦, 除了这个专栏我们还有其他专栏:前端、安全、后端等。 希望大家可以在这里一起讨论学习哟~ Java学习手册——第一篇Java简介 1. Java基础知识2. Java能干嘛3. Java基础环境搭建 1. Java基础知识 出生…

彻底卸载Android Studio

永恒的爱是永远恪守最初的诺言。 在安装Android Studio会有很多问题导致无法正常运行,多次下载AS多次错误后了解到,删除以下四个文件才能彻底卸载Android Studio。 第一个文件:.gradle 路径:C:\Users\yao(这里yao是本…

Spring中Bean的循环依赖问题

1.什么是Bean的循环依赖? 简单来说就是在A类中,初始化A时需要用到B对象,而在B类中,初始化B时需要用到A对象,这种状况下在Spring中,如果A和B同时初始化,A,B同时都需要对方的资源&…