哈喽大家好~这里是不秃头
这是我的第一篇文章,想来想去还是写一下Redis。
为什么要写Redis呢?
因为在未来或更长的时间互联网的分布式应用必定会成为主流,互联网企业对微服务应用的高可用、高性能也有很高的要求。在这样的情况下,非关系型数据库起到举足轻重的作用,Redis作为非关系数据库的一种,Redis因具备优良的性能,在企业中广泛应用。
像是在我们公司,如果有大量的用户访问,就会对数据库造成严重的负荷,严重的话还会让数据库宕机。所以需要一个非关系性数据库用来存储用户的缓存,所以选择了Redis这种非关系数据库。
那有盆友就要问了,什么是关系数据库?什么是非关系数据库呢?
关系型数据库? 非关系型数据库?
关系数据库
关系型数据库模型来组织数据的数据库,它里面的数据是以表格模型进行存储的。每一个表格就有相对应的数据内容,一个表里具有行和列,行在数据库里被称为记录(也就是数据),列在数据库里被称为字段(也就是数据的名称)。表与表、数据与数据之间存在着关系,多个表就组成了一个关系型数据库。
非关系数据库
非关系型数据库又称为NoSQL,是对不同于传统的关系型数据库管理系统的一个统称,NoSQL数据库有很多种,但它们都有一个共同特征就是去掉关系型数据库的关系特征,数据之间毫无关系。
两者的区别
(1)存储方式,关系型数据库是使用表格方式进行存储的,把数据存储在表的行和列之中,这样就使得表格与表格之间容易关联并且存储方便。而NoSql数据库则相反,把数据大块大块的组合在一起,通常存储到一个集合中。
(2)存储结构,关系型数据库是先把数据结构预先定义好后再进行数据存储,这样会给表带来可靠性和稳定性(优点)但也会让修改这些数据会相较困难(缺点),NoSql则是动态结构,不需要预先定义好,可以很容易适应数据类型和结构变化。
(3)存储规范,关系型数据库为了更为精简的对空间进行利用,把每个数据分割成最小的关系表避免重复。则NoSql数据存储到一个平面的数据集中,数据可能会重复。单个数据库很少会被分开,它们是存储成了一个整体,这样更容易对整块数据的读写。
(4)存储扩展,关系型数据库是纵向的扩展,也就是说想要提高数据库的处理能力就要使用性能更好的计算机了。而NoSql是横向扩展的,它的存储从一开始就是分布式的,可以通过给更多的数据库来分担负载。
(5)性能,关系型数据库为了维护数据的一致性,导致读写性能比较差,在面对高并发时更是不堪。而NoSql则是存储在内存中的,这就让数据是非常容易存储的,也因为是在内存中读取数据,所以在读写性能上是优秀的。
讲完了为什么要写Redis之后就正式的来写哈,我也不知道我这个水平可以写出多少,就把目前自己学习和工作中积累的总结分享出来。欢迎各路大佬指正哈
高并发和“队列+缓存”
大家应该都知道Redis的核心是高并发和“队列+缓存”,这篇文章就主要来介绍这两者是什么哈。
什么是高并发
高并发通常是指一种系统在运行的过程中遇到的一种情况——短时间内遇到大量操作的请求,这种情况主要发生在Web系统中集中接受到大量的请求。例如:春假假期12306的抢票情况,天猫双十一活动。该情况的发生会导致系统会在这段时间内执行。如果高并发处理不好,不仅很影响用户的体验感受,还可能会使系统宕机,严重还会使系统停止工作等等。
高并发会带来的后果:
服务端:大量的高并发会让服务器的资源被占满导致崩溃,数据的存储和数据的更新结果出来是跟设计时的理想结果是不一样的。
在用户角度:这么卡,我是来参与活动的,刷新了多少次还是这样,太垃圾了,再也不来了。
什么是队列?
这里的队列指的是消息队列(Message Queue),那什么是消息队列呢?消息队列是一种应用程序之间的通信方式,消息发送后可以立刻返回消息,通过有消息系统来确认信息的可靠性传递。消息发布者的只管把消息发布到消息队列(Message Queue)中,不用管谁来取这个消息。消息的使用者只管从消息队列(Message Queue)中获取信息,也不用管消息是谁发布的,这样发布者和使用者都不知道对方的存在。
从上面的描述中我们可以知道消息队列是一个应用程序间的异步机制。以常见的用户注册为例子,在没有使用消息队列的时候,当用户注册时(这里以淘宝为例子),系统会给用户发送优惠券(新人优惠券让你买东西,俗称:拉新),再接着验证该用户的合法性(验证是不是黄牛党,羊毛党)当系统验证通过后,会发送电子邮件通知你验证所注册的用户,验证成功后再接着把注册信息存储到数据库中。这些逻辑流程是同步执行的,这样会很影响系统服务的性能。在这种场景下使用消息队列,在用户注册的主流程完成后发送一条消息到消息队列,让主流程快速的完结,再由另外的一条线程拉去消息队列的消息,这样像发送优惠券,验证账号的合法性,邮箱验证码的逻辑功能就可以通过消息队列来完成。
什么是缓存?
缓存就是数据交换的缓冲区,是存贮数据(使用频繁的数据)的临时地方。打个比方,当用户查询数据时,首先在缓存中查找,如果查找到了就直接执行。如果找不到,则去数据库中查找。 缓存的本质就是以服务器内存中的数据暂时代替从数据库读取的数据,主要目的就是提高性能,减少对数据库、服务器的压力。缓存也分本地缓存和分布式缓存。
分布式缓存?本地缓存?
分布式缓存
分布式缓存是指与应用程序分离的缓存组件或服务,拥有自身独立的内存空间,多个应用可以直接使用的共享缓存。通俗来点讲就是说有多个服务器端存储不一样的缓存,但他们之间的缓存又是共享的,这样的方式除了能存储大量的数据缓存之外,还能保证服务端的稳定性。常见的分布式缓存有:Redis、Memcached等。
其特点有:
(1)支持大数据量存储,不受应用进程重启的影响
(2)数据集中存储,保证数据的一致性
(3)数据读写分离,具有高性能,高可用
(4)数据跨网络传输,性能低于本地缓存
本地缓存
本地缓存是将数据保存在服务端的内存中,因此它的读取速度非常的快。但是本地缓存的数据是以服务端为单位进行分开存储的,因此就可能导致有一台服务端的数据有更新,而其他的服务端数据并没有更新,导致数据不一致的问题。常见的本地缓存:ehchche,guava cache,Caffeine
其特点有:
(1)访问速度快,但无法进行大量数据存储
(2)集群的数据更新问题
(3) 数据随应用进程的重启而丢失
使用的场景:
业务数据结合去高并发项目里⼀般都是有本地缓存和分布式缓存共同存在的,如果数据很少变更,而且数据量不大的话,占用的内存少,我们就使用本地缓存来进行存储。但如果数据量大的话,时长变更的数据,就可以使用分布式缓存。