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

简单了解Redis(初识阶段)

1.认识Redis

对于Redis有一个很重要的点就是,它存储数据是在内存中存储的。

但是对于单机程序,直接通过变量存储数据的方式是更优的,在分布式系统下 Redis才能发挥威力

因为进程是有隔离性的,Redis可以基于网络,把进程自己的内存中的变量给别的进程,甚至是别的主机使用。这是Redis最核心的地方。

Redis可以用作数据库。它相比MySQL要快很多。因为Redis存储数据是内存级的。

但是内存存储快是快,但是劣势也很明显,那就是空间太小了。

往往都是Redis和MySQL结合起来使用。 在互联网上存在一个 二八原则,那就是 20%的热点数据(高频访问的数据),能满足80%的访问需求,那么就只要把这20%用Redis存储,全量数据用MySQL存储。此时Redis就是充当Cache的角色,不过这样就会使得系统的设计变得复杂,并且修改Redis中的数据时,还需考虑Redis和MySQL之间的同步问题。

2.浅谈分布式系统的演变过程

了解单机架构 

 即只有一台服务器,这个服务器负责所有的工作。

 虽然现在的硬件发展速度非常快,单机架构即便只有一台主机,但是这台主机的性能也是可以很高的,但是还是架不住用户量和数据量的水涨船高,单机的性能再高也是有上限的,

一台服务器的核心硬件资源:1.CPU 2.内存 3.硬盘 4.网络 。当然还有其他的。

 什么是分布式?

之前说了单机架构模式, 还有服务器的核心资源。当某一时刻,请求的数量太多了,就可能会导致服务器的某个硬件资源不够用了,无论是哪个方面不够用了,都会导致服务器处理请求的时间变长,甚至出错。

如果碰到这种情况,怎么处理呢?

1.开源:

简单粗暴,直接增加更多的硬件资源来解决性能问题。但是需要注意:一台主机能增加的硬件资源是有限的。比如CPU ,内存条,这些取决于主板的扩展能力。

当一台主机扩展到极限的时候,那么就只能引入多台主机了。而且不是说新的机器买来就可以直接解决问题,还需要在软件上做出对应的调整和适配。当引入了多台主机时,就可以把这个系统称为”分布式系统“了。

不过一般万不得已是不会引入分布式系统的,因为这会使得系统的复杂度大大提高。

2.节流:

节流就是从软件层面上去优化,需要通过性能测试找到性能瓶颈,再找出切实有效的优化方案。这个是比较难的。

数据库分离和负载均衡 

也就是应用服务和数据库服务分离

这里就已经是两个服务器了。 

此时还可以根据服务器业务的不同,针对性的给服务器配置硬件资源,以此达到更高的性价比。

如果一台应用服务器还是不够用的话,那么还可以引入更多的服务器结点:

 

此时用户访问就会先访问负载均衡器 / 网关(也是一个单独的服务器),然后负载均衡器再将请求进行分发。

另外,看似负载均衡器在这里承担了所有的请求,但是负载均衡器是分配任务的,所以它对于请求的承担能力是远超服务器的。就算请求量大到负载均衡也承担不了时,同样可以引入更多的硬件资源,也就是引入更多的负载均衡器(引入更多机房)。

数据库的读写分离

上面说到了应用服务和数据服务分离,这样降低了应用服务的压力,但是数据库服务的压力又上来了,因此为了降低数据库服务的压力又有两种解决办法:

开源和节流。其中节流门槛高,难度大,这里主要说开源。

 这里的核心思想就是读写分离。图中只画了两台服务器,实际上可能是多台。

在实际的应用场景中,读的频率是比写的频率高的,因此主服务器一般只有一个,从服务器有多个
并且从服务器也可以通过负载均衡的方式让应用服务器进行访问。

引入缓存 

数据库有一个天然的问题,因为它是读写硬盘访问的,所以速度是比较慢的。因此可以将数据进项冷热划分,将热数据放到缓存中,这样访问速度就能快很多了。

将热点数据存到缓存服务器中,数据库中存的依旧是完整的全量数据。 

而我们一直说的Redis就处于缓存服务器这个位置。 

数据库分库分表 

引入分布式系统,不光要应对更高的请求量(并发量),还要能够应对更大的数据量(比如短视频平台的数据量就很大)。当数据量多到一台服务器已经存不下的时候,就需要多台主机来存储。 

所以还可以针对数据库再进行水平拆分,这里也叫分库分表

比如本来一个数据库服务器上有多个数据库(指逻辑上的数据集合),现在就引入了多个数据库服务器,每个数据库服务器存储一个或者一部分数据库。 

图中展现的是分库,如果当某张表特别大的时候,也可以对表进行拆分,也就是分表。

引入微服务 

