Redis相关底层面试题
Redis相关底层面试题
一、介绍
Redis是一个开源的高性能键值对存储系统,具有快速、灵活和可扩展的特性。它是一个基于内存的数据结构存储系统,可以用作数据库、缓存和消息代理。Redis支持多种类型的数据结构,如字符串(strings),散列(hashes),列表(lists),集合(sets)等。
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。同时,Redis还支持数据的备份,即master-slave模式的数据备份。
Redis的应用场景非常广泛。虽然Redis是一个key-value的内存数据库,但在实际场景中,Redis经常被作为缓存来使用,如面对数据高并发的读写、海量数据的读写等。具体而言,分布式缓存Redis可用于以下场景:
页面缓存:Redis可将Web页面的内容片段,包括HTML,CSS和图片等静态数据,缓存到Redis实例,提高网站的访问性能。比如在电商类应用中,热销商品展示、秒杀推荐等数据面临高并发读的压力,分布式缓存Redis的高并发及灵活扩展,可轻松支持此类应用 。
消息队列:Redis可以作为消息代理, ...
关于JVM中的几大面试题
关于JVM中的几大面试题
一、介绍
本文介绍JVM中的几个面试题,十分有用
主要有几题
Java类的加载过程
双亲委派机制是什么
jvm内存模型
二、答疑
1)Java类的加载过程
简单来说,可以这样理解分类
类的加载
获取二进制文件,将.class文件加载至JVM中
类的连接,验证,准备,解析合称连接
分配空间
静态属性赋值(赋初始值,而不是我们给予的值,如int是0,包装类为null)
类的初始化,(是初始化,不是实例化)
静态属性赋值,这时候就是赋我们给予的值了
什么是符号引用,什么又是直接引用
可以这样进行理解,我们有一个A类和B类,A类中使用到了B类
在字节码中,会用一个符号代表这是B类,这就是符号引用
而在B类进行类加载后,JVM成功的加载了这个B类,使得堆内存中有对应的B.class的对象,同时方法区中有静态方法与属性。
这个时候,A类就会将之前的符号引用,改为直接引用,设置为上面堆内存的B.class对象,或者方法区中的静态方法与属性
类加载的时机
实例化类对象
调 ...
自定义枚举Validated校验注解
自定义枚举Validated校验注解
一、介绍
在以前的文章中,有解释使用过@Valid注解的使用
Valid注解使用及扩展 | 半月无霜 (banmoon.top)
Validated分组校验及扩展 | 半月无霜 (banmoon.top)
本篇分享一个自定义校验注解,可以配合枚举使用,对入参的有效值进行校验。
比如说一些状态值,入参必须要符合定义的状态值
二、代码
注解
123456789101112131415161718192021222324252627282930package com.banmoon.validator;import com.banmoon.business.enums.MyEnum;import javax.validation.Constraint;import javax.validation.Payload;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy; ...
kafka的架构及常见面试题
kafka的架构及常见面试题
一、介绍
Kafka是一种高吞吐量、持久性、分布式的发布订阅的消息队列系统。它最初由LinkedIn(领英)公司发布,使用Scala语言编写,与2010年12月份开源,成为Apache的顶级子项目 。
Kafka是一个多分区、多副本且基于zookeeper协调的分布式消息系统。也是一个分布式流式处理平台,它以高吞吐、可持久化、可水平扩展、支持流数据处理等多种特性而被广泛使用 。
二、架构
1)生产、消费
首先得了解这个,比较简单的一个集群图
生产者(Producer):生产消息,发送消息的服务
消费者(Comsumer):消费消息,处理消息的服务
2)每一个kafka实例中有什么
如上图,只画了其中一个,具体看看里面是什么
broker:一个kafka进程就是一个broker,也就可以这样理解,集群中每一台kafka服务就是broker
主题(topic):在发布订阅的模式下,我们需要对消息进行一个区分,同一个功能的消息,我们发往同一个主题下
分区(Partition):可以看到每一个主题topic下,有多个分区。消息会推送到这 ...
Java中关于线程池的几道面试题
Java中关于线程池的几道面试题
一、介绍
以前就讲过线程池的使用,本文中介绍深挖线程池中的几道面试题
Java线程池 | 半月无霜 (banmoon.top)
在上面可以找到
线程池的核心参数都有什么,代表什么含义?
线程池的拒绝策略有哪些?
二、线程池
1)任务添加流程
当一个线程池在添加一个任务时,它是怎么分配线程去执行这个任务的
12345678910111213141516171819202122232425262728293031323334353637383940414243public class ThreadPoolExecutor extends AbstractExecutorService { public void execute(Runnable command) { // 判断是否为空 if (command == null) throw new NullPointerException(); // 判断当前正在运行的线程数是否小于 ...
Java中锁的分类
Java中锁的分类
一、介绍
在Java中的锁可以分为以下这四类
可重入锁、不可重入锁
乐观锁、悲观锁
公平锁、非公平锁
互斥锁、共享锁
二、详解
1)可重入锁、不可重入锁
当一个线程持有一个锁后,又想再持有这个锁时,发生的情况。
可重入锁:允许再次持有,多少次都没问题。
不可重入锁:不允许再次持有,已经持有了锁后,再次去获取时,会造成死锁的情况。
没必要给自己增加负担,所以Java中的锁基本都是可重入锁
2)乐观锁、悲观锁
他们两之间的区别主要体现在访问资源时,要不要进行上锁
乐观锁:假定多个线程同时访问同一个资源时,并不会彼此产生干涉和冲突,因此在多线程并发时,每个线程都可以自由访问共享资源,只在更新时检查数据是否被其他线程修改。如果数据未被修改,乐观锁会直接进行更新。常见的乐观锁实现包括版本号机制和CAS机制。Java中的Atomic相关的类,底层正是使用的CAS。
悲观锁:每个线程在访问,都要先进行上锁,这样其他线程就无法访问。悲观锁适用于对数据更新操作比较频繁的场景。当锁被别人占用时,线程只能进入等待阻塞阶段了。在Java中,synch ...
关于Java中引用的面试题
关于Java中引用的面试题
一、介绍
在Java中,有以下四种类型的引用:强软弱虚
强引用(Strong Reference):最常见的引用类型,也是默认的引用类型。如果一个对象具有强引用,那么垃圾回收器就不会回收这个对象。
软引用(Soft Reference):如果一个对象具有软引用,那么当系统内存不足时,垃圾回收器会尝试回收该对象。软引用通常用于缓存中,以便在内存紧张时释放一些缓存。
弱引用(Weak Reference):如果一个对象具有弱引用,那么它的生命周期更短,它在任何时候都可能被垃圾回收器回收。弱引用通常用于外部引用内部对象时使用,以免内存泄漏。
虚引用(Phantom Reference):虚引用是所有引用类型中最弱的一种。如果一个对象具有虚引用,那么它就像没有被引用一样,随时会被垃圾回收器回收。虚引用主要用于跟踪对象被回收的状态。
上面属于Java的面试八股文,那么在面试之中,我们该如何进行理解输出呢?
二、引用
1)强引用(Strong Reference)
在日常开发中最为平常的引用,因为我们直接new出来的对象就属于强引用。
那么,如果一个 ...
红黑树详解
红黑树详解
一、介绍
作为一颗红黑树,它是一颗特殊的AVL树,也就是一颗特殊的平衡二叉树。
对于平衡二叉树而言,它的定义是,对于任何二叉树的任何一个节点,它的左子树和右子树的高度差不能大于1。
而为什么红黑树比较特殊,它除了满足平衡二叉树的特点之外,还有以下的几个特征
每一个节点都有一个状态,红色或者黑色
根节点是黑色
红黑树的叶子节点默认都是空引用的对象,默认都是黑色
==红色==节点的两个子节点都是黑色,也就是说**红色**节点不能相连
从任意节点,到叶子节点,其经过的路径上,黑色节点的个数都是一致的
AVL树是通过自旋转来完成的平衡
但是红黑树却不全是这样,它虽然有自旋,但主要是节点特性,加上任意节点到叶子节点经过的黑色节点数量来保证了树的子平衡。
出发点不同,则实现的方式完全不同
二、示例
首先,我们针对以上五个特性,先画一个红黑树
再次讲解一下特性
不是黑就是红,没什么好说的
根节点是黑的,也没什么好说的
叶子节点都是null节点,这我认为是模拟出来的节点,仅作为第5点平衡计算使用
红色节点的子节点一定是黑的,也就是说不能出现红红相 ...
Neo4j入门
Neo4j入门
一、介绍
Neo4j是一个开源的图形数据库管理系统,它基于Java语言开发。与传统的关系型数据库不同,Neo4j使用图形结构来存储和查询数据,这使得它在处理复杂关系时更加高效和灵活。
Neo4j的核心特性包括:
1. 图形结构:Neo4j的数据模型是基于图的,每个节点表示一个实体,每个边表示两个实体之间的关系。这种结构使得Neo4j非常适合处理复杂的关系问题,例如社交网络、推荐系统等。
2. 快速查询:由于Neo4j采用基于路径的查询方式,因此它的查询速度非常快。相比之下,传统的关系型数据库需要遍历整个表才能找到所需的数据,这会导致性能问题。
3. 灵活性:Neo4j支持动态模式,这意味着它可以轻松地适应不断变化的数据模式。此外,Neo4j还支持ACID事务,确保数据的一致性和可靠性。
4. 可扩展性:Neo4j可以通过添加更多的节点和边来扩展其数据模型,这使得它非常适合处理大规模数据集。此外,Neo4j还支持集群部署,以提高可扩展性和容错能力。
总之,Neo4j是一个功能强大、灵活、高效的图形数据库管理系统,适用于处理各种复杂的关系问题。
Neo4j的优点和缺 ...
Docker入门学习
Docker入门学习
一、介绍
Docker是一个开源的容器化平台,可以将应用程序及其依赖以容器的形式封装,使其可以在任何环境中运行。Docker可以改善开发流程、提高应用程序的可移植性、简化系统配置、更易于维护等等。
Docker的优点包括:
快速构建、部署和迭代
与多种编程语言和框架兼容
节省资源和成本
增强安全性
Docker的官网为 https://www.docker.com/
二、基础
1)安装
我是在centos7上安装的docker,提供一个安装思路,可以安装下面的步骤进行安装
123456789101112131415161718192021# 在终端中输入以下命令以确保yum软件包管理器是最新的:sudo yum update# 安装必要的依赖项:sudo yum install -y yum-utils device-mapper-persistent-data lvm2# 添加Docker存储库:sudo yum-config-manager --add-repo https://download.docker.com/linux/cento ...