SQL实践篇(三):什么是Redis

文章目录

  • 简介
  • Redis是什么,为什么这么快?
  • Redis的数据类型
    • 字符串
    • Hash
    • 字符串列表
    • 字符串集合
    • 有序字符串集合
    • 其他数据类型
  • 总结
  • 参考文献

简介

Redis是一种基于内存的键值数据库,键值数据库会使用哈希表存储key和value。其中key和value可以是任何内容,无论是简单对象还是复杂对象。

键值数据库是NoSQL思想,其规则是"只提供你想要的",因此模型很灵活,查询效率也高,成本也低。

而RDBMS是建立在关系模型的基础上,强调的是数据的一致性和各种约束条件,成本很高。

本节我们将从以下几个方面,简单了解下Redis:

  • Redis是什么,为什么它这么快?
  • Redis支持的数据类型都有哪些?

Redis是什么,为什么这么快?

Redis,全称是REmote Dictionary Server

Redis的查询效率非常高,根据官方的数据,Redis每秒最多处理的请求可以达到10w次。

为什么这么快呢?

Redis是采用ANSI C语言编写的,跟SQLite一样。这样的好处是底层代码执行效率更高,相比面向对象的语言,依赖性也更低。系统兼容性好,稳定性高。

另外,Redis是基于内存的数据库,没有磁盘IO的限制,自然快的飞起。

其次,数据结构简单,采用key-value的方式进行存储,也就是使用Hash结构进行操作,数据的操作复杂度为O(1)。

但是Redis快的原因远不止这些,还有很多各种各样的原因,比如说它采用单进程单线程的模型,避免了上下文切换和不必要的线程资源争抢问题。

在技术上,Redis还采用了多路IO复用技术。这里的多路指的是多个socket网络连接,复用指的是复用同一个线程。这样的好处是可以在同一个线程中处理多个IO请求,尽量减少网络IO的损耗。

可以看到,Redis可以说是把效率做到了极致,各方各面可能存在的时间消耗都被优化过。

2023-11-10 00:47:47 不过,在2020年新推出的Redis6.0版本里,还是引进了多线程模型,来提高Redis的性能和并发能力。不过Redis默认情况下不会开启多线程模式,官方建议是除非达到了性能瓶颈,否则没必要开启多线程。

Redis的数据类型

Memcached也是一个键值型数据库,但与它相比,Redis还有一个非常大的优势,就是支持多种数据类型。

Redis支持的数据类型包括字符串、哈希、列表、集合、有序集合等。

字符串

字符串类型是Redis提供的最基本的数据类型。对应的结构是key-value

如果我们想要设置某个键的值,可以使用set key value,如果想要获取某个值,那就用get key。如图:

在这里插入图片描述

Hash

哈希(hash)进一步提供了字段和字段值的映射,对应的结构是key-field-value。

设置某个键的哈希值hset key field value

比如说要给user1设置username为zhangfei,设置age为28,可以写成:

hset user1 username zhangfei
hset user1 age 28

或者可以连写成:

Hmset user1 username zhangfei age 28

取出某个键的某个field字段hget key field

比如说hget user1 username

一次性取出某个键的多个field字段hmget key field_1 field_2...

比如说hmget user1 usename age

在这里插入图片描述

字符串列表

字符串列表(list)的底层是一个双向链表结构,所以我们可以向链表的两头添加元素,时间复杂度都是O(1),同时我们也可以比较方便的获取列表中的某个片段。

向列表左侧添加元素LPUSH key value [...]

比如说我要在heroslist列表左侧添加zhagnfei、guanyu、liubei这三条数据,可以写成:

LPUSH heroList zhangfei guanyu liubei

向列表右侧添加元素RPUSH key value [...]

获取某一片段的内容

  • LRANGE key start stop

如获取herolist从0到4位置的数据,写成:LRANGE herolist 0 4即可。

在这里插入图片描述

字符串集合

字符串集合(set)是字符串类型的无序集合,与列表(list)的区别是集合内的元素是无序且不重复的。

在集合中添加元素SADD key member [....]

比如我想在heroSet集合添加zhangfei、guanyu、liubei、dianwei和lvbu这五个元素,可以写成:

