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)
引入多个主机 / 服务器,协同配合完成一系列的工作 (物理上的多主机)
集群(Cluster)
引入多个主机 / 服务器,协同配合完成一系列的工作 (逻辑上的多主机)
主(Master)/ 从(Slave)
中间件(Middleware)
中间件一般是和业务无关的服务:
1.数据库
2.缓存
3.消息队列(是生产者消费模型)
4...
响应时⻓(Response Time RT)
指⽤⼾完成输⼊到系统给出⽤⼾反应的时⻓。 这个指标越小越好
吞吐(Throughput)vs 并发(Concurrent)
通常用响应时长和吞吐&&并发来衡量服务器性能,但是它们衡量的角度是不一样的。
分布式系统 小结:
大致过程:
1.单机架构 ->
2.数据库和应用分离 ->
3.引入负载均衡 应用服务器 => 集群 ->
4.引入读写分离,数据库主从结构 ->
5.引入缓存,冷热数据分离 ->
6.引入分库分表,数据库能进一步扩展空间 ->
7.引入微服务,从业务上进一步拆分应用服务器
3.Rdies的一些特性介绍(优点)
Redis特性介绍
Redis是内存中存储数据的中间件,它作为数据库,作为数据缓存之所以能在分布式系统中大展拳脚是因为它的一些特性(优点)
1.数据在内存中存储的->速度快:
2.基于键值对的数据结构服务器
3.有丰富的功能,拓展性强大
比如我们可以自己用C++代码去拓展Redis的功能。
4.简单稳定
5.客户端语言多
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),不仅要想清楚能解决什么问题,还得想明白会引来什么新的问题。