面试题30天打卡-day26

news2024/11/24 22:41:50

1、什么是 AOP?Spring AOP 和 AspectJ AOP 有什么区别?有哪些实现 AOP 的方式?

AOP(Aspect-Oriented Programming,面向切面编程)是一种编程思想,可以在不修改原有业务逻辑代码的情况下,动态地增加新的行为和功能。它通过将横切关注点(cross-cutting concerns)从业务逻辑中分离出来,以切面(aspect)的形式进行封装,实现了系统功能的模块化。

Spring AOP 和 AspectJ AOP 都是基于 AOP 思想的实现方式,其中 Spring AOP 是 Spring 框架提供的轻量级 AOP 框架,主要基于动态代理技术,可以对方法进行拦截和切入增强等操作。而 AspectJ AOP 则是基于 AspectJ 编译器独立的 AOP 框架,提供了更加强大的AOP能力,支持静态代理和动态代理两种方式,可以在编译期、类加载期、运行期等多个层面进行增强操作。

它们的主要区别在于:

  1. Spring AOP 只支持方法级别的切面,而 AspectJ AOP 支持更加细粒度的切面,包括方法、属性、构造函数等。
  2. Spring AOP 只支持运行时织入(runtime weaving),而 AspectJ AOP 支持编译时织入(compile-time weaving)和类加载时织入(load-time weaving),可以更加灵活地进行切面的织入。

除了 Spring AOP 和 AspectJ AOP,还有其他一些实现 AOP 的方式:

  1. 使用动态代理实现 AOP,这是一种比较轻量级的方式,可以实现对类的方法进行切面织入。
  2. 使用字节码增强技术实现 AOP,这种方式可以实现更加细粒度的切面织入,但相对比较复杂。
  3. 使用自定义类来实现AOP:主要是利用Java中的反射机制或者字节码工具,在运行时动态生成代理类实现AOP功能。
  4. 使用注解处理器实现 AOP,这是一种基于编译时的技术,可以通过注解来指定切面的织入点,比较灵活方便。

2、如何使用 Redis 实现分布式锁?

使用 Redis 实现分布式锁的核心思想是利用 Redis 的原子性操作,对Redis中特定的key进行setnx(set if not exists)操作,如果成功返回true表示获取到了锁,否则返回false表示没有获取到锁。在获取到锁的情况下,需要设置过期时间和在释放锁之前判断当前锁是否是自己持有的,以防出现死锁等问题。

具体实现步骤如下:

  1. 生成一个唯一的锁标识key,并设置锁的过期时间。
  2. 使用 setnx 命令尝试获取锁,如果返回结果为1,则表示获取锁成功,进入下一步;否则等待一段时间重试,直到获取到锁为止。
  3. 在持有锁的时间内,执行相关业务逻辑操作,并定时更新锁的过期时间,防止锁时间过长而导致锁自动失效。
  4. 释放锁,通过比较锁的持有者是否是自己来判断是否能够释放锁。

image-20230317103126255

public class RedisDistributedLock {
    
    private static final String LOCK_PREFIX = "redis_lock_";
    private static final int EXPIRE_TIME = 5; // 锁过期时间5秒
    
    private RedisTemplate<String, Object> redisTemplate;
    private String lockKey;
    private String lockValue;
	
	// 构造函数
    public RedisDistributedLock(RedisTemplate<String, Object> redisTemplate, String lockKey) {
        this.redisTemplate = redisTemplate;
        this.lockKey = LOCK_PREFIX + lockKey;
        this.lockValue = UUID.randomUUID().toString();
    }
    
