目录
1.In-memory data structure
2.Programmability(可编程性)
3.Extensibility(可拓展性)
4.Persistence(持久化)
5.Clustering(集群)
6.High availability(高可用性)
7.快
以下纯属于个人学习见解,不是官方知识,仅供参考,有错误的地方欢迎评论区指出
Redis是一个在内存在存储数据的中间件(中间件:与实际业务无关的服务,如数据库,redis,消息队列等等)。Redis的作用主要有两方面,一方面是是作为数据库,另一方面是作为数据缓存。根据Redis的特性,使得它能够在分布式系统中大展拳脚。
1.In-memory data structure
在内存中,redis存储的数据就是存储在内存中,这也就是为什么redis比MySQL快的一个重要原因。MySQL数据库的数据组织形式是以“表”为基础的,每一个数据库都包含一张或者多张表,表与表之间是有关系的,所以MySQL也被称为“关系型数据库”。既然有关系型数据库,也就有非关系型数据库,redis就是其中的一种非关系型数据库,相同的还有MongoDB,NoSQL等等,redis中数据的存储形式也很简单,也就是键值对,key和value都是字符串,简单举个例子:比如我们要存储一个人的名字,在redis存的就可以是"name":"张三",后续只要去查找name,就可以找到对应的值,这就是redis的一个最重要也是最基础的功能;
2.Programmability(可编程性)
可编程性指的是针对redis的操作可以使用一些简单的交互式指令进行一下简单的操作,也可以使用脚本的形式,进行批量式的一些操作(可以带有是带有逻辑的),脚本主要是使用Lua语言;
3.Extensibility(可拓展性)
任何一个语言要强大,就一定要有拓展性。我们可以在redis原有的基础上进行拓展。而且Redis为了方便被拓展,自己提供了一组API,我们可以通过C,C++,Rust语言去对功能进行编写,让Redis在支持原有的数据结构和功能的基础,支持更多的数据结构和功能;
4.Persistence(持久化)
前面说到redis之所以比MySQL快是因为把数据存储在内存中,以此来提高获取数据的速度,但是如果主机断电了,程序结束了,redis重启了等等情况,导致内存中的数据被释放了,按道理说,内存数据一旦被释放就找不回来,为什么说redis是持久性的呢?原因是因为redis存储数据是不仅会把数据存储在内存中,更会备份一份放在硬盘中,只要出现以上的释放了内存的情况,等到redis重启的时候,就回去硬盘中读取备份的数据放在内存中,这么一来就做到了持久化;
5.Clustering(集群)
redis作为分布式系统的一个非常重要的中间件,能够支持集群也是非常重要的。任何存储的媒介都是存在空间上限的,读取飞快的redis也不例外,redis虽然快,但是空间。所以会引入多个主机,部署多个Redis节点,每个Redis存储数据的一部分,比如现在有数据要存储,三个Redis节点,每个Redis节点存储数据的1/3,这样Redis能存储的数据上限就提高了。
6.High availability(高可用性)
高可用就是两个字:冗余/备份;Redis自身也是支持“主从结构的”,从节点会备份主节点的所有数据,也就是主节点如果挂了,从节点就会瞬间顶上,这也就保证了Redis的高可用性;
7.快
这也是Redis最鲜明的特点,那Redis为什么快呢?
1.数据存储在内存中;
2.核心功能逻辑简单,就是查找键值对,没有像MySQL一样的那么多约束,要根据主键,范围等等查到数据,相比较MySQL就快了;
3.从网络的角度,采用IO多路复用的方式(epoll),简单来讲就是用一个线程同时管理多个socket,哪个socket有数据就去调用哪个socket;
4.Redis使用的单线程模型(虽然高版本的Redis引入了多线程,但是核心功能采用的任然是单线程),这里不禁就要问了,不是说多线程可以提高系统的处理速度吗?这么这里采用单线程反而是提高了Redis的速度呢?是因为单线程模型能够减少了不必要的线程之间的竞争开销,多线程能够提高速度的前提是处理的是CPU密集型的任务,能够充分的利用CPU多核的特性,但是由于Redis的核心功能逻辑很简单,不是很吃CPU一个线程就已经能够处理的很快了,即使使用的是多线程模型,也不能快多少,使用多线程就意味着就要加锁,一旦加锁就会阻塞,竞争,等待,所以要业务场景,业务决定技术,一味的使用复杂的技术,不见得能提高多大的速度,反而会带来不必要的麻烦,越简单越好。