SADD heroSet zhangfei guanyu liubei dianwei lvbu

在集合中删除元素SREM key member [....]

比如我们想在heroSet集合中删除liubei和lvbu两个元素,可以写成:

SREM heroSet liubei lvbu

获取集合内全部元素SISMEMBER key

比如我想获取heroSet集合中的所有元素,可以写成(可以理解成s is member):

SISMEMBER heroSet

判断集合内是否存在某个元素SISMEMBER key member

比如要判断集合中是否存在zhangfei和liubei,可以写成:

SISMEMBER heroSet zhangfei
SISMEMBER heroSet liubei

在这里插入图片描述

有序字符串集合

有序字符串集合(SortedSet,简称ZSET),可以理解成是集合的升级版,是内部有序的集合。

实际上,ZSET是在集合的基础上增加了一个分数属性,这个属性在添加和修改元素的时候可以被指定。每次指定后,ZSET都会按照分数来自动排序。

有序集合跟列表有一定程度上的相似性。比如这俩都是有序的,都可以获取某一范围内的数据,但是它们在数据结构上有很大的不同。

列表是通过双向链表的结构来实现的,因此在操作左右两侧的数据时比较快,但是越到中间的数据,操作的越慢,整体查询的时间复杂度是O(n)。

有序集合的实现结构比较复杂,它在内部是通过Hash表的形式来存储所有元素和分数,因此查找指定元素的分数时,时间复杂度是O(1),因为通过哈希值可以直接找到位置。

同时它还通过跳表(skiplist)来维护元素的顺序,类似二叉树或者二分查找,不管读哪部分的数据都会比较快,因此涉及到顺序的操作时,查询的时间复杂度是O(log(N))。同时有序集合可以通过score来灵活调整元素位置,但是列表就不行了,它调整比较麻烦。

什么是跳表呢?在参考文献4里扒了一张图,描述的很形象:

在这里插入图片描述

其实非常类似B+树结构。

假设链表有N个节点,每2个节点生成一个上层索引,则第一层索引的节点数为N/2,第二层则是第一层的一半,即N/4,依次类推,第h层的节点个数就是 N / ( 2 h ) N/(2^h) N/(2h),因此整个跳表的高度就是 l o g 2 ( N ) log_2(N) log2(N),跟二叉树一样了,所以查询的时间复杂度就是 l o g ( N ) log(N) log(N)

有兴趣了解跳表结构的话,可以看一下参考文献4,写的非常形象。

在有序列表中添加元素和分数ZADD key score member [...]

比如我们给heroScore集合添加下面5个英雄的hp_max数值作为score,如下表:

在这里插入图片描述

所以可以写成:

ZADD heroScore 8341 zhangfei 7107 guanyu 6900 liubei 7516 dianwei 7344 lvbu

获取某个元素的分数ZSCORE key member

比如获取关羽的分数:

ZSCORE heroScore guanyu

删除一个或多个元素ZREM key member [member...]

比如删除guanyu这个元素:

ZREM heroScore guanyu

获取某个范围内的元素列表

  • ZRANGE key start stop [WITHSCORES]:按分数从小到大排序,即ASC;
  • ZREVRANGE key start stop [WITHSCORES]:按分数从大到小排序,即DESC;

其中WITHSCORES是个可选项,加上的表示需要将分数一起显示出来。

比如说要查询heroScore这个有序集合中分数排名前3的英雄及数值,可以写成:

ZREVRANGE heroScore 0 2 WITHSCORES

在这里插入图片描述

其他数据类型

除了以上5种数据类型之外,Redis还支持位图(Bitmaps)数据结构。

在2.8版本之后,增加了基数统计(HyperLogLog)。

3.2版本之后,加入了地理空间(Geospatial)以及索引半径查询的功能。

5.0版本,引入了数据流(Streams)数据类型。

总结

了解Redis还是非常重要的。在实际的工作中,我们经常会将RDBMS和Redis配合使用,优势互补。

