后端开发刷题 | 面试篇4
Redis有哪些数据类型
- 字符串(Strings):字符串是 Redis 中最基本的数据类型,它可以包含任何类型的数据,如整数、浮点数、字符串等。Redis 的字符串是二进制安全的,这意味着你可以在其中存储任何类型的数据,如图片或序列化的对象。
- 列表(Lists):Redis 的列表是简单的字符串列表,按照插入顺序排序。你可以从列表的两端添加或删除元素。列表的一个常见用途是消息队列。
- 集合(Sets):Redis 的集合是一个无序的字符串集合,不允许有重复的成员。集合可以用于执行交集、并集、差集等集合操作。
- 有序集合(Sorted Sets):有序集合与集合类似,不同的是有序集合中的每个元素都会关联一个双精度浮点数分数。这使得有序集合可以通过分数来为集合中的成员进行从小到大的排序。有序集合非常适合用于实现排名功能。
- 哈希(Hashes):Redis 的哈希是键值对的集合。哈希类型非常适合存储对象,因为你可以在一个哈希表中存储对象的所有字段,而不需要为对象的每个字段创建独立的键。
- 位图(Bitmaps):位图不是 Redis 的一种独立数据类型,但它基于字符串类型实现,可以实现对大量开关状态的存储,非常节省空间。
- HyperLogLogs:HyperLogLogs 是 Redis 提供的一种概率性数据结构,用于估计一个集合中不重复元素的数量。与集合相比,HyperLogLogs 需要的空间非常小,但是只能提供估计值而非精确值。
- 地理空间索引(Geo):Redis 3.2 引入了地理空间索引功能,允许你存储地理位置信息,并基于这些信息执行地理空间查询,如获取两个位置之间的距离,或者查询给定半径内的所有位置。
- 流(Streams):Redis 5.0 引入了流(Streams)作为新的数据类型,用于消息队列。流是一个仅追加的、可持久化的日志,它支持消费者组(Consumer Groups)的概念,可以实现消息的发布/订阅模式。
说一说你对Spring AOP的理解
Spring AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中一个非常重要的核心组件,它提供了一种与OOP(面向对象编程)互补的编程范式。以下是对Spring AOP的详细理解:
一、定义与概述
- 定义:Spring AOP通过预编译方式和运行期间动态代理,实现程序功能的统一维护。它是一种编程思想,允许开发者在不修改源代码的情况下,为程序中的方法增加额外的功能(如日志、事务管理、安全控制等)。
- 与OOP的关系:AOP是OOP的一种补充,OOP通过纵向的继承关系实现代码重用,而AOP则通过横向抽取公共行为,实现了非业务逻辑的复用,减少了代码的冗余和耦合。
二、核心概念
- 连接点(JoinPoint):在Spring AOP中,连接点指的是类里面可以被增强的方法。这些点是进行AOP增强的潜在位置。
- 切入点(Pointcut):切入点是实际被增强的连接点集合。它定义了哪些连接点会被AOP框架拦截并进行增强处理。
- 通知(Advice):通知是实际增强的逻辑部分,包括前置通知(Before Advice)、后置通知(After Advice)、环绕通知(Around Advice)、异常通知(Throws Advice)和返回通知(After Returning Advice)等。
- 切面(Aspect):切面是横切关注点的模块化,一个切面可以包含多个通知和切入点定义。它定义了在哪些连接点上执行哪些通知。
三、实现原理
- 动态代理:Spring AOP主要基于动态代理技术实现。对于实现了接口的类,Spring默认使用JDK动态代理;对于没有实现接口的类,则使用CGLIB代理。动态代理会在运行时生成代理类,并在调用目标方法时执行增强的逻辑。
- AOP代理的创建:Spring容器在初始化时,会检查容器中的bean是否匹配了切面定义的切入点。如果匹配,Spring会为这些bean创建AOP代理。代理类会在调用目标方法前后执行相应的通知逻辑。
四、应用场景
- 日志记录:在不修改业务代码的情况下,为系统方法添加日志记录功能。
- 事务管理:通过AOP可以实现在不修改业务代码的情况下,为系统方法添加事务控制逻辑。
- 权限控制:对特定方法或接口进行权限校验,确保只有具备相应权限的用户才能访问。
- 异常处理:统一处理系统中的异常,避免在业务代码中编写大量的异常处理逻辑。
五、优点与缺点
- 优点:
- 提高代码复用性:通过横向抽取公共行为,减少了代码的冗余。
- 降低耦合度:将业务逻辑与非业务逻辑分离,使得系统更加清晰。
- 易于维护:在不影响业务逻辑的情况下,可以轻松地添加或修改非业务逻辑。
- 缺点:
- 过度使用AOP可能会使系统架构变得复杂,增加理解和维护的难度。
- 动态代理会带来一定的性能开销,虽然这种开销通常是可以接受的。
综上所述,Spring AOP是一种强大的编程范式,它通过动态代理技术实现了在不修改源代码的情况下为系统添加额外功能的能力。在适当的使用场景下,它可以显著提高代码的可维护性和复用性。
在Java中equals方法和==的区别
在Java中,
equals()
方法和==
运算符用于比较两个对象,但它们之间存在重要的区别:
==
运算符:
==
用于比较两个对象的引用(内存地址),而不是它们的实际内容。- 如果两个对象引用指向内存中的同一个位置,则
==
返回true
,否则返回false
。- 对于基本数据类型(如int、float等),
==
比较的是值。
equals()
方法:
equals()
方法用于比较两个对象的内容是否相等。Object
类中的equals()
方法默认行为是比较对象的引用,但很多类(如String
、Integer
等)都重写了equals()
方法,以便比较对象的内容。- 可以重写
equals()
方法,以定义特定类的“相等”逻辑。
Linux中查看CPU的信息
1.lscpu
lscpu
命令用于显示CPU架构的信息,如CPU的数量、核心、线程、名称、速度等。
2.cat /proc/cpuinfo
/proc/cpuinfo
文件包含了CPU的详细信息,包括每个CPU核心的速度、大小、缓存、支持的技术等。