什么是Redis
Redis主要适用于分布式系统,用来用缓存,存储数据,在内存中存储
那肯定也有人会好奇
内存那么大点地方,能存多少数据啊
这个就说到要点上来了,Redis的特性就是快,但是缺点也很明显他的存储量小,而我们的mysql,他的优点是什么呢?,存储量大,但是慢。
那么我们在生活中,往往会使用Redis和mysql结合去使用,为什么这么使用,因为我们生活中的“二八原则”,什么是二八原则呢?20%的数据,满足80%的需求
这么说就明白了,大部分人玩王者荣耀这游戏,都是用于去打排位,打匹配,获取段位信息这种,这就是20%,其他的80%是什么聊天记录,道具,亲密关系,老友回归这种。
那么这样还带来一个代价,就是系统的负责度就会大大提高,数据发生修改的时候,涉及到,Redis和MYSQL之间的数据同步问题。
那么为什么说是分布式呢?
因为,如果是单机程序,直接通过变量存储数据的方式是比Redis更优的选择。
因为进程具有隔离型,每个进程都是隔离开的,A无法访问进程的量
进程间通信:通过网络(Redis基于网络,可以把自己内存中的变量给别的进程,甚至别的主机的进程进行使用。
什么叫分布式
什么是单机架构
单机架构:只有一台服务器
硬件越来越牛掰。当然如果业务进一步要求提升,用户上升,此时就要分布式,引入更多硬件资源
一台主机的硬件资源有上限!,包括但是不限于
1.CPU
2.内存 服务器每收到一个请求,都是消耗上述的一些资源
3.硬盘
4.网络
如果同一时刻,请求多了,此时就可能导致某个硬件资源不够用,无论哪个方面出错了,都可能导致服务器处理请求的时间变长,甚至处理出错。
当然如果真遇到了服务器不够用的场景
1.开源 ->加更多硬件资源(一台机器扩张到极限了,软件商就要做出调整,不是粗暴的买机器,当然引入分布式,系统复杂度大大提高)
2.节流 ->软件上优化(需要通过性能测试,找到哪个环节出现瓶颈,再去对症下药
用户请求,会先到达负载均衡器/网关服务器(单独的一个服务器)
负载均衡器,看是承担了所有的请求啊,那他能扛住吗?
他就像是做核酸,组织排队不是费时的,扣嗓子才费时间,分配任务是不耗费时间的,应用服务器承担的具体业务,执行的时间会更长。
增加应用服务器,确实能处理更多请求,但是存储服务器的承担请求也变多了,
相信到了这里,你已经知道,为啥要用redis的原因了,我们在采用redis作为缓存,这也会有下一个问题,应用程序修改存储服务器的时候,缓存服务器能不能修改成功呢?
引入分布式系统:不仅要面对更高的并发量,还要有更大的数据量
我们针对数据库进行进一步拆分的同时,我们也可以对表进行拆分
这也就需要引入微服务
微服务架构
一个服务器程序上,做了很多业务,导致这个服务器代码变的复杂,为了方便代码的维护,就可以把这样一个复杂服务器,拆分成更多功能单一的服务器
微服务的本质
当服务器复杂了,势必就要更多人来维护,当人多了,就要配套的管理,把这里的这些人组织好(防止他们摸鱼),每个组分别配备领导进行管理
引入微服务:解决了人的问题,但是有代价:
1.系统性能下降(要想保证性能不下降太多,还是引入机器,拆下更多的服务,多个功能之间更依赖网络通信,虽然这样代价更好,但是现代科技的万兆网卡,也是非常牛逼的)
2.系统复杂度高,可用性收到影响,服务器多了,遇到的问题更多(这也需要更多的手段,保证系统可用性,更丰富的监控报警,配套的运维人员)
微服务的优势:
1.解决人的问题
2.使用微服务,可以更方便功能的复用
3.可以给不同的服务进行不同的部署
架构推进
应用(application)/系统(System):一个应用,就是一个组服务器程序
模块(Module)/组件(Component):一个应用,里面有多个功能,每个独立的功能,就可以称为一个模块/组件
可用性:系统整体可用的时间/总的时间
响应时长:衡量服务器性能->(越小越好)
吞吐(Throughput)VS并发(concurrent):衡量系统处理请求的能力,衡量性能的一种方式
Redis的特性
MYSQL主要通过表的方式来存储数据的"关系型数据库"
Redis主要是通过键值对方式来存储组织数据的"非关系型数据库"
快:
为什么Redis快
1.Redis数据在内存中就比访问硬盘的数据库要快很多,
2.Redis内部核心逻辑都很简单,数据结构,也是比较简单的操作内存的数据结构
3.从网络角度上,Redis采用了IO多路复用的方式(一个线程管理多个socket
4.Redis使用的单线程(虽然更高版本的Redis引入的多线程),这样的单线程,减少了不必要的竞争者(多线程提高效率的前提是,CPU密集型的任务,使用多个线程可以充分利用cpu多核资源)
5.使用c语言编写(不咋可信,因为mysql也是C编写的,没人问不说)
Redis核心任务:操作内存的数据结构,不吃很多cpu
什么时候用这个Redis
搜索引擎->广告搜索,把所有需要检索的数据都存在内存中,Redis存的是全量数据,这里的数据也不能随便丢。
Redis 可做缓存,数据库,消息队列。
这里的问题:由于负载均衡器随机分配应用服务器,把请求发送到一个应用服务器后,在这个服务器上产生会话,下次发送请求的时候,这个有可能分配到其他没有会话关系的数据。
解决:想办法让负载均衡,把同一个用户的请求始终打在同一个机器上(不是轮询,而是通过userId之类的方式来分配机器)