    // 获取锁
    public boolean lock() {
        try {
            String result = redisTemplate.execute((RedisCallback<String>) connection -> {
                JedisCommands commands = (JedisCommands) connection.getNativeConnection();
                return commands.set(lockKey, lockValue, "NX", "EX", EXPIRE_TIME);
            });
            return StringUtils.isNotBlank(result);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    // 释放锁
    public boolean unlock() {
        try {
            String script = "if redis.call('get',KEYS[1]) == ARGV[1] then return redis.call('del',KEYS[1]) else return 0 end";
            Long result = redisTemplate.execute((RedisCallback<Long>) connection -> {
                JedisCommands commands = (JedisCommands) connection.getNativeConnection();
                return (Long) commands.eval(script, Collections.singletonList(lockKey), Collections.singletonList(lockValue));
            });
            return result != null && result > 0;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}

3、什么是分布式的 BASE 理论,它与 CAP 理论有什么联系?

分布式的BASE理论是建立在BASE理论(Basically Available, Soft State, Eventually Consistent)的基础上,针对分布式系统而提出的一种指导思想。它强调在分布式系统中,为了实现高可用性和可扩展性,有时需要牺牲一致性,通过异步复制、副本同步、冲突解决等方式来实现最终一致性。在这种情况下,系统的基本可用性和性能应该得到保障,并在最终一致性的前提下,尽量减少一致性等待时间。

区别:

CAP理论(Consistency, Availability, Partition Tolerance)是严格的理论限制。在分布式系统中,无法同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition Tolerance)三个条件,只能选择其中两个进行保障。由于在分布式系统中,节点之间可能会出现网络分区(Partition)导致通信中断,从而需要在可用性和一致性之间做出取舍。

  • Consistency:所有节点在同一时间看到相同的数据,即数据在多个节点间保持强一致性。
  • Availability:系统能够在有限时间内对外提供服务,即系统具有高可用性。
  • Partition Tolerance:系统能够在节点之间发生网络分区时继续工作,即系统具有分区容错性。

分布式的BASE理论认为,在分布式系统中,一致性不是绝对必须的,如果系统能够满足基本可用性和最终一致性,就可以放宽一致性要求,实现更高的性能和可扩展性。

两者的联系:

CAP理论和BASE理论都是面向分布式系统的理论,而且都关注系统的可用性。但它们关注的方面不同:

  • CAP理论关注分布式系统中数据的一致性和可用性,强调一致性和可用性之间需要进行取舍;
  • BASE理论关注分布式系统中数据的最终一致性和可用性,强调最终一致性和可用性之间的平衡。

场景:

  • 当需要保证强一致性和数据安全性时,可以采用CAP理论,例如金融交易系统、电商系统等;
    取舍;
  • BASE理论关注分布式系统中数据的最终一致性和可用性,强调最终一致性和可用性之间的平衡。

场景:

  • 当需要保证强一致性和数据安全性时,可以采用CAP理论,例如金融交易系统、电商系统等;
  • 当需要追求高性能和可扩展性时,可以采用BASE理论,例如社交网络、日志系统等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/518621.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

srs 直播连麦环境搭建

一、简介 二、修改conf/rtc.conf 三、两个客户端加入房间 四、合流 4.1分别拉流尝试 4.2合流推流 4.3拉取合流 一、简介 直播连麦是指在one2one或one2many进行音视频通话&#xff0c;此时把他们的音视频流合在一起&#xff0c;通过rtmp等协议推送给大量用户做直播。 因此首选需…

Java面试(3)基础语法

基础语法 1. 标识符和关键字的区别是什么&#xff1f; 在我们编写程序的时候&#xff0c;需要大量地为程序、类、变量、方法等取名字&#xff0c;于是就有了 标识符 。简单来说&#xff0c; 标识符就是一个名字 。 有一些标识符&#xff0c;Java 语言已经赋予了其特殊的含义…

python带你用最简单嘚词云图分析出最热话题

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 平常我们爬的评论、弹幕等等&#xff0c;数量又多又密&#xff0c;根本看不过来&#xff0c; 这时候数据分析的作用来了&#xff0c; 今天我们就试试用Python根据这些数据&#xff0c;来绘制词云图进行热词分析。 目录…

JUC-线程Callable使用与FutureTask源码阅读

JUC-线程Callable使用与FutureTask源码阅读 Callable简单使用 带返回值的线程(实现implements Callable<返回值类型>)&#xff0c;使用示例 import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Fut…

STC32G12K128单片机的 moubus-rtu 主机测试工程

简介 STC32G12K128 是STC 推出的一款32位的 C251 的单片机。最近拿到一块官方申请的 屠龙刀-STC32G开发板&#xff0c;就用它的提供的库函数&#xff0c;查考安富莱提供的 modbus 例程移植了一个 modbus-rtu 主站的工程。 modbus-rtu host 移植注意点 modbus-rtu 功能配置 …

MapReduce序列化【用户流量使用统计】

目录 什么是序列化和反序列化&#xff1f; 序列化 反序列化 为什么要序列化&#xff1f; 序列化的主要应用场景 MapReduce实现序列化 自定义bean对象实现Writable接口 1.实现Writable接口 2.无参构造 3.重写序列化方法 4.重写反序列化方法 5.顺序一致 6.重写toStri…

您应该查看的5个ChatGPT WordPress插件

要创建免费网站&#xff1f;从易服客建站平台免费开始 500M免费空间&#xff0c;可升级为20GB电子商务网站 您应该查看的5个ChatGPT WordPress插件 发布于 2023年4月1日 ChatGPT 席卷了数字世界。作为内容创建者或营销者&#xff0c;您可能希望通过在您的网站上使用ChatGPT…

JimuReport - 积木报表(一款免费Web报表工具)

一款免费的数据可视化报表&#xff0c;含报表和大屏设计&#xff0c;像搭建积木一样在线设计报表&#xff01;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; Web 版报表设计器&#xff0c;类似于excel操作风格&#xff0c;通过拖拽完成报表设计。…

扫雷【C语言】

用C语言实现一个9X9的扫雷 test.c 测试部分 game.c 游戏实现部分 game.h 游戏声明部分 菜单部分 游戏部分 游戏部分包括创建一个扫雷的区域&#xff0c;在其中埋雷&#xff0c;玩家进行扫雷&#xff0c;判断扫雷是否成功 这里我i们定义行列&#xff0c;便于以后将其…

2023.05.12-使用Transformers Agents来一键调用千万个AI模型

1. 简介 简单来说&#xff0c;就是以前想要实现某一个AI功能&#xff0c;需要自己去网上搜索对应的模型、下载对应的权重才能使用。现在可以把中间的这些个环节都砍了&#xff0c;我们只需要告诉模型我们想要对某段文字或者某张图片进行什么操作&#xff0c;transformer就会自…

【经验贴】项目风险管理的有效方法

你遇见过“最奇葩”的项目风险是什么&#xff1f; 中级项目经理小李&#xff1a;我比较幸运? 项目一开始发现客户的需求不太明确&#xff0c;就识别出可能会有范围无限蔓延的风险&#xff0c;制定了一系列的应对措施&#xff0c;不出所料出了问题&#xff0c;最终还是将风险遏…

springboot整合redis,MongoDB,Elasticsearch(ES)

目录 springboot整合redis 连接Redis 字符串操作 哈希表操作 列表操作 集合操作 有序集合操作 lettcus与jedis的区别 springboot整合MongoDB 新增数据 查询数据 更新数据 删除数据 springboot整合Elasticsearch&#xff08;ES&#xff09; 创建ElasticsearchRepo…

区间预测 | MATLAB实现QRCNN-BiLSTM卷积双向长短期记忆神经网络分位数回归时间序列区间预测

区间预测 | MATLAB实现QRCNN-BiLSTM卷积双向长短期记忆神经网络分位数回归时间序列区间预测 目录 区间预测 | MATLAB实现QRCNN-BiLSTM卷积双向长短期记忆神经网络分位数回归时间序列区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 1.Matlab实现基于QRCNN…

Redis数据热迁移

1、redis数据热迁移&#xff0c;先通过redis-shake工具实现。 2、再通过redis-full-check检查迁移后的数据是否想同。 3、redis-shake版本下载&#xff1a; https://github.com/tair-opensource/RedisShake/releases 4、redis-full-check版本下载&#xff1a; https://github.c…

更简单的存和取bean

注解&#xff08;更简单存bean和取bean&#xff09;更简单的存bean&#xff08;使用类注解&#xff09;方法注解更简单的获取bean 注解&#xff08;更简单存bean和取bean&#xff09; 注解&#xff1a;声明和表示这个类或方法有某个能力。servlet的Web注解&#xff1b;实现路由…

2000多套微信小程序源码-史上最全的不同行业的源码集合

前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 很多伙伴学习小程序不知怎么开始&#xff0c;我准备了2000多套小程序源码&#xff0c;基本覆盖各个行业&#xff0c;大家有需要的可以借鉴学习~ 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面…

“数字人交互,与虚拟的自己互动”——用PaddleAvatar打造数字分身,探索人机交互的未来

“数字人交互&#xff0c;与虚拟的自己互动”——用PaddleAvatar打造数字分身&#xff0c;探索人机交互的未来 你是否曾经幻想过与自己的虚拟人交互&#xff1f;现在&#xff0c;使用PaddleAvatar&#xff0c;您可以将自己的图像、音频和视频转化为一个逼真的数字人视频&#…

Spring Cloud Alibaba--Nacos集群配置

文章目录 一、Nacos持久化配置二、Nacos集群配置三、避坑指南集群端口号冲突问题内存不足&#xff0c;无法启动的问题 一、Nacos持久化配置 Nacos默认自带的是嵌入式数据库derby&#xff0c;Nacos采用了集中式存储的方式来支持集群化部署&#xff0c;目前只支持MySQL的存储。 …

Goby 漏洞更新 |secnet-智能路由系统 actpt_5g.data 信息泄露

漏洞名称&#xff1a;secnet-智能路由系统 actpt_5g.data 信息泄露 English Name&#xff1a;secnet Intelligent Router actpt_5g.data Infoleakage CVSS core: 7.5 影响资产数&#xff1a;71768 漏洞描述&#xff1a; secnet安网智能AC管理系统是广州安网通信技术有限公…

mysql错误:2059 - Authentication plugin ‘caching_ sha2_password‘ cannot be loaded:

这个错误是因为MySQL数据库使用了 caching_sha2_password 插件进行身份验证&#xff0c;而该插件需要 MySQL 8.0.4 及以上版本的 MySQL 客户端才能够使用。 如果你使用的是旧版本的 MySQL 客户端&#xff0c;可以考虑升级到 MySQL 8.0.4 或更高版本。如果升级不是一个可行的选…