作为常见的 NoSQL 数据库,Redis 比Memcached 的优势要高很多:

  • Redis支持的数据类型比 Memcached 丰富得多,
  • 在 I/O 性能上,Redis 采用的是单线程 I/O 复用模型,而 Memcached 是多线程,可以利用多核优势。
  • 在持久化上,Redis 提供了两种持久化的模式(RDB和AOF),可以让数据永久保存,这是 Memcached 不具备的。

MongoDB里可以通过mmp调用来将数据映射到内存中。可以将mmp理解成是一种加速的手段。其将文件映射到调用进程的地址空间里,实现了文件所在的磁盘物理地址与进程空间的虚拟地址一一映射的关系,这样就可以直接在内存中进行操作,然后写完成之后同步一下就可以存放到文件中,效率非常高。有兴趣可以去了解一下。

另外,Redis中的有序集合比较特殊,它通过Hash表的形式来存储所有元素和分数,同时使用跳表来维护元素的顺序。因此不同场景下的查询时间复杂度会有不同。

参考文献

  1. 41丨初识Redis:Redis为什么会这么快?
  2. redis 6.0之多线程,深入解读
  3. Redis 6.0 之后为何引入了多线程?6.0 之前为什么不使用多线程?
  4. Redis数据结构之——跳表skiplist 对原理介绍的非常好,推荐

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【力扣】199.二叉树的右视图

看到这个题目的一瞬间,我想递归,必须用递归。最近被递归折磨的有点狠,但是我感觉我快要打败它了,就是现在稍稍有点处于劣势。不过没关系,来日方长不是。 法一:递归 题解: 之前想的就是先递归&…

python:改进型鳟海鞘算法(SSALEO)求解23个基本函数

一、改进型鳟海鞘算法SSALEO 改进型鳟海鞘算法(SSALEO)由Mohammed Qaraad等人于2022年提出。 参考文献:M. Qaraad, S. Amjad, N. K. Hussein, S. Mirjalili, N. B. Halima and M. A. Elhosseini, "Comparing SSALEO as a Scalable Larg…

50个免费的 AI 工具,提升工作效率(附网址)

上次我们已经介绍了20个精选的提高工作效率的免费AI工具,但如果你觉得这些AI工具还不过瘾的话,想进一步成为职场中最了解AI的人,本文将汇总介绍免费最新的50个AI工具。 DeepSwap DeepSwap 是一个基于 AI 的工具,适用于想要制作令人…

Kafka生产环境问题总结与性能优化实践

Kafka可视化管理工具kafka-manager 安装及基本使用可参考: httos://wwwcnbloas.com/dadonaaa/o/8205302.html 线上环境规划 1. 消息丢失情况: 消

【MATLAB库函数系列】线性调频Z(Chirp-Z,CZT)的MATLAB源码和C语言实现

在上一篇博客 【数字信号处理】线性调频Z(Chirp-Z,CZT)算法详解 已经详细介绍了CZT变换的应用背景和原理,先回顾一下: 回顾CZT算法 采用 FFT 算法可以很快计算出全部 N N N点 DFT 值,即Z变换 X ( z ) X(z) <

LaTex插入图片、插入表格、插入公式

目录 一、插入图片 1&#xff09;改变图片的大小、旋转图片 2&#xff09;标签和交叉引用 3&#xff09;插入单排多图无小标题共享大标题 4&#xff09;单排变多排 5&#xff09;图片的位置 6&#xff09;图片横跨双栏 二、插入表格 1&#xff09;合并单元格 2&#…

RHCE9学习指南 第9章 权限管理

9.1 所有者所属组 为了了解所有者和所属组的概念&#xff0c;我们先看图9-1。 图9-1 用房子来帮助理解所有者和所属组 张老板是公司老板&#xff0c;买了一套房作为员工宿舍给A部门的员工居住。张老板是房主&#xff0c;所以他对房子具有很多权限&#xff0c;A部门员工只能具…

【开源】基于JAVA语言的大学生相亲网站

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询会员4.2 查询相亲大会4.3 新增留言4.4 查询新闻4.5 新增新闻 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的大学生相亲网站&#xff0c;包含了会员管理模块、新闻管…

k8s实战之ELK日志管理

