Redis-是什么?为什么快?为什么单线程?

参考:https://blog.csdn.net/weixin_42189604/article/details/82703997

Redis介绍

当今使用的数据库有两种:

  • 关系型数据库:RDB
    • 用于存储格式化的数据结构
    • Mysql,Oracle,SqlServer
  • 非关系型数据库:NoSql
    • 存储的数据都是按照键值对的结构进行存储,主要用于特定背景的专用数据库,向外提供特定的API,而不是提供通用的Sql接口,所以效率更高,(简单理解NoSql可以不写任何Sql语句就能实现数据的存储与查询)
    • redis?

Redis是一个开源的k-v数据库,属Nosql,为了保证效率,数据都是缓存在内存当中,并基于内存操作,性能较高,他支持多种类型的数据结构,

字符串 String

散列 Hash

列表 List

集合 Set

有序集合 Zset

范围查询

几个特性:

  1. redis会周期性的将更新的数据写入磁盘或者把修改的操作写入追加的记录文件,并在此基础上实现了主从同步.故:redis支持主从同步,数据可以从竹醋武器向任意数量的从服务器上同步,从服务器可以是关联其他服务器的主服务器.
  2. Redis提供了持久化的选项,这些选项可以让用户将自己的数据保存到磁盘上面进行存储.根据实际情况,可以每隔一段实践将数据集导出到磁盘(快照),或者追加到命令日志当中,也可以关闭持久化功能,将redis作为一个高效的网络的缓存数据功能使用.
    1. 这就是神奇的地方了:Redis支持持久化,即可以将数据持久存储在磁盘上;当关闭了持久化的功能,那么Redis就成为了高效的网络缓存.
  3. Redis不使用表:他的数据库不会预定义或者强制去要求用户对Redis存储的不同数据进行关联,毕竟是k-v数据库啊
数据库的工作模式按照存储方式可分为:
硬盘数据库和内存数据库
Redis将数据存储在内存里,读写数据的时候都不会受到硬盘I/O的限制,所以速度极快!!!
注意啊:当打开了可持久化的选项,数据会周期性的被保存在磁盘上,由这个还发展出来主从同步的的数据库
 

Redis为什么这么快?

一,先来看硬盘数据库的工作模式

(1)先从数据库读取数据到内存,

(2)内存中的数据再保存到硬盘

(3)更改硬盘的数据后再保存到数据库

步骤很多,读来读去(数据库-->内存--->硬盘)

二,内存数据库的工作模式

Redis作为缓存为什么这么快?

k-v数据库

C语言编写

数据存储在内存中(避免硬盘的i/O较慢的问题)

  1. 完全基于内存:
    1. 绝大部分请求是纯粹的内存操作,非常快
    2. 数据存储在内存中,类似于HashMap,而HashMap的又是就是查找和操作的时间都是O(1)
  2. 数据结构简单
    1. 对数据的操作也简单,Redis中的数据结构是专门进行设计的
  3. 采用了单线程,
    1. 避免了不必要的上下文切换和竞争条件,也不存在多进行或者多线程而导致的切换而消耗cpu,不去考虑各种锁,不加锁也不用释放锁,没有因为死锁而造成得到性能消耗.
  4. 使用多路I/O复用模型
    1. 非阻塞IO;
  5. 使用底层模型不同
    1. 他们之间底层实现方式以及客户端之间通信的应用协议不一样,Redis直接自己构建了VM机制,因为一般的系统调用函数的话,会浪费一定的时间去移动和请求
  • 多路I/O复用模型

多路复用模型是利用select poll epoll可以同时监察多个流的I/O事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。

  • 多路:多个网络连接
  • 复用:指同一个线程
    • 多路I/O复用技术:可以让单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗)
    • 且Redis在内存中操作数据的方式非常的快,也就是说内存内的操作不会成为影响Redis性能的瓶颈,
    • 所以Redis有了很高的吞吐量.

为什么要使用单线程?多线程不会更好吗?

上面已经说了,Redis已经很快了!

官方:因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈很可能是机器的内存大小或者网络带宽. (而这两个原因就是你用户的问题了,我后台单线程已经够快了,瓶颈在你那里而不是在我这里)

但是呢,我们使用单线程的方式是无法发挥cpu多核的性能的(毕竟线程是cpu调度和分派任务的基本单位)

我们可以通过在单个机器上开多个Redis来完善这一缺点.

还有一点:这里指的单线程是:在处理我们网络的请求的时候只有一个线程来处理,一个正式的Redis肯定是不止一个线程的(重点注意)

例如Redis进行持久化的时候会以子进程或者子线程的方式执行(这很明显就不是单线程了,所以要明确单线程指处理网络请求的单线程!(多路IO复用))

扩展:你应该直到的几种模型

  1. 单进程多线程模型:mysql,oracle(win版本)
  2. 多进程模型:Oracle(Linux)

 

猜你喜欢

转载自www.cnblogs.com/renshujia/p/12367697.html