Redis入门学习总结<一>

  • 一、Redis分布式缓存与本地缓存
  • 二、Redis的应用场景
  • 三、NIO
  • 四、Redis线程模型IO多路复用


今天小白学习总结的内容是Redis入门知识。

一、Redis分布式缓存与本地缓存

  • Redis: nosql数据库(非关系型数据库),完全开源免费的,是一个高性能的key-value数据库,市面上主流的数据库有Redis、Memcatche、Tair(淘宝自研发的);
  • Redis官网:https://redis.io/
  • 关系型数据库:mysql、sqlServer、oracle,数据存放在硬盘中,查询实现熊操作;
  • 非关系型数据库:Redis、Memcatche,数据存放在内存中;
  • Redis持久化机制,淘汰策略;
  • Jvm内置缓存框架:Cache
  • Reids分布式缓存,(Ehcache,Spring Cache)本地缓存
  • 本地缓存也叫单机缓存, 也就是说可以应用在单机环境下的缓存, 简单来说就是部署到一个服务器上, 所以本地缓存的特征是只适用于当前系统
  • 分布式缓存是指应用在分布式系统中的缓存, 所谓分布式系统是指将一套服务器部署道多台服务器上, 并且通过分载分发将用户的请求按照一定规则分发到不同的服务器上, 但是在众多的服务器上, 他们使用的缓存是同一个缓存, 也就是其中任何一台修改了缓存中的数据, 其他服务器也是可以感应知道的。Reids常用的分布式缓存。
  • Redis是当前最流行的数据库, 可以很大程度上提高互联网系统的性能,其具备一定的持久层功能, 可以当做一种缓存工具, 还可以当做简单的数据库。
  • 分布式缓存(Redis)如下图

二、Redis的应用场景

  1. TOKEN令牌的生成
  2. 短信验证码的code
  3. 可以实现缓存查询数据
    (1) 减轻数据库的访问压力
    (2)Redis与mysql数据不同步问题
  4. Redis帮助实现计数器
  5. 分布式锁
  6. 延迟操作
  7. 分布式消息中间件(很少用)

三、NIO

  • NIO主要有三大核心部分:Channel(通道),Buffer(缓冲区), Selector。
    传统IO基于字节流和字符流进行操作,而NIO基于Channel和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector(选择区)用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个线程可以监听多个数据通道。
  • NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。
    Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区。NIO的缓冲导向方法略有不同。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有您需要处理的数据。而且,需确保当更多的数据读入缓冲区时,不要覆盖缓冲区里尚未处理的数据。
  • IO的各种流是阻塞的。这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。 NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。而不是保持线程阻塞,所以直至数据变得可以读取之前,该线程可以继续做其他的事情。 非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。 线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出通道(channel)。
  • Channel:Channel和IO中的Stream(流)是差不多一个等级。只不过Stream是单向的,例如:InputStream, OutputStream;而Channel是双向的,既可以用来进行读操作,又可以用来进行写操作。
  • Buffer:NIO中的Buffer的实现有:ByteBuffer, CharBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer, ShortBuffer,分别对应基本数据类型: byte, char, double, float, int, long, short。
  • Selector:Selector运行单线程处理多个Channel,如果你的应用打开了多个通道,但每个连接的流量都很低,使用Selector就会很方便。例如在一个聊天服务器中。要使用Selector, 得向Selector注册Channel,然后调用它的select()方法。这个方法会一直阻塞到某个注册的通道有事件就绪。一旦这个方法返回,线程就可以处理这些事件,事件的例子有如新的连接进来、数据接收等。
  • 详细NIO了解请参考

四、Redis线程模型IO多路复用

  • Redis安装环境没有Windows版本,只有Linux版本;
  • Redis的底层采用Nio中的多路IO复用的机制,能够非常好的支持这样的比并发,从而保证线程安全问题;
  • Redis单线程,底层采用一个线程维护多个不同的客户端IO操作。但是Nio在不同操作系统上实现的方式有所不同,在Windows操作系统使用select实现轮询,时间复杂度是o(n),而且还存在空轮询去情况,效率非常低,其次默认的轮询数据有一定限制,所以支持上万的tcp连接是难。
  • 在Linux操作系统这种采用epoll实现时间驱动回调,不会存在空轮询的情况,只对活跃的socket连接实现主动回调,这样在性能上有大大的提升,所以时间复杂度为o(1)
  • Windows操作系统没有epoll,只有Linux才有epoll,nginx、redis能够很好的支持高并发,都是因为Linux中的IO多路复用机制epoll;
  • redis底层采用nio epoll实现。
  • redis采用nio的IO东路复用原则,也就是一个线程(单线程)维护多个不同的redis客户端连接,从而提高处理并发效率和保证线程安全问题。
    -:学到这里,相信你已经对redis有了初步的认识。