首先查看总体流程 首先创建namespace apiVersion: v1 kind: Namespace metadata:name: kube-logging 一、首先创建es.yaml --- apiVersion: v1 #kubernetes API版本,采用最新版本v1 kind: Service #资源类型定义为Service metadata: name: elasticsearch-logging # …

【JavaScript】FileReader读取文件成功,但存储的数据为空——总结

目录 问题解决 问题 如题&#xff0c;使用下列代码读取上传的文件&#xff1a; for (let i 0; i < files.length; i) {const reader new FileReader();const fileName files[i].name;reader.onload function(e) {file_datas[fileName] e.target.result;}// 根据需要…

SQL server 数据库面试题及答案(实操3)

一、编程题 公司部门表 department 字段名称 数据类型 约束等 字段描述 id int 主键&#xff0c;自增 部门ID name varchar(32) 非空&#xff0c;唯一 部门名称 description varchar(1024) …

第三十六周:文献阅读+注意力/自注意力机制

目录 摘要 Abstract 文献阅读&#xff1a;锂离子电池RUL预测的SA-LSTM 现有问题 提出方法 提出方法的结构 SA-LSTM预测模型的结构 研究实验 研究贡献 注意力机制 Self-Attention&#xff08;自注意力机制&#xff09; 注意力与自注意力 代码实现attention、self-at…

喜报频传!百望云获评“2023数字经济独角兽”称号

“数字经济独角兽”是在数字经济领域具备高成长性、高创新性和高潜力性的企业&#xff0c;他们不仅是数字经济的先锋&#xff0c;是科技创新型企业的典范&#xff0c;也是推动经济发展的新兴引擎。 12月20日&#xff0c;“2023数字经济独角兽大会”在北京大兴区成功举办。大会以…

介绍一个在线K8S练习平台

是不是有很多小伙伴想学习k8s&#xff0c;但是又没有机器去练习。使用自己的笔记本电脑或者主机只能搭建单机版本的k8s来练习。 现在福利来了&#xff0c;给大家介绍一个在线多节点k8s练习平台&#xff1a;Play with Kubernetes。 Play with Kubernetes 介绍 Play with Kube…

南邮最优化期末复习

黄金分割法 单纯形法&#xff08;大M法&#xff09; 求min, σ找最小&#xff0c;终止条件全部大于0 θ找最小&#xff0c;且不能为负数求max, σ找最大&#xff0c;终止条件全部小于0 θ找最小&#xff0c;且不能为负数 例题 二阶段单纯形法想 分支定界法&#xff08;第二章&…

等级保护的物理安全技术措施

目录 信息安全等级保护物理安全技术的控制点 物理位置的选择 物理访问控制 防盗窃和防破坏 防雷击 防火 防火和防潮 防静电 温湿度控制 电力供应 电磁防护 信息安全等级保护物理安全技术的控制点 物理位置的选择 物理访问控制 防盗窃和防破坏 防雷击 防火 防火和防…

【Materials Studio】 Materials Studio 2019 安装教程

【Materials Studio】 Materials Studio 2019 安装教程 软件介绍软件安装安装体验软件获取 软件介绍 Materials studio是一个完整的建模和仿真环境&#xff0c;旨在让材料科学和化学领域的研究人员能够预测和理解材料的原子和分子结构与其特性和行为之间的关系。使用Materials…

Redis数据结构(常用5+4种特殊数据类型)

1、Redis 数据类型以及使用场景分别是什么&#xff1f; Redis 提供了丰富的数据类型&#xff0c;常见的有五种数据类型&#xff1a;String&#xff08;字符串&#xff09;&#xff0c;Hash&#xff08;哈希&#xff09;&#xff0c;List&#xff08;列表&#xff09;&#xff…

【Vue3+TypeScript】快速上手_笔记

前言 1. Vue3简介 2020年9月18日&#xff0c;Vue.js发布版3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;n 经历了&#xff1a;4800次提交、40个RFC、600次PR、300贡献者 官方发版地址&#xff1a;Release v3.0.0 One Piece vuejs/core 截止2023年10月&#xf…

智能优化算法应用:基于孔雀算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于孔雀算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于孔雀算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.孔雀算法4.实验参数设定5.算法结果6.参考文献7.MA…