Redis是内存数据库,如果不将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出,服务器中的数据库状态也会消失。所以Redis提供了持久化功能!

1、RDB(Redis DataBase)机制

  • RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。也是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb(配置文件的dbfilename中配置)。它恢复时是将快照文件直接读到内存里。

  • Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。

    Read more »

使用IntelliJ IDEA创建一个SpringBoot项目后,导入相关依赖

1
2
3
4
5
6
7
<!-- 注:SpringBoot在2.x版本之后将原本使用的Jedis替换成Lettuce,我这里使用的是2.2.5版本 -->
<!-- 使用Jedis:Jedis在实现上是直接连接的redis server,如果在多线程环境下是非线程安全的,这个时候只有使用连接池,为每个Jedis实例增加物理连接 -->
<!-- 使用Lettuce:是基于Netty的,连接实例(StatefulRedisConnection)可以在多个线程间并发访问,应为StatefulRedisConnection是线程安全的,所以一个连接实例(StatefulRedisConnection)就可以满足多线程环境下的并发访问 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
Read more »

1、redis概述

1、Bean的创建和管理

  • 创建bean的过程可简单总结为:先从单例池中获取bean,如果没有则创建并添加到单例池。

  • 与bean工厂有关的类的继承树如下:

Read more »

1、Netty概述

  • 原生NIO存在的问题

    • NIO的类库和API繁杂,使用麻烦:需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等。
    • 需要具备其他的额外技能:要熟悉Java多线程编程,因为NIO编程涉及到Reactor模式,你必须对多线程和网络编程非常熟悉,才能编写出高质量的NIO程序。
    • 开发工作量和难度都非常大:例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常流的处理等等。
    • JDK NIO的Bug:例如臭名昭著的Epoll Bug,它会导致Selector空轮询,最终导致CPU100%。直到 JDK1.7版本该问题仍旧存在,没有被根本解决。
Read more »

1、NIO介绍

  • Java NIO全称Java non-blocking IO,是指 JDK提供的新API。从JDK1.4开始,Java提供了一系列改进的输入/输出的新特性,被统称为NIO(即New IO),是同步非阻塞的。
  • NIO相关类都被放在java.nio包及子包下,并且对原java.io包中的很多类进行改写。
  • NIO有三大核心部分:Channel(通道)、Buffer(缓冲区)、Selector(选择器)
    Read more »

1、BIO介绍

  • Java BIO就是传统的Java I/O编程,其相关的类和接口在java.io。

  • BIO(BlockingI/O):同步阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,可以通过线程池机制改善(实现多个客户连接服务器)。

  • BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,程序简单易理解。

    Read more »

1、GC日志格式

1.1 GC分类

  • 针对HotSpot VM的实现,它里面的GC按照回收区域又分为两大种类型:一种是部分收集(Partial GC),一种是整堆收集(Full GC)。
    • 部分收集:不是完整收集整个Java堆的垃圾收集。其中又分为:
      • 新生代收集(Minor GC/Young GC):只是新生代(Eden\S0,S1)的垃圾收集。
      • 老年代收集(Major GC/Old GC):只是老年代的垃圾收集。
        • 目前,只有CMS GC会有单独收集老年代的行为。
        • 注意,很多时候MajorGC会和Full GC混淆使用,需要具体分辨是老年代回收还是整堆回收。
      • 混合收集(Mixed GC):收集整个新生代以及部分老年代的垃圾收集。
        • 目前,只有G1 GC会有这种行为。
    • 整堆收集(Full GC):收集整个java堆和方法区的垃圾收集。
      Read more »

1、JVM参数选项类型

1.1 标准参数选项

  • 特点

    • 以“-”开头。
    • 比较稳定,后续版本基本不会变化。
  • 可通过运行java -help查看所有标准参数选项。

    Read more »

1、内存泄漏的理解和分类

  • 内存泄漏:

    • 可达性分析算法来判断对象是否是不再使用的对象,本质都是判断一个对象是否还被引用。那么对于这种情况下,由于代码的实现不同就会出现很多种内存泄漏问题(让JVM误以为此对象还在引用中,无法回收,造成内存泄漏)。

    • 严格来说,只有对象不会再被程序用到了,但是GC又不能回收他们的情况,才叫内存泄漏。

    • 但实际情况很多时候一些不太好的实践(或疏忽)会导致对象的生命周期变得很长甚至导致OOM,也可以叫做宽泛意义上的“内存泄漏”

Read more »