- 博客(37)
- 资源 (1)
- 收藏
- 关注
原创 SpringBoot 三种拦截http请求方式Filter,Interceptor和AOP
FilterInterceptorControllerAdviceAOP
2024-03-25 17:51:48
2620
1
原创 超详细0-1背包问题解题思路
2)物品放入背包后,会比前面i-1个物品的最大值要高,(如果小于等于i-1个物品,即i个物品的最优值和i-1最优值一样)。假设第第i个物品在j容量的最优值为d[i][j],第i个物品的重量为w(i),价值为v(i)思维开拓,如果我想知道选了哪些东西呢?只需要在选的时候记录一下符号即可。不管是1还是2的约束,第i步的选择都受到前面i-1步的影响。条件2里面有两种情况,不选i 和选i。假设背包的容量为W。1)物品加入背包后,总的重量要小于W。条件1可以用表达式写为 j
2024-03-25 10:50:07
378
原创 MYSQL Trigger触发器的使用
可以理解MySQL触发器(Trigger)是一种特殊的SQL语句,或者是存储过程。作用与表上,当表记录的增删改事件(insert,update,delete)发生时,触发器会被激活,执行定义的SQL脚本。使用触发器可以实现数据补全,数据验证,数据复制,日志插入等功能。
2023-12-05 18:19:10
429
原创 如何优雅的在项目中添加操作日志
在学习spring的时候,里面的重点有一项就是面向切面编程,所以当项目需要日志记录的时候第一方案想到的就是自定义注解加AOP了。如上只是一个大概的框架,比如怎么获取修改前的数据,怎么获取修改后的数据,怎么存储数据,还需要配合相应的业务来进行实施。在最近的项目中需要记录操作日志。
2023-12-05 17:49:24
571
原创 Seata-分布式事务中间件
Seata-分布式事务中间件seata的产生在微服务调用中会出现如下的情况在服务间的调用可能会出现一些服务调用成功,一些服务调用失败的情况。为了使这些请求要么都成功,要么都失败就需要引入分布式事物的概念。Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。seata简介1.seata术语TC (Transaction Coordinator) - 事务协调者维护全局和分支事务的状态,驱动全局事务提交或回滚。TM (Transaction Manage
2022-05-21 18:05:26
3891
原创 Spring Filter源码解析
在FilterChainProxy中有如下方法,List filters = getFilters(fwRequest);当有SecurityFilterChain时调用 VirtualFilterChain vfc = new VirtualFilterChain(fwRequest, chain, filters); vfc.doFilter(fwRequest, fwResponse);VirtualFilterChain 的构造函数private VirtualFilterChai
2022-03-04 17:08:48
729
原创 elasticsearch基础
1.核心概念索引类似的数据放在一个索引,非类似的数据放不同索引, 一个索引也可以理解成一个关系型数据库。类型代表document属于index中的哪个类别(type)也有一种说法一种type就像是数据库的表,比如dept表,user表。注意ES每个大版本之间区别很大:ES 5.x中一个index可以有多种type。ES 6.x中一个index只能有一种type。ES 7.x以后 要逐渐移除type这个概念。映射mapping定义了每个字段的类型等信息。相当于关系型数据库中
2021-11-29 17:46:11
970
原创 常见消息中间件对比
1.ActiveMQ优点单机吞吐量:万级topic数量都吞吐量的影响:时效性:ms级可用性:高,基于主从架构实现高可用性消息可靠性:有较低的概率丢失数据功能支持:MQ领域的功能极其完备缺点:官方社区现在对ActiveMQ 5.x维护越来越少,较少在大规模吞吐的场景中使用。2.Kafka号称大数据的杀手锏,谈到大数据领域内的消息传输,则绕不开Kafka,这款为大数据而生的消息中间件,以其百万级TPS的吞吐量名声大噪,迅速成为大数据领域的宠儿,在数据采集、传输、存储的过程中发挥着举足.
2021-11-16 17:22:45
2321
原创 消息中间件-RabbitMq
消息中间件也可以称消息队列,是指用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息队列模型,可以在分布式环境下扩展进程的通信。使用场景异步处理、流量削峰、限流、缓冲、排队、最终一致性、消息驱动等需求的场景都可以使用消息中间件。自定义消息中间件BlockingQueue(阻塞队列)是java中常见的容器,在多线程编程中被广泛使用。当队列容器已满时生产者线程被阻塞,直到队列未满后才可以继续put;当队列容器为空时,消费者线程被阻塞,直至队列
2021-11-16 16:09:34
1693
原创 网络协议结构
七层架构70年代以来,国外一些主要计算机生产厂家先后推出了各自的网络体系结构,但它们都属于专用的。为使不同计算机厂家的计算机能够互相通信,以便在更大的范围内建立计算机网络,有必要建立一个国际范围的网络体系结构标准。国际标准化组织ISO 于1981年正式推荐了一个网络系统结构----七层参考模型,叫做开放系统互连模型(Open System Interconnection,OSI)。由于这个标准模型的建立,使得各种计算机网络向它靠拢,大大推动了网络通信的发展。物理层物理层是OSI的第一层,它虽然处于
2021-11-09 18:05:44
3124
原创 数据结构(一)
数据结构分类(1)线性数据结构:元素之间一般存在元素之间存在一对一关系,是最常用的一类数据结构,典型的有:数组、栈、队列和线性表(2)树形结构:结点间具有层次关系,每一层的一个结点能且只能和上一层的一个结点相关,但同时可以和下一层的多个结点相关,称为“一对多”关系,常见类型有:树、堆(3)图形结构:在图形结构中,允许多个结点之间相关,称为“多对多”关系线性数据结构数组和链表a、数组存放着一组相同类型的数据,需要预先指定数组的长度,有一维数组、二维数组、多维数组等b、链表链表是C语言中一种应
2021-10-26 18:37:11
182
原创 Redis(二)
Redis(二)Redis扩展功能分布式锁watch利用Watch实现Redis乐观锁乐观锁基于CAS(Compare And Swap)思想(比较并替换),是不具有互斥性,不会产生锁等待而消耗资源,但是需要反复的重试,但也是因为重试的机制,能比较快的响应。因此我们可以利用redis来实现乐观锁。具体思路如下:1、用redis的watch功能,监控这个redisKey的状态值2、获取redisKey的值3、创建redis事务4、给这个key的值+15、然后去执行这个事务,如果key的
2021-10-26 15:48:51
632
1
原创 面试问题及总结
1、synchornized与lock区别 ?构成方面synchronized是关键字属于JVM层面,底层是通过monitor对象来完成,其实wait/notify等方法也依赖于monitor对象,只有在同步块或方法中才能调wait/notify等方法monitorenter 进入monitorexit 退出Lock是具体类(java.util.concurrent.locks.Lock)是api层面的锁使用方法方面synchronized不需要用户去手动释放锁,当synchronized代
2021-10-12 20:47:27
525
2
原创 Redis(一)
Redis1 什么是缓存缓存原指CPU上的一种高速存储器,它先于内存与CPU交换数据,速度很快。现在泛指存储在计算机上的原始数据的复制集,便于快速访问。在互联网技术中,缓存是系统快速响应的关键技术之一,采用以空间换时间的一种技术。2 缓存的应用场景...
2021-09-10 23:32:32
206
原创 Sychronized和Lock
提到并发大家都会想到锁,提到锁,面试经常被问到Sychronized和Lock,整理了下相关的资料,方便大家参考锁的分类悲观锁乐观锁悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchronized和ReentrantLo
2021-08-24 21:02:31
242
原创 Mysql
Mysql1 架构演变单点式主从式分库分表式优缺点分析1)单点式,由于只部署了一台mysql,QPS会有限制,存储的数据量也会有限制,但是不用考虑数据的一致性。用于数据量少,QPS也少的业务场景下非常适合2)主从结构,每个库里面的数据都是一样的,从表负责读,主表负责写,因此对写的支持也有一定局限性,但是可以很好的支持读的功能,另外因为理论上还是一张表,因此当数据量足够大的时候,还是会出现查询效率慢的情况,初次主从结构还需要保持数据的一致性,也加大了技术难度和维护成本。3)分库分表式,
2021-08-16 12:13:06
151
原创 Springboot启动流程
Springboot启动流程@SpringBootApplicationpublic class WarmApplication { /** * The main method. */ public static void main(String[] args) { SpringApplication.run(WarmApplication.class, args); }}该代码块主要有两个值得注意的地方,1. SpringApplication 2. Sprin
2021-08-14 23:15:18
145
原创 线程池详解
1 线程池作用降低资源消耗。通过重复利用已创建的线程,来降低线程创建、销毁线程造成资源的消耗。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配、调优和监控。2 线程池的状态RUNNING可以接收新的任务,正常工作。可以通过shutdown() 转为 SHUTDOWNSHUTDOWN不会接收新任务,但会执行已接收的队列中的任务。该状态下 如果队列中任务都执行完,数量为0 ,工作线程也为0则会转为 TDIYING 状
2021-07-28 12:56:53
737
转载 java类加载
当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、连接、初始化3个步骤来对该类进行初始化。如果没有意外,JVM将会连续完成3个步骤,所以有时也把这个3个步骤统称为类加载或类初始化。一、类加载过程加载指的是将类的class文件读入到内存,并为之创建一个java.lang.Class对象,也就是说,当程序中使用任何类时,系统都会为之建立一个java.lang.Class对象。类的加载由类加载器完成,类加载器通常由JVM提供,这些类加载器也是前面所有程序运行的基础,JVM提供的这些类加
2021-07-21 19:29:49
4077
原创 GC垃圾回收机制
1 垃圾回收对象Java 堆是垃圾收集器管理的主要区域,因此也被称作GC 堆(Garbage Collected Heap).从垃圾回收的角度,由于现在收集器基本都采用分代垃圾收集算法,所以 Java 堆还可以细分为:新生代和老年代:再细致一点有:Eden 空间、From Survivor、To Survivor 空间等。进一步划分的目的是更好地回收内存,或者更快地分配内存。2 垃圾回收模型Eden区位于Java堆的年轻代,是新对象分配内存的地方,由于堆是所有线程共享的,因此在堆上分配内存需要加
2021-07-21 19:15:04
361
原创 JVM内存结构
1JVM的内存结构大概分为:堆(Heap):线程共享。所有的对象实例以及数组都要在堆上分配。回收器主要管理的对象。方法区(Method Area):线程共享。存储类信息、常量、静态变量、即时编译器编译后的代码。方法区(Method Area)与Java 堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然Java 虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的应该是与Java 堆区..
2021-07-21 17:49:40
577
原创 AQS详解
AQS详解1.架构图大致流程,不设置细节。AQS中维护了一个队列,这个队列类似于一个双向链表的结构,有HEAD和TAIL,满足FIFO原则,当HEAD执行完,释放之后,HEAD的NEXT会变成HEAD,当添加时,直接在TAIL后面添加,并且指向添加后的。2 关键成员变量private volatile int state用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最的值。private transient volatile Node head;private
2021-07-19 14:07:20
423
原创 手写tomcat,实现简单功能
编程题开发Minicat V4.0,在已有Minicat基础上进一步扩展,模拟出webapps部署效果 磁盘上放置一个webapps目录,webapps中可以有多个项目,例如demo1、demo2、demo3… 每个项目中含有servlet,可以根据请求url定位对应servlet进一步处理。解答:1)增加 server.xml配置文件,其中app元素指定appBase路径<Server> <app appBase="G:/sources/Minicat/webapps"/
2021-05-19 16:45:10
428
原创 自定义简易版SpringBoot,实现SpringBoot MVC及内嵌Tomcat启动、DispatcherServlet注册和组件扫描功能
作业要求:自定义简易版SpringBoot,实现SpringBoot MVC及内嵌Tomcat启动、DispatcherServlet注册和组件扫描功能。程序通过main方法启动,可以自动启动tomcat服务器可以自动创建和加载DispatcherServlet组件到ServletContext中可以自动通过@ComponentScan扫描Controller等组件Controller组件可以处理浏览器请求,返回响应结果作业提示:当实现了Servlet3.0规范的容器(比如Tomcat7及以上
2021-05-15 02:25:27
1211
原创 spring mvc手写权限框架实现
一、编程题手写MVC框架基础上增加如下功能1)定义注解@Security(有value属性,接收String数组),该注解用于添加在Controller类或者Handler方法上,表明哪些用户拥有访问该Handler方法的权限(注解配置用户名)2)访问Handler时,用户名直接以参数名username紧跟在请求的url后面即可,比如http://localhost:8080/auth/admin?name=admin3)程序要进行验证,有访问权限则放行,没有访问权限在页面上输出注意:自己造几个用
2021-04-24 11:49:23
522
1
原创 spring自定义@Service @Autowired @Transactional
自定义@Service、@Autowired、@Transactional注解类,完成基于注解的IOC容器(Bean对象创建及依赖注入维护)和声明式事务控制,写到转账工程中,并且可以实现转账成功和转账异常时事务回滚思路1 认识三个注解的作用域 @Service作用于类 @Autowired作用于成员变量,并且通过set方法进行赋值 @Transactional 作用于方法2 利用反射加载bean依赖包 <dependency> <groupId>org
2021-04-13 00:06:26
550
1
原创 自定义持久层框架,在查询基础上,完善新增,删除,修改。
自定义持久层框架,在查询基础上,完善新增,删除,修改。自定义持久层框架实现大致思路。在原有的基础上要注意的事项;1.之前xml文件中的查询标签都是,因此需要把update,insert,delete标签也加上xml文件<mapper namespace="com.lagou.dao.IUserDao"> <!--sql的唯一标识:namespace.id来组成 : statementId--> <select id="findAll" result
2021-03-15 00:36:05
196
原创 数仓实践上
需求1、在会员分析中计算最近七天连续三天活跃会员数。2、项目的数据采集过程中,有哪些地方能够优化,如何实现?解题思路求最近七天连续三天活跃的会员数从dws.dws_member_start_day 这张每日会员登录表中已经知道了,每日登录的会员从求出的时间往前推7天确认数据范围使用排序函数 row_number,按照device_id分组,dt排序,用dt减去row——number得到分组标识字段gid再根据gid和device_id进行分组,用连续三天这个条件进行过滤hue测试代码使
2021-02-02 20:45:51
232
原创 使用Kafka做日志收集。
需要收集的信息:1、用户ID(user_id)2、时间(act_time)3、操作(action,可以是:点击:click,收藏:job_collect,投简历:cv_send,上传简历:cv_upload)4、对方企业编码(job_code)1、HTML可以理解为拉勾的职位浏览页面2、Nginx用于收集用户的点击数据流,记录日志access.log3、将Nginx收集的日志数据发送到Kafka主题:tp_individual架构:HTML+Nginx+ngx_kafka_module+K
2021-01-18 00:03:36
1020
原创 RedisCluster的安装、部署、扩容和Java客户端调用
需求描述如图(1)搭建Redis5.0集群,要求三主三从,记录下安装步骤(2)能够添加一主一从(Master4和Slaver4),记录下安装步骤(3)能够通过JedisCluster向RedisCluster添加数据和取出数据搭建Redis5.0集群第一步:安装C语言需要的GCC环境yum install -y gcc-c++yum install -y wget第二步:下载并解压缩Redis源码压缩包wget http://download.redis.io/releases/red
2021-01-03 18:23:43
161
原创 Azkaban任务调度
需求现有用户点击行为数据文件,每天产生会上传到hdfs目录,按天区分目录,现在我们需要每天凌晨两点定时导入Hive表指定分区中,并统计出今日活跃用户数插入指标表中。日志文件clickloguserId click_time indexuid1 2020-06-21 12:10:10 a.htmluid2 2020-06-21 12:15:10 b.htmluid1 2020-06-21 13:10:10 c.htmluid1 2020-06-21 15:10:10 d.htmluid2
2020-11-12 02:11:47
1550
原创 好友关系双向
需求在社交网站,社交APP上会存储有大量的用户数据以及用户之间的关系数据,比如A用户的好友列表会展示出他所有的好友,现有一张Hbase表,存储就是当前注册用户的好友关系数据,如下需求使用Hbase相关API创建一张结构如上的表删除好友操作实现(好友关系双向,一方删除好友,另一方也会被迫删除好友)例如:uid1用户执行删除uid2这个好友,则uid2的好友列表中也必须删除uid1分析:1.创建如上结构的表2.分析,当uid1用户执行删除uid2这个好友,则uid2的好友列表中也必须删除
2020-11-09 03:41:35
549
原创 基于Zookeeper实现简易版配置中心
需求创建一个Web项目,将数据库连接信息交给Zookeeper配置中心管理,即:当项目Web项目启动时,从Zookeeper进行MySQL配置参数的拉取要求项目通过数据库连接池访问MySQL(连接池可以自由选择熟悉的)当Zookeeper配置信息变化后Web项目自动感知,正确释放之前连接池,创建新的连接池思路1.启动程序,使用默认的配置项zk中创建永久节点,并使用该配置连接数据库2.使用zk监听文件内容变化,当数据变化时,释放之前的连接,使用心得配置进行连接3.手动变更永久节点的值,查看
2020-11-09 01:45:53
636
原创 按时间间隔求访问序号
Impala作业题业务背景现有收集到用户的页面点击行为日志数据,数据格式如下:用户id, 点击时间user_id click_timeA,2020-05-15 01:30:00A,2020-05-15 01:35:00A,2020-05-15 02:00:00A,2020-05-15 03:00:10A,2020-05-15 03:05:00B,2020-05-15 02:03:00B,2020-05-15 02:29:40B,2020-05-15 04:00:00业务:会话概
2020-10-25 23:12:19
191
原创 hive sql常用题目测试
作业题1、找出全部夺得3连贯的队伍team,year活塞,1990公牛,1991公牛,1992公牛,1993火箭,1994火箭,1995公牛,1996公牛,1997公牛,1998马刺,1999湖人,2000湖人,2001湖人,2002马刺,2003活塞,2004马刺,2005热火,2006马刺,2007凯尔特人,2008湖人,2009湖人,2010create table t1(team string,year int)row format delim
2020-10-18 16:24:23
1010
原创 大数据学习作业-hadoop
大数据学习作业-hadoop题目有三个文件,文件中每一行都是一个数字,请编写程序,对三个文件中的数字整体进行降序排列结果文件中每一行有两个数字,第一个数字代表排名,第二个数字代表原始数据。期望结果如下1 22 63 154 225 266 327 328 549 92解题思路1 由于要对数据进行全排序,所以应该所有的数据最终都由一个reduce task进行处理2 使用降序排列自定义类并且重写比较器进行排序,map端的输入<LongWritable,Text>输出&
2020-09-23 04:08:09
260
原创 linux基础篇
linux基础篇Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。文章目录linux基础篇linux的安装1需要先安装虚拟机vm2 安装linux需...
2018-12-18 10:06:17
238
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人