Spring AOP原理
一、定义AOP(Aspect Oriented Programming),即面向切面编程,是OOP(面向对象编程)的一种延续,二者互补。AOP的目的是将横切关注点(如日志记录、事务管理、权限控制、接口限流等)从核心业务中分离出来形成一个个切面(Aspect),通过动态管理、字节码操作等技术实现代码的复用和解耦,提高代码的可维护性和可扩展性。 二、关键术语 横切关注点(cross-cutting...
LeetCode刷题笔记(九): 位运算
常用技巧(其中0s和1s分别表示只由0或1构成的二进制数字。):123x ^ 0s = x x & 0s = 0 x | 0s = xx ^ 1s = ~x x & 1s = x x | 1s = 1sx ^ x = 0 x & x = x x | x = x 除此之外,n&(n-1)可以去除n的位级表示中最低的那一位,例如对于二进制表示11110100,减去1得到11110011,这两个数按位与得到11110000。n&(-n)可以得到n的位级表示中最低的那一位,例如对于二进制表示11110100,取负得到00001100,这两个数按位与得到00000100。 一、位运算基础问题 题目一:汉明距离给定两个十进制数字,求它们二进制表示的汉明距离(Hamming distance,即不同位的个数)。 解答: 12345678910111213class Solution {public: int hammingDistance(int x, int y)...
Google的三架马车: GFS, MapReduce, BigTable
一、GFS(Google File System)1.1 GFS简述GFS是Google在2003年前后创建的可扩展分布式文件系统,用来满足Google不断扩展的数据处理需求。为大型网络和连接的节点提供容错、可靠性、可扩展性、可用性和性能。GFS由多个由低成本商品硬件组件构建的存储系统组成(使用了集群的概念,联合了多个硬件),它经过优化以适应Google的不同数据使用和存储需求,例如其搜索引擎会生成大量必须存储的数据。 1.2 GFS的特点 由许多经常出现问题的廉价硬件构建而成。但是能不断地监控自己,并在常规的基础上及时发现、容忍和恢复组件故障。 存储着非常多的大文件,对大文件进行了管理优化。 对大文件顺序流式读写操作进行了优化以及对小文件随机读取进行了批处理和排序等优化。 任何一个客户端都可以访问到存储在不同硬件上的某个文件,支持对文件的并行处理(同时读,同时写,边读边写),因此原子性操作以及允许把一个大文件切片存在不同的硬件上也是必不可少的。 高持续带宽比低延迟更重要。因为目标应用大多偏重于处理大批量、高速率的数据,而很少有针对单个读或写的严格响应时间要求。 1.3...
LeetCode刷题笔记(八): 分治
算法解释:顾名思义,分治问题由“分”(divide)和“治”(conquer)两部分组成,通过把原问题分为子问题,再将子问题进行处理合并,从而实现对原问题的求解。我们在排序章节展示的归并排序就是典型的分治问题,其中“分”即为把大数组平均分成两个小数组,通过递归实现,最终我们会得到多个长度为1的子数组;“治”即为把已经排好序的两个小数组合成为一个排好序的大数组从长度为 1 的子数组开始,最终合成一个大数组。 自上而下的分治可以和 memoization 结合,避免重复遍历相同的子问题。如果方便推导,也可以换用自下而上的动态规划方法求解。 一、表达式问题 题目:为运算表达式设计优先级给定一个只包含加、减和乘法的数学表达式,求通过加括号可以得到多少种不同的结果。 解答: 1234567891011121314151617181920212223242526272829303132class Solution {public: vector<int> diffWaysToCompute(string expression) { ...
LeetCode刷题笔记(七): 数学问题
一、最大公约数和最小公倍数这个没什么好说的,辗转相除法: 1234567int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }int lcm(int a, int b) { return a * b / gcd(a, b); } 也可以通过扩展欧几里得算法(extended gcd)在求得a和b最大公因数的同时,也得到它们的系数x和y,从而使ax+by=gcd(a, b),也就是贝祖等式。 12345678910int xGCD(int a, int b, int &x, int &y) { if (b == 0) { x = 1, y = 0; return a; } int x_inner, y_inner; int gcd = xGCD(b, a % b, x_inner, y_inner); x = y_inner, y =...
Java代理模式: JDK代理与CGLIB代理
一、JDK动态代理1.1 介绍JDK动态代理机制的核心是InvocationHandler接口和Proxy类。Proxy类主要是用来生成一个代理对象,使用的是newProxyInstance()方法: 123456public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException { ...
LeetCode刷题笔记(六): 动态规划
算法介绍:动态规划(Dynamic Programming,...
SpringBoot注解:Component与Configure
@Component和@Configure都是在SpringBoot中用于配置的常见注解,一个多用于自动化配置,另一个多用于第三方库的Config配置。 一、注解定义两者定义分别如下: 1234567891011121314151617181920212223242526272829// @Component的定义@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Indexedpublic @interface Component { /** * The value may indicate a suggestion for a logical component name, * to be turned into a Spring bean in case of an autodetected component. * @return the suggested component name, if any (or empty String...
利用bucket4j+redis实现统一限流机制
写在前面:暑期课云原生(云原神)期末大作业的bonus部分需要实现统一限流机制,组长大懒狗不想做交给我完成这个部分,期间踩了很多坑,故有了这篇文章。 一、导入依赖包:在pom.xml里导入以下依赖包,主要用了bucket4j: 1234567891011121314151617<dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> <version>3.17.0</version></dependency> <dependency> <groupId>com.github.vladimir-bukhtoyarov</groupId> <artifactId>bucket4j-core</artifactId> ...
LeetCode刷题笔记(五): 搜索
搜索算法主要包括深度优先搜索和广度优先搜索。 一、深度优先搜索 算法介绍:深度优先搜索(depth-first search,DFS)在搜索到一个新的节点时,立即对该新节点进行遍历;因此遍历需要用先入后出的栈(stack)来实现,也可以通过与栈等价的递归来实现。对于树结构而言,由于总是对新节点调用遍历,因此看起来是向着“深”的方向前进。 12345 1 / \ 2 3...