一、了解 Redis
Redis的初心其实是消息队列,但是我们一般不用它,因为业内有其他更好的
Redis 是一种基于键值对(key-value)的 NoSQL 数据库。与很多键值对数据库不同的是,Redis 中的 key 都是 string(字符串),值(value)可以是由 string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)、HyperLogLog、GEO(地理信息定位)等多种数据结构和算法组成。因此,Redis 可以满足很多的应用场景,而且 Redis 会将所`有数据都存放在内存中,所以它的读写性能非常惊人。
二、分布式系统
单机架构:只有一台服务器,负责所有的工作

随着业务的进一步增长,用户量的增加,我们就需要引入更多的主机
一台主机的硬件资源是有限的(cpu,硬盘,内存……),如果同一时刻处理的数据多了,就会导致硬盘资源不足,最终导致消息的等待时间增加

我们将应用端和数据库分为俩个服务器
随着业务增加一台服务器不足以处理那么多的消息就可以引入多台应用服务器,减少cpu,内存的压力

我们通过负载均很器进行分配请求消息,但负载均衡器真的可以抗住吗?是的,负载均衡器的抗受能力远超应用服务器,它只需要分配任务,而不用去完成任务
当负载均衡器也无法抗住的时候,我们就引入更多的负载均衡器
增加服务器,确实可以应付更多的请求消息,但是同时对数据库的压力也加大了。
我们可以引入多个存储数据库,一主多从


数据库有个特点:访问数据慢 ,所以我们就可以将一些常用的“热点”储存在一个缓存数据库,加快响应效率,这时候我们今天所要学的Redis就可以承担这些功能(“二八原则”的使用)

三、微服务架构

引入微服务架构的主要原因是:解决人的问题
之前的应用服务器,一个服务器中做了很多业务,这会导致服务器的代码越来越复杂,为了更好的维护服务器,我们将一个应用服务器分成更多功能简单,小的服务器

四、Redis特性
1、速度快
Redis的优势在于分布式系统中,如果是单机程序,直接变量存储内存反而更快
Redis可以基于网络把自己内存中的变量给别的进程,甚至主机
正常情况下,Redis 执行命令的速度非常快(相较于 MySQL 这样的关系型数据库)(速度的快慢都是相对的,,相比与直接在内存存储肯定是慢了很多,因为多了网络传输这一部分),官方给出的数字是读写性能可以达到 10 万 / 秒,当然这也取决于机器的性能,但这里先不讨论机器性能上的差异,只分析一下是什么造就了 Redis 如此之快,可以大概归纳为以下四点:
1.Redis 的所有数据都是存放在内存中的(通过一系列的数据结构(主要是键值对)进行存储),下表是谷歌公司 2009 年给出的各层级硬件执行速度,所以把数据放在内存中是 Redis 速度快的最主要原因

Redis这么快,还要MySQL干嘛?
Redis也可以做数据库使用,Redis虽然快,但是容量小。对于公司来说,如果都使用Redis有点耗费太大了,
如果讲Redis和MySQL一起使用的话,听起来似乎不错,但是实际上复杂程度又增加了,经费消耗又增加了
“二八原则”
我们计算机中也符合二八原则,20%的热点,80%的使用
所以我们
2.Redis 是用 C 语言实现的,一般来说 C 语言实现的程序 “距离” 操作系统更近,执行速度相对会更快。(网上绝大部分资料这么说,但我不是很赞同,因为 MySQL 也是 C 语言开发的)
3.Redis 使用了单线程,预防了多线程可能产生的竞争问题,减少了不必要的线程之间的竞争开销。Redis 在 6.0 版本引入了多线程机制,但主要也是在处理网络和 IO,不涉及到数据命令,即命令的执行仍然采用了单线程模式。(对比:多线程提高效率的前提:CPU 密集型的任务,使用多个线程可以充分利用 CPU 多核资源。但是 Redis 的核心任务是操作内存的数据结构,不会吃很多 CPU。如果此时选择多线程,多核资源也用不上,因为单个核心的处理速度已经很快了,不仅没有明显的提升,同时还要考虑线程安全、加锁(一旦竞争就会阻塞,阻塞又会涉及到什么时候唤醒)),此外Redis的核心任务一般都是短而快的,所以不需要多线程
4.作者对于 Redis 源代码可以说是精打细磨,曾经有人评价 Redis 是少有的集性能和优雅于一身的开源代码。
5.从网络的角度上,Redis 使用了 IO 多路复用的方式(epoll),也就是使用一个线程管理多个 socket。
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 还提供了许多额外的功能:
4、简单稳定
Redis 使用单线程模型,这样不仅使得 Redis 服务端处理模型变得简单,而且也使得客户端开发变得简单。
5.客户端语言多(扩展能力,Extensibility)
Redis 提供了简单的 TCP 通信协议,很多编程语言可以很方便地接入到 Redis,并且由于 Redis 受到社区和各大公司的广泛认可,所以支持 Redis 的客户端语言也非常多,几乎涵盖了主流的编程语言,例如:C、C++、Java、PHP、Python、NodeJS 等,后续我会对 Redis 的客户端使用做详细说明。
可以在 Redis 原有的功能基础上再进行扩展,Redis 提供了一组 API。通过 C,C++,Rust 这几个语言编写 Redis 扩展(本质上就是一个动态链接库),让 Redis 支持更多的数据结构,以及支持更多的命令。
6.持久化

7.集群
Redis 作为一个分布式系统的中间件,能够支持集群是非常关键的。
这个水平扩展类似于 “分库分表”。一个 Redis 能够存储的数据是有限的(内存空间有限)。如果想存储更多的数据,那就需要引入多个主机,部署多个 Redis 节点,每个 Redis 存储数据的一部分。
8.高可用(High Availability)
Redis 自身也是支持 “主从” 结构的,从节点就相当于主节点的备份。
Redis与Session的配合

除此之外,我们还可以
1.引入JWT令牌机制而不用session
2.每次存session时候,把每个session都存在各个服务器(消耗太大了)
网硕互联帮助中心






评论前必须登录!
注册