redis 面试题
Redis 简介什么是 Redis【问题】 什么是 Redis? Redis 有什么功能和特性? 【解答】 什么是 Redis: Redis 是一个开源的“内存”数据库。由于,Redis 的读写操作都是在内存中完成,因此其读写速度非常快。 高性能 - 由于,Redis 的读写操作都是在内存中完成,因此性能极高。 高并发 - Redis 单机 QPS 能达到 10w+,将近是 Mysql 的 10 倍。 Redis 常被用于缓存,消息队列、分布式锁等场景。 Redis 的功能和特性: Redis 支持多种数据类型。如:String(字符串)、Hash(哈希)、 List (列表)、Set(集合)、Zset(有序集合)、Bitmaps(位图)、HyperLogLog(基数统计)、GEO(地理空间)、Stream(流)。 Redis 的读写采用“单线程”模型,因此,其操作天然就具有原子性。 Redis 支持两种持久化策略:RDB 和 AOF。 Redis 有多种高可用方案:主从复制模式、哨兵模式、集群模式。 Redis 支持很多丰富的特性,如:事务 、Lua 脚本、发...
jvm类加载
类加载机制 类是在运行期间动态加载的。 类的加载指的是将类的 .class 文件中的二进制数据读入到内存中,并转为可执行的代码的过程。 类的生命周期 Java 类的完整生命周期包括图片中这几个阶段: 加载、验证、准备、初始化和卸载这 5 个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班地开始。而解析过程在某些情况下可以在初始化阶段之后再开始,这是为了支持 Java 的动态绑定。 类加载过程是指加载、验证、准备、解析和初始化这 5 个阶段。 (一)加载加载流程: 通过类的全限定名获取定义此类的二进制字节流 将字节流所代表的静态存储结构转换为方法区的运行时数据结构 在内存中生成一个代表该类的java.lang.Class对象 加载来源: 本地文件系统: .class文件 网络下载: Applet 压缩包: JAR、WAR文件 运行时计算生成: 动态代理 其他文件生成: JSP (二)验证验证是链接阶段的第一步。验证的目标是确保 Class 文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。 验证阶段大致会完成 4 个阶段的检验动作: 文...
redis高级数据类型
BitMapBitmap,即位图,是一串连续的二进制数组(0 和 1),可以通过偏移量(offset)定位元素。由于 bit 是计算机中最小的单位,使用它进行储存将非常节省空间,特别适合一些数据量大且使用二值统计的场景。 参考 https://dunwu.github.io/
jvm字节码
字节码Java 字节码是Java虚拟机执行的一种指令格式。之所以被称之为字节码,是因为:Java 字节码文件(.class)是一种以 8 位字节为基础单位的二进制流文件,各个数据项严格按照顺序紧凑地排列在 .class 文件中,中间没有添加任何分隔符。整个 .class 文件本质上就是一张表。 Java 能做到 “一次编译,到处运行”,一是因为 JVM 针对各种操作系统、平台都进行了定制;二是因为无论在什么平台,都可以编译生成固定格式的Java 字节码文件(.class)。 字节码文件结构一个简单的 HelloWorld.java 1234567package cn.itcast.jvm.t5; // HelloWorld 示例public class HelloWorld { public static void main(String[] args) { System.out.println("hello world"); } } 执行 javac -parameters -d . HellowWorld.jav...
jvm垃圾回收
如何判断对象可以回收引用计数法给对象添加一个引用计数器,当对象增加一个引用时计数器加 1,引用失效时计数器减 1。引用计数为 0 的对象可被回收。 两个对象出现循环引用的情况下,此时引用计数器永远不为 0,导致无法对它们进行回收。 12345678910public class ReferenceCountingGC { public Object instance = null; public static void main(String[] args) { ReferenceCountingGC objectA = new ReferenceCountingGC(); ReferenceCountingGC objectB = new ReferenceCountingGC(); objectA.instance = objectB; objectB.instance = objectA; }} 因为循环引用的存在,所以 Java 虚拟机不适用引用计数算法。 ...
jvm简介与内存架构
简介 更多信息查看官网 JVM,全称是 Java Virtual Machine,Java运行环境(Java二进制字节码的运行环境) 优点: 是Java一次编写,到处运行的基石。 自动内存管理,垃圾回收功能 数组下标越界检查 多态 JVM有很多,常见的JVM有:HotSpot Opent JDK edition(平时使用的)、Eclipse OpenJ9等 内存架构程序计数器Program Counter Register,程序计数器(寄存器):作用是记住下一条jvm指令的执行地址,在物理上,是通过cpu中的寄存器来实现的。他是线程私有,且是唯一一个不会存在内存溢出的区域。 工作流程:java源码编译为二进制字节码,字节码中包含jvm指令,这些指令交给解释器->机器码->CPU执行。 1234567891011121314151617181920// 二进制字节码 java 源代码// 其中iconst_x 就是程序计数器0: getstatic #20 | PrintStr...
Spring Bean
Spring Bean在 Spring 中,构成应用程序主体由 Spring IoC 容器管理的对象称为 Bean。Bean 是由 Spring IoC 容器实例化、装配和管理的对象。 Bean 以及它们之间的依赖关系反映在容器使用的配置元数据中。 Spring Bean 定义BeanDefinitionSpring IoC 容器本身,并不能识别配置的元数据。为此,要将这些配置信息转为 Spring 能识别的格式——BeanDefinition 对象。 BeanDefinition 是 Spring 中定义 Bean 的配置元信息接口,它包含: Bean 类名 Bean 行为配置元素,如:作用域、自动绑定的模式、生命周期回调等 其他 Bean 引用,也可称为合作者(Collaborators)或依赖(Dependencies) 配置设置,如 Bean 属性(Properties) BeanDefinition 元信息BeanDefinition 元信息如下: 属性(Property) 说明 Class 全类名,必须是具体类,不能用抽象类或接口 Name Bea...
理解 Java 类加载器
深度理解 Java SPISPI 简介SPI 全称 Service Provider Interface,是 Java 提供的,旨在由第三方实现或扩展的 API,它是一种用于动态加载服务的机制。它的作用是让程序能够自动发现、加载和使用第三方提供的实现,从而实现基于接口的解耦和可插拔的扩展架构。 Java SPI 有四个要素: SPI 接口:为服务提供者实现类约定的接口或抽象类。 SPI 实现类:实际提供服务的实现类。 SPI 配置:Java SPI 机制约定的配置文件,提供查找服务实现类的逻辑。配置文件必须置于 META-INF/services 目录中,并且,文件名应与服务提供者接口的完全限定名保持一致。文件中的每一行都有一个实现服务类的详细信息,同样是服务提供者类的完全限定名称。 ServiceLoader:Java SPI 的核心类,用于加载 SPI 实现类。 ServiceLoader 中有各种实用方法来获取特定实现、迭代它们或重新加载服务。 SPI 示例 定义接口需要定义一个 SPI 接口,和普通接口并没有什么差别。 123public interface Dat...
Spring Framework 综述
Spring Framework 综述更多教程可以查看:官方教程文档 Spring Framework 简介Spring Framework 是最受欢迎的企业级 Java 应用程序开发框架。用于构建企业级应用的轻量级、一站式解决方案。 核心思想Spring 最核心的两个技术思想是:IoC 和 Aop IoCIoC 即 Inversion of Control ,意为控制反转。 Spring 最认同的技术是控制反转的 依赖注入(DI) 模式。控制反转(IoC)是一个通用的概念,它可以用许多不同的方式去表达,依赖注入仅仅是控制反转的一个具体的例子。 当编写一个复杂的 Java 应用程序时,应用程序类应该尽可能的独立于其他的 Java 类来增加这些类可重用可能性,当进行单元测试时,可以使它们独立于其他类进行测试。依赖注入(或者有时被称为配线)有助于将这些类粘合在一起,并且在同一时间让它们保持独立。 到底什么是依赖注入?让我们将这两个词分开来看一看。这里将依赖关系部分转化为两个类之间的关联。例如,类 A 依赖于类 B。现在,让我们看一看第二部分,注入。所有这一切都意味着类 B 将通过 I...
Java 编码和加密
Java 编码和加密Base64 编码Base64 原理Base64 内容传送编码是一种以任意 8 位字节序列组合的描述形式,这种形式不易被人直接识别。 Base64 是一种很常见的编码规范,其作用是将二进制序列转换为人类可读的 ASCII 字符序列,常用在需用通过文本协议(比如 HTTP 和 SMTP)来传输二进制数据的情况下。Base64 并不是加密解密算法,尽管我们有时也听到使用 Base64 来加密解密的说法,但这里所说的加密与解密实际是指编码(encode) 和 解码(decode)的过程,其变换是非常简单的,仅仅能够避免信息被直接识别。 Base64 算法主要是将给定的字符以字符编码(如 ASCII 码,UTF-8 码)对应的十进制数为基准,做编码操作: 将给定的字符串以字符为单位,转换为对应的字符编码。 将获得字符编码转换为二进制 对二进制码做分组转换,每 3 个字节为一组,转换为每 4 个 6 位二进制位一组(不足 6 位时低位补 0)。这是一个分组变化的过程,3 个 8 位二进制码和 4 个 6 位二进制码的长度都是 24 位(3*8 = 4*6 = 24)。...