这里针对的就是应用服务器,当应用服务器里的功能太多太复杂了,就可以把它的功能进行拆分,本来是一个服务器,现在拆分了,就叫做微服务。

 

微服务本质上是解决 ”人“的问题。因为当一个应用服务功能越来越多,结构越来越复杂时,就需要更多的人来维护。

 那么就可以按照功能拆分成多组微服务,这样就有利于上述人员的结构组织的分配了。

虽然微服务解决了人的问题,但是它也是付出了代价的:

 

 

概念的补充 

应⽤(Application)/ 系统(System):

为了完成⼀整套服务的⼀个程序或者⼀组相互配合的程序群。

 模块(Module)/ 组件(Component):

 一个应用,里面有很多个功能,每一个独立的功能就可以称为一个模块 / 组件。

当应⽤较复杂时,为了分离职责,将其中具有清晰职责的、内聚性强的部分,抽象出概念,便于
理解。

分布式(Distributed)

系统中的多个模块被部署于不同服务器之上,即可以将该系统称为分布式系统。如 Web 服务器与
数据库分别⼯作在不同的服务器上,或者多台 Web 服务器被分别部署在不同服务器上。⽣活例⼦类⽐:为了更好的满⾜现实需要,⼀个在同⼀个办公场地的⼯作⼩组被分散到多个城市的不同⼯作场地中进⾏远程配合⼯作完成⽬标。跨主机之间的模块之间的通信基本要借助⽹络⽀撑完成。

引入多个主机 / 服务器,协同配合完成一系列的工作 (物理上的多主机)

集群(Cluster)

被部署于多台服务器上的、为了实现特定⽬标的⼀个/组特定的组件,整个整体被称为集群。⽐如
多个 MySQL ⼯作在不同服务器上,共同提供数据库服务⽬标,可以被称为⼀组数据库集群。
分布式 vs 集群。通常不⽤太严格区分两者的细微概念,细究的话,分布式强调的是物理形态,即
⼯作在不同服务器上并且通过⽹络通信配合完成任务;⽽集群更在意逻辑形态,即是否为了完成特定服务⽬标。

引入多个主机 / 服务器,协同配合完成一系列的工作 (逻辑上的多主机)

主(Master)/ 从(Slave) 

集群中,通常有⼀个程序需要承担更多的职责,被称为主;其他承担附属职责的被称为从。⽐如
MySQL 集群中,只有其中⼀台服务器上数据库允许进⾏数据的写⼊(增/删/改),其他数据库的数据修改全部要从这台数据库同步⽽来,则把那台数据库称为主库,其他数据库称为从库。

中间件(Middleware)  

⼀类提供不同应⽤程序⽤于相互通信的软件,即处于不同技术、⼯具和数据库之间的桥梁。⽣活
例⼦类⽐:⼀家饭店开始时,会每天去市场挑选买菜,但随着饭店业务量变⼤,成⽴⼀个采购部,由采购部专职于采买业务,称为厨房和菜市场之间的桥梁。

中间件一般是和业务无关的服务:

 1.数据库

2.缓存

3.消息队列(是生产者消费模型)

4...

评价指标(Metric):
1.可⽤性(Availability)
考察单位时间段内,系统可以正常提供服务的概率/期望。例如: 年化系统可⽤性 = 系统正常提供
服务时⻓ / ⼀年总时⻓。
平时我们常说的 4 个 9 即系统可以提供 99.99% 的可⽤性,5 个 9 是 99.999% 的可⽤性,以此类推。 我们平时只是⽤⾼可⽤(High Availability HA)这个⾮量化⽬标简要表达我们系统的追求。

响应时⻓(Response Time RT) 

指⽤⼾完成输⼊到系统给出⽤⼾反应的时⻓。 这个指标越小越好

吞吐(Throughput)vs 并发(Concurrent) 

吞吐考察单位时间段内,系统可以成功处理的请求的数量。并发指系统同⼀时刻⽀持的请求最⾼
量。例如⼀条辆⻋道⾼速公路,⼀分钟可以通过 20 辆⻋,则并发是 2,⼀分钟的吞吐量是 20。实践中,并发量往往⽆法直接获取,很多时候都是⽤极短的时间段(⽐如 1 秒)的吞吐量做代替。我们平时⽤⾼并发(Hight Concurrnet)这个⾮量化⽬标简要表达系统的追求。

通常用响应时长和吞吐&&并发来衡量服务器性能,但是它们衡量的角度是不一样的。 

分布式系统 小结:

 大致过程:

1.单机架构 ->

2.数据库和应用分离 ->

3.引入负载均衡  应用服务器 => 集群 ->

4.引入读写分离,数据库主从结构 ->

5.引入缓存,冷热数据分离 ->

6.引入分库分表,数据库能进一步扩展空间 ->

7.引入微服务,从业务上进一步拆分应用服务器

3.Rdies的一些特性介绍(优点) 

