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

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: SQL实践篇(三):什么是Redis

 

简介

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。如图:

image.png

Hash

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

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

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

image.png


或者可以连写成:

image.png

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

比如说hget user1 username

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

比如说hmget user1 usename age

image.png

字符串列表

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

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

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

image.png

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

获取某一片段的内容

image.png

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

image.png


字符串集合

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

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

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

image.png

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

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

image.png

获取集合内全部元素SISMEMBER key

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

image.png

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

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

image.png

image.png

有序字符串集合

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

 

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

 

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

 

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

 

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

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

 

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

image.png

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

 

假设链表有N个节点,每2个节点生成一个上层索引,则第一层索引的节点数为N/2,第二层则是第一层的一半,即N/4,依次类推,第h层的节点个数就是N / ( 2 h ) N/(2^h)N/(2

h

),因此整个跳表的高度就是l o g 2 ( N ) log_2(N)log

2

(N),跟二叉树一样了,所以查询的时间复杂度就是l o g ( N ) log(N)log(N)。

 

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

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

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

image.png

所以可以写成:

image.png

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

比如获取关羽的分数:

image.png

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

比如删除guanyu这个元素:

image.png

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

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

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

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

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

image.png

image.png

其他数据类型

除了以上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表的形式来存储所有元素和分数,同时使用跳表来维护元素的顺序。因此不同场景下的查询时间复杂度会有不同。

 

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
1月前
|
SQL 存储 数据库
SQL实践篇(二):为什么微信用SQLite存储聊天记录
SQL实践篇(二):为什么微信用SQLite存储聊天记录
66 1
|
1月前
|
存储 SQL Web App开发
SQL实践篇(一):使用WebSQL在H5中存储一个本地数据库
SQL实践篇(一):使用WebSQL在H5中存储一个本地数据库
47 2
|
4月前
|
SQL 关系型数据库 MySQL
MySQL中的校对集/大小写敏感/sql_mode实践
MySQL中的校对集/大小写敏感/sql_mode实践
71 0
|
8天前
|
SQL 自然语言处理 数据库
NL2SQL实践系列(2):2024最新模型实战效果(Chat2DB-GLM、书生·浦语2、InternLM2-SQL等)以及工业级案例教学
NL2SQL实践系列(2):2024最新模型实战效果(Chat2DB-GLM、书生·浦语2、InternLM2-SQL等)以及工业级案例教学
NL2SQL实践系列(2):2024最新模型实战效果(Chat2DB-GLM、书生·浦语2、InternLM2-SQL等)以及工业级案例教学
|
11天前
|
SQL 自然语言处理 测试技术
NL2SQL进阶系列(4):ConvAI、DIN-SQL等16个业界开源应用实践详解[Text2SQL]
NL2SQL进阶系列(4):ConvAI、DIN-SQL等16个业界开源应用实践详解[Text2SQL]
NL2SQL进阶系列(4):ConvAI、DIN-SQL等16个业界开源应用实践详解[Text2SQL]
|
15天前
|
SQL 人工智能 自然语言处理
NL2SQL进阶系列(2):DAIL-SQL、DB-GPT开源应用实践详解Text2SQL
NL2SQL进阶系列(2):DAIL-SQL、DB-GPT开源应用实践详解Text2SQL
NL2SQL进阶系列(2):DAIL-SQL、DB-GPT开源应用实践详解Text2SQL
|
15天前
|
SQL 监控 数据库
数据库管理与电脑监控软件:SQL代码优化与实践
本文探讨了如何优化数据库管理和使用电脑监控软件以提升效率。通过SQL代码优化,如使用索引和调整查询语句,能有效提高数据库性能。同时,合理设计数据库结构,如数据表划分和规范化,也能增强管理效率。此外,利用Python脚本自动化收集系统性能数据,并实时提交至网站,可实现对电脑监控的实时性和有效性。这些方法能提升信息系统稳定性和可靠性,满足用户需求。
52 0
|
3月前
|
SQL 关系型数据库 MySQL
04SQL注入原理与实践
【1月更文挑战第5天】给单位零基础小伙伴准备的网安入门教程,本教程是基于蚁景实验室搭建,基于自建虚拟机搭建需自行准备前置环境,04SQL注入原理与实践 ,请遵守网络安全法!请遵守网络安全法!请遵守网络安全法!请勿破坏公共网络网络安全!
|
3月前
|
SQL 监控 关系型数据库
解密SQL性能异常事件及阿里云数据库的性能调优实践
作为开发者想必都知道数据库是现代应用的核心组件之一,而且在当今互联网时代之下,SQL查询的性能直接影响系统的整体性能,它的性能对于系统的稳定性和响应速度至关重要。那么本文就来讨论一下SQL性能异常的排查和优化方法,包括我个人印象深刻的SQL性能异常事件,以及分享一下使用阿里云数据库产品/工具进行SQL性能调优的经验和心得体会。
85 1
解密SQL性能异常事件及阿里云数据库的性能调优实践
|
3月前
|
SQL 存储 监控
公司内部电脑监控软件的数据库管理:SQL代码实践
随着科技的飞速发展,公司内部电脑监控软件在保障信息安全和提高员工生产效率方面发挥着重要作用。本文将深入探讨监控软件的数据库管理,并通过SQL代码实践展示其操作和优化方法。
300 0

热门文章

最新文章