Redis学习(一)Redis的诞生和其IO多路复用的概念

Redis学习(一)Redis的诞生和其IO多路复用的概念

一个体面人的学习之旅

Redis的诞生

一项技术或者产品的诞生是为了解决一系列问题,本体面人学习任何技术之前都会问自己:它为什么会出现,它解决了什么问题?

创造者:antirez

诞生契机:话说antirez他创建了一个网站LLOOGG.com,该网站是记录访客浏览网站记录的。它会记录访客最新的5条,IP地址、所属的国家、阅览信息、访问网页地址传送给LLOOGG.com网站。

那么LLO网站就需要一个数据结构存储不同网站浏览记录的数据结构,当时它采用的是队列;大致如下图所示:

在这里插入图片描述

三个网站分别对应三个浏览记录队列,每个队列记录若干条最新的访客记录,可以是5-10000条,这些记录当时是存在mysql数据库的。保存最新的若干条最新记录就需要去操作数据库,每一次操作数据库就要进行磁盘的读写(数据是存在硬盘上),程序与硬盘的交互就需要I/O资源,而一台机器的I/O资源是有限的,起初少量网站和少量的用户没有问题的,但是随着互联网的井喷冲浪的人越来越多,所以会导致机器I/o资源耗尽,从而整个网站都没法运作了。

这时antirez就想到了一个办法,在不改变硬件的情况下利用C语音写了一个内存版本的数据库,这样网站的性能就不在受限与硬盘IO,这样数据都在内存中,我们读取和改变不需要走磁盘速度直接起飞!但是马上就有同学会想到,存在内存我软件进程关了数据那不是都没了嘛,antirez大佬肯定也想到到,所以他后来给redis加上了持久化功能,将数据持久到硬盘。

这就是整个Redis由来,了解她的过去,才容易掌握她。

现在的Redis是什么?

面试官最喜欢问的一个问题了?考你的是你对Redis特性的理解,以及它能干什么事情。

基本定义和用处:Redis是C语言开发的一个开源的(遵从BSD协议)高性能键值对(key-value)的内存数据库,可以用作数据库、缓存、消息中间件等。它是一种NoSQL(not-only sql,泛指非关系型数据库)的数据库。

特殊之处:Redis作为一个内存数据库。1、性能优秀,数据在内存中,读写速度非常快,支持并发10W QPS;2、单进程单线程,是线程安全的,采用IO多路复用机制;3、丰富的数据类型,支持字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等;4、支持数据持久化。可以将内存中数据保存在磁盘中,重启时加载;5、主从复制,哨兵,高可用;6、可以用作分布式锁;7、可以作为消息中间件使用,支持发布订阅。

这里介绍下不太容易理解的名词:

IO多路复用

首先还是一样,IO多路复用解决了什么问题。

我们先从阻塞IO说起,阻塞IO就是当你调用read时,如果你没收到你想读的数据,那么调用这个read操作的线程就会被挂起,直到收到数据。如果这样的话,当你发起1000个链接,而1000个链接会被1000个线程处理,但是1000个线程大部分都是读取不到数据的(因为cpu资源有限,不是每一个线程都能拿到时间片),那么大部分线程就被挂起了。这种方式有两种弊端:

  1. 线程的创建也是占用内存的(jdk1.5之后是1M,可以通过-xss来设置),1000个线程最大可能占用了1G(当然操作系统可能会有优化策略,还未深入研究)。
  2. 线程的切换,cpu切换线程时,需要把当前线程的信息记录下来,那么1000个线程就会记录1000次,这里说明一下为什么记录下来,因为线程发送IO请求数据之后,内核会去查看数据是否就绪(读磁盘的过程),如果没有就绪,IO阻塞,这时线程被挂起阻塞,但是这里会记录线程信息,当数据就绪之后,内核会根据保存的信息将数据拷贝的用户线程,并返回结果给用户线程,用户线程接触block状态。所以这个记录过程也是消耗CPU资源的。

这时候人们开发了非阻塞I/O;

非阻塞I/O它解决了上面的第二个问题,现在当线程获取不到数据的时候,内核会直接返回给你一个信号,而不是将线程挂起,这时候由于不会切换线程(因为我们需要轮询的执行read操作,直到获取数据),就省去了切换上下文的开销。人们在想能不能解决第一个问题, 那么IO多路复用模型出现了。

IO多路复用,比如当有1000个链接来read,我们只创建一个线程(这个线程会记录每一个链接想读取数据的fd),这个线程用来检查这1000个链接想读取的数据是否就绪,如果就绪我们可以在开一个线程处理,这样我们所需的线程数就大大减少了。

这篇文章主要介绍了Redis的由来,以及IO的一些概念,也是我在了解和学习Redis路上的经历。

未完待续

一个体面人的学习之旅。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值