Redis特性介绍 

Redis是内存中存储数据的中间件,它作为数据库,作为数据缓存之所以能在分布式系统中大展拳脚是因为它的一些特性(优点)

1.数据在内存中存储的->速度快:

 2.基于键值对的数据结构服务器

⼏乎所有的编程语⾔都提供了类似字典的功能,例如 C++ ⾥的 map、Java ⾥的 map、Python ⾥
的 dict 等,类似于这种组织数据的⽅式叫做基于键值对的⽅式,与很多键值对数据库不同的是,
Redis 中的值不仅可以是字符串,⽽且还可以是具体的数据结构,这样不仅能便于在许多应⽤场景的开发,同时也能提⾼开发效率。Redis 的全程是 REmote Dictionary Server,它主要提供了 5 种数据结构:字符串(string)、哈希(hash)、列表(list)、集合(set)、有序集合(ordered set /zet),同时在字符串的基础之上演变出了位图(Bitmaps)和 HyperLogLog 两种神奇的 ”数据结构“,并且随着 LBS(Location Based Service,基于位置服务)的不断发展,Redis 3.2. 版本种加⼊有关 GEO(地理信息定位)的功能,总之在这些数据结构的帮助下,开发者可以开发出各种 “有意思” 的应⽤。

3.有丰富的功能,拓展性强大

除了 5 种数据结构,Redis 还提供了许多额外的功能:
提供了键过期功能,可以⽤来实现缓存。
提供了发布订阅功能,可以⽤来实现消息系统。
⽀持 Lua 脚本功能,可以利⽤ Lua 创造出新的 Redis 命令。
提供了简单的事务功能,能在⼀定程度上保证事务特性。
提供了流⽔线(Pipeline)功能,这样客⼾端能将⼀批命令⼀次性传到 Redis,减少了⽹络的开
销。

 比如我们可以自己用C++代码去拓展Redis的功能。

 4.简单稳定

其次,Redis 使⽤单线程模型,
这样不仅使得 Redis 服务端处理模型变得简单,⽽且也使得客⼾端开发变得简单。最后,Redis 不需要依赖于操作系统中的类库(例如 Memcache 需要依赖 libevent 这样的系统类库),Redis ⾃⼰实现了事件处理的相关功能。
但与简单相对的是 Redis 具备相当的稳定性,在⼤量使⽤过程中,很少出现因为 Redis ⾃⾝ BUG
⽽导致宕掉的情况。

 5.客户端语言多

C、C++、Java、PHP、Python、NodeJS 等。
6.持久化(Persistence)

通常看,将数据放在内存中是不安全的,⼀旦发⽣断电或者机器故障,重要的数据可能就会丢
失,因此 Redis 提供了两种持久化⽅式:RDB 和 AOF,即可以⽤两种策略将内存的数据保存到硬盘中。

 7.高可用性(High Availability)

假设主节点挂掉了,那么从结点可以立马顶上,不至于让整个服务直接宕机 。

Redis为什么快呢? 

 1.Redis数据在内存中,那就比访问硬盘的数据库要快很多。

2.Redis核心功能都是比较简单的逻辑

3.从网络角度上来说,Redis使用了IO多路复用

4.Redis使用的是单线程模型(虽然高版本Redis引入多线程,但是是对网络部分的),

这样减少了不必要的线程之间的竞争开销。

注意:多线程提高效率的前提是 CPU密集型的任务,并且能使多个线程可以充分利用CPU的多核资源。但是Redis的核心任务主要就是操作内存的数据结构。

5.Redis是用C语言开发的,所以快。不过需要注意,这里的快是指跟其他语言相比起来,用C语言快,而不能跟MySQL比,因为MySQL也是C语言开发的,而之所以会引入Redis就是因为MySQL慢。

4.Redis的应用场景 

1.作为数据库

虽然在大多数情况下,数据库存储优先考虑的是 “大”,但是还是有一些场景下考虑的是 “快”。因为Redis的最大特点就是快,所以Redis就可以满足 考虑 “快”的场景下的要求。不过此时Redis存储的就是全量数据了,此时的数据可不能丢失。

2.作为缓存 && 会话存储

作为缓存我们之前也谈到过,因为在互联网的数据访问遵循二八原则,所以我们可以把热数据放在 缓存也就是Redis中,全量数据依旧放在MySQL这样的数据库中。此时Redis的数据有丢失也不要紧,丢失了可以从MySQL中再加载回来。

那么会话存储又是什么呢?
我们之前学过Cookie,而Cookie是和session搭配使用的。

假设在一个分布式系统下

有一个用户发起了登录请求,这个请求经过负载均衡器转发到应用服务器上,然后应用服务器就会生成一个会话,并给用户返回了这个会话的id,保存了用户的登录信息,那么用户 下次就只要拿着合法的会话id就直接登录了。

