Redis的特性和应用场景

对于Redis,我们可以把它理解成一个在内存中存储数据的中间件,它可以用作数据库来存储数据,也可以用来当做数据缓存,在分布式系统中也起着重要的作用;

Redis 的特性

 1. 在内存中进行存储数据,并且是通过 键值对 的形式来存储组织数据的,属于 非关系型数据库;在键值对中,key可以是 string 类型,value 可以是所支持的一些数据结构;

2. Redis 的操作,可以直接通过简单的交互式命令来进行操作,也可以通过一些脚本的方式来批量进行一些操作; 

3. 在Redis中,可以在其原有的功能基础上,进行一些功能性的扩展,例如 Redis 本身支持一部分的数据结构和命令,通过扩张,可以支持更多的数据结构和命令;

这个就有点类似于window上的 dll 文件,可以让 exe 去调用里面的代码;(Linux 上是 .so 文件) 

4. Redis 具有持久化。Redis 是把数据存在内存上的,而内存的数据又是易失的,当系统重启或者进程退出,都会让内存中的数据丢失。所以 Redis 也会把数据存储在硬盘上,硬盘上的数据就相当于是对内存上的数据进行了备份,如果 Redis 进行了重启,就会在重启时,加载硬盘中的备份数据,使 Redis 恢复到重启前的状态;

5. Redis 支持集群。一个 Redis 能够存储的数据量是有限的,因此它可以像分布式系统中进行分库分表一样,来引入多个主机,部署多个 Redis 节点,每个节点存储数据的一部分; 

6. Redis 也支持 "主从" 结构,从节点就相当于是对主节点的一个备份; 

Redis 为何 "快" 

1. Redis 的数据是存储在内存中的,这就比访问硬盘的数据库要快得多了;

2. Redis 的核心功能都是比较简单的逻辑,涉及到比较简单的操作内存的数据结构;

3. 从网络的角度上来看,Redis 使用了 IO多路复用的方式,也就是使用一个线程,来监听管理多个 socket;

4. Redis 使用单线程模型,单线程模型减少了不必要的线程之间的竞争开销;

此处可以就会有疑问点:之前提出的多线程不就是为了解决单线程的低效率吗?那么此处的单线程为什么会提高效率呢?

原因是:多线程提高效率的前提是,当前的任务为 CPU密集型任务,引入多线程来充分利用 CPU 的多核资源,从而提高效率;而 Redis 的核心任务,就是操作内存中的数据结构,而不会吃很多的 CPU,所以如果引入多线程,反而会造成线程之间的资源竞争,反而降低效率;

Redis 的应用场景 

Redis 的应用场景一般分为三个方向:

1. 将 Redis 用为数据库;

在大多数情况下,使用数据库,考虑到的是容量要大,此时一般选用的就是 MySQL了,但也有一些场景的需求是快,这种就对性能的要求比较高,此时就可以考虑将数据量存储在类似于 Redis 这样的内存数据库中,从而来提高效率,但这种情况下,如果要存储大量的数据,是要在硬件设备上进行进一步的升级和充值的;

2. 将 Redis 用来缓存数据;

单纯的使用 MySQL 来存储数据,虽然容量大,但是效率不高,而单纯的使用 Redis 来存储数据,虽然效率高,但是容量小,那么就可以考虑将二者的优点进行结合。使用 MySQL 来存储全量数据,使用 Redis 来存储热点数据,并且当 Redis 中的热点数据丢失的时候,也可以再次从 MySQL 中进行同步;

3. 将 Redis 作为消息队列;

将 Redis 作为消息队列,就可以基于此实现一个生产者消费者模型。

除此之外,Redis 也可以用来存储会话。之前 session 是存储在应用服务器上的,而在引入了负载均衡器和多台应用服务器后, 可能会出现一种情况:客户端第一次进行访问的时候,负载均衡器将需求打到应用服务器1,此时应用服务器1 就存储着该客户端的会话,当客户端第二次进行访问的时候,负载均衡器可能会将需求打到别的应用服务器上,这就让存储在应用服务器1 的会话发挥不到该有的作用。

Redis的特性和应用场景_第1张图片

 那么对于此问题,就有两种方案:

1. 可以通过 cookie 来实现鉴别不同的应用服务器,让负载均衡器不再通过轮询的方式来进行需求分配,而是通过设定的 cookie 来打给指定的应用服务器;

2. 通过 Redis 的方式:把会话的数据单独取出,放在一台单独的 Redis 机器中进行存储,这样的话,负载均衡器就可以继续通过轮询的方式来进行需求分配,而每个请求在应用服务器中都可以通过 Redis 来校对会话;

Redis的特性和应用场景_第2张图片

你可能感兴趣的:(Redis,redis,数据库,缓存)