那么此时又有一个问题:因为请求是要先经过负载均衡器的,而会话是形成在一个应用服务器上的,其他的应用服务器没有,那么当用户又发来一个请求时,它不一定会被转发到之前的那个服务器,就导致用户需要再登录一次,如果用户运气不好每个请求都要登录,那就有点反人类了。于是有两种解决方法:

1.想办法让负载均衡器把同一个用户的请求始终打到同一台机器上。

2.直接把会话数据单独拎出来,放到一组独立的机器上存储,也就是用Redis,所以这就是Redis 应用在会话存储上。

3.作为消息队列 

这里的消息队列不是Linux进程通信的消息队列。

那么Redis不能用于什么场景了,这已经显而易见了:
Redis不能用于大规模存储(太贵了)。 

5.Redis环境搭建

这里以Redis 5为例。 

Ubuntu下安装 

在root用户下执行

apt install redis

 一般下载好它会自己启动

可以查看一下

netstat -nltp | grep redis

关于redis的配置文件 ,在 /etc/redis 目录下:

cd /etc/redis

 

 vim打开后发现这里的bind绑定的是本地环回

这样只能本地客户端才能连接这个服务器,我们要将其修改成为  0.0.0.0  。 

还有这里的关于主机保护,为方便今后能跨主机访问,我们给yes 修改为 no

修改完之后,记得要重启服务器。

service redis-server restart

 执行

service redis-server status

可以查看服务的运行状态

在本机执行

redis-cli

 如果想验证是否联通了,可以输入ping,如果返回了一个 PONG 则说明联通了

使用 ctrl + d 来退出redis客户端

Redis客户端介绍 

首先我们要知道,Redis是一个 客户端-服务器结构的程序,这一点和MySQL是一样的。

Redis的客户端有多种形式:

1.自带命令行客户端。

另外 在这里登录时我们可以指明 ip地址和端口号进行登录。

2.图形化界面的客户端

不是很推荐,因为不稳定

 3.基于redis的api自行开发的客户端 (工作常见)

补充:

关于Redis的速度快,是相对于MySQL这样的关系型数据库的,如果直接和内存中的操作变量相比,就没有优势了,甚至更慢了。

举例:
一个单机系统,用hashmap存储了一些简单的数据,此时对于是否要引入Redis,是要结合实际应用场景的,这里举例引入后的优缺点:

缺点:

一:系统变得复杂。

二:hashmap是直接操作内存的,而Redis是要先通过网络,再操作内存的,速度反而会下降。

优点:

一:有了Redis后,数据可以单独存储,如果服务器重启了也不会影响到数据,持久化了。

二:未来如果要扩展成分布式系统,那么用Redis要更佳。

所以综上,对于是否要引入一个技术(Redis),不仅要想清楚能解决什么问题,还得想明白会引来什么新的问题。


http://www.kler.cn/a/320654.html

相关文章:

  • 【MySQL】MySQL数据库入门:构建你的数据基石
  • (一)- DRM架构
  • 无人机动力系统测试-实测数据与CFD模拟仿真数据关联对比分析
  • 基于大语言模型意图识别和实体提取功能;具体ZK数值例子:加密货币交易验证;
  • mindspore发布件
  • Springboot采用jasypt加密配置
  • 【STM32】 TCP/IP通信协议(1)
  • 【JavaWeb】二、HTML 入门
  • js-17-对数组、对象进行浅拷贝和深拷贝
  • 四款负载均衡工具Nginx、HAProxy、MetalLB、gobetween 比较
  • 【ARM 嵌入式 编译系列 2.8 -- GCC 编译优化参数 位置无关码】
  • Chat2VIS: Generating Data Visualizations via Natural Language
  • 【Android】BottomSheet基本用法总结(BottomSheetDialog,BottomSheetDialogFragment)
  • Unity中的GUIStyle错误:SerializedObject of SerializedProperty has been Disposed.
  • 隧道面稳定性分析MATLAB
  • 立志最细,在FreeRtos中数据传输方式及应用!!!
  • PostgreSQL 创建表,常规表、外部表、分区表区别讲解
  • 华为HarmonyOS灵活高效的消息推送服务(Push Kit) - 1 简介
  • 前端开发必备:实用Tool封装工具类方法大全
  • vscode【实用插件】Markdown Preview Enhanced 预览 .md 文件
  • 时尚与科技的融合,戴上更轻更悦耳的QCY C30耳夹耳机,随时享受好音乐
  • 计算机毕业设计 基于Python的荣誉证书管理系统 Django+Vue 前后端分离 附源码 讲解 文档
  • python自定义日志等级
  • 企业级-pdf预览-前后端
  • 免费开源的AI 智能网盘,图片和媒体管理工具 | 极空间部署『PicHome』
  • GUI编程18:文本框、密码框、文本域