- 博客(60)
- 收藏
- 关注
原创 LUA脚本实现黑名单
使用LUA脚本,我们可以用当前时间戳+ip作为key,value是一个数量,每次访问让数量加一,可以设置1秒做多访问10次,使用redis的incrby,当数量加到超过10就拒绝访问,给这个key设置下ttl有效时间为2秒,这样下一秒就可以重新计算。当一个ip频繁发送请求,如何做到加入到黑名单?
2024-04-26 10:16:17
142
1
原创 为什么阿里巴巴不让使用JDK自带的线程池?
允许自定义更多的参数,如线程存活时间、队列类型和大小等,这样可以根据实际应用场景调整线程池行为,使之更符合业务需求,提高性能并防止潜在的问题。提供的预设线程池配置对拒绝策略的处理不够明确,开发者可能不清楚在任务堆积严重时,线程池具体是如何处理新提交的任务的。: 自定义线程池可以更容易地集成到监控系统中,方便开发者随时观察线程池的状态,及时发现问题并进行调整。手动创建线程池,是为了增强系统稳定性,降低资源耗损风险,并提升开发者对线程池行为的控制能力。工厂方法创建的线程池往往具有固定的配置,比如。
2024-04-15 17:32:28
187
原创 线程池中核心线程数与最大线程数与缓冲任务队列的关系?
当核心线程数全部处于活动状态且仍有新任务提交时,线程池将创建额外的线程(临时工),直至线程总数达到maximumPoolSize。若队列已满(即有界队列的情况),并且线程数未达到maximumPoolSize,线程池会创建新的非核心线程(临时工)来执行任务。当线程数达到maximumPoolSize时,线程池不会再创建新的线程,除非现有线程中有线程终止。核心线程是线程池中最基础的线程数,即使在没有任务执行时,也会一直存活在线程池中。当队列满且线程数未达最大值时,增加非核心线程执行任务。
2024-04-15 17:22:22
618
原创 JAVA阻塞队列原理
记录锁的持有线程和持有次数来实现重入,当一个线程第一次获取锁时,它会将锁的持有线程设置为自己,并将持有次数设置为1。当同一个线程再次获取锁时,它会判断当前持有锁的线程是否为自己,如果是,则将持有次数加1,否则会进入等待状态。具体来说,当一个线程需要对队列进行插入或删除操作时,它必须先获取可重入锁,以确保队列的操作是原子的,不会被其他线程干扰。阻塞队列的实现是基于条件变量的机制,因此它可以高效地实现线程的等待和唤醒操作,避免了线程忙等的情况,提高了程序的效率。(Condition)来实现。
2024-04-12 15:26:20
160
原创 什么是线程的上下文切换?
这个时候,操作系统采用时间片轮转的方式把每个线程分配给CPU去执行,线程在时间片内占用CPU执行任务,当线程使用完时间片后,就会处于就绪状态并让出CPU让其它线程占用,这就是上下文切换。如果当前线程CPU没有执行完,另一个优先级更高的线程需要CPU时,CPU会保存当前状态(如寄存器信息、堆栈指针等),转而去执行优先级更高的线程,完成后会根据保存的状态继续执行原线程。,合理设置线程的优先级和数量,避免线程间的竞争和阻塞,提高程序的并发性能。,会影响程序的性能,因此在设计并发程序时需要。
2024-04-12 14:21:49
318
原创 JAVA中如何确保N个线程可以访问N个资源,但同时又不导致死锁?
竞争不可抢占资源形成死锁如果有两个线程T1和T2,要打开两个文件F1和F2,如果等线程T1打开F1和F2并释放后T2打开F1和F2不会出现任何问题。但是如果T1打开了F1此时需要去申请打开F2,此时T2打开了F2要去申请F1这样两个线程就阻塞了他们希望对方关闭自己所需的文件,但谁也无法运行,只能无限等待。竞争可消耗资源形成死锁。
2024-04-12 14:09:20
374
原创 SpringBoot整合RabbitMQ
消费者://注册一个队列@Bean //启动多次为什么不报错?启动的时候,它会根据这个名称Direct_Q01先去查找有没有这个队列,如果有什么都不做,如果没有创建一个新的//注册一个交换机@Bean //启动的时候,它会根据这个名称Direct_E01先去查找有没有这个交换机,如果有什么都不做,如果没有创建一个新的@Bean//绑定交换机与队列关系//创建一个消费者。
2024-04-07 21:48:59
674
原创 交换机的使用
简单了解一个消息从推送到接收的流程黄色的圈圈就是我们的消息推送服务,将消息推送到 中间方框里面也就是 rabbitMq的服务器,然后经过服务器里面的交换机、队列等各种关系(后面会详细讲)将数据处理入列后,最终右边的蓝色圈圈消费者获取对应监听的消息。
2024-04-07 14:36:25
597
原创 消息队列MQ(面试题:为什么使用MQ)
MQ全称 Message Queue(消息队列),是在消息的传输过程中保存消息的。多用于分布式系统之间进行通信,解耦。
2024-04-07 14:06:11
785
原创 Redis面试题-缓存穿透,缓存击穿,缓存雪崩
解决办法(黑名单):第一个人查完之后,后续的人继续查找product-1,发现redis没有,就会先去找黑名单,如果在黑名单就返回商品不存在。:一个热点的key失效了,这时大量的并发请求直接到达数据库. (两边都不存在(皇帝的新装) (黑名单) (布隆过滤器)提前访问一遍数据库,先将数据存到redis中。击穿:redis中没有,数据库中有。redis和数据库都没有要查的数据。:大量key同时失效 (
2024-03-27 20:31:05
456
原创 Redis数据类型bitMap以及解决的相关实际需求
在Redis数据库中,Bitmap(位图)是一种特殊的数据结构,它不是一个独立的数据类型,而是基于String类型实现的。Bitmap主要用于存储大量二进制位(0或1)的数据,这些位可以代表不同的状态或标志。具体来说:存储原理: Redis的Bitmap实际上是利用String类型的最大容量(512 MB)存储一个连续的二进制序列,其中每个字节的8位可以分别代表8个独立的状态。
2024-03-27 17:16:57
948
原创 面试题:在百万keys的Redis里面,如何模糊查找某个key
对于频繁或复杂模糊查询需求,可以考虑在Redis之外构建辅助索引结构,如使用另一个Redis实例、Elasticsearch、SQLite等,专门存储key的元数据或倒排索引来加速查询。总结起来,对于百万keys的Redis数据库,进行模糊查找某个key时,首选使用 SCAN 命令,并合理设置其参数以提高效率。在存储数据时,如果能预见将来有模糊查询的需求,应尽可能设计易于过滤的key命名策略,如使用有意义的前缀、一致的命名约定等。这样,在进行模糊查询时,可以使用更精确的通配符模式,减少不必要的匹配项。
2024-03-25 21:52:11
534
原创 Redis使用
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的,使用C语言编写、支持网络、可基于亦的日志型、Key-Value数据库,并提供多种语言的API。。
2024-03-25 19:36:43
349
原创 Docker compose()
是 Docker 官方提供的一款开源工具,主要用于简化在单个主机上定义和运行多容器 Docker 应用的过程。它的核心作用是容器编排,使得开发者能够在一个统一的环境中以声明式的方式管理多容器应用的服务及其依赖关系。也就是说Docker Compose是一个用于定义和运行多个Docker容器的工具。它使用YAML文件来定义应用程序的服务、网络和卷等配置,然后使用单个命令即可启动、停止和管理整个应用程序的多个容器。
2024-03-21 16:59:18
441
原创 自动化构建Docker镜像的标准方法(一篇带你了解)
它是自动化构建Docker镜像的标准方法,包含了用于构建镜像的一系列指令,这些指令会被Docker引擎按顺序逐行解析并执行。- ENTRYPOINT ["executable","param1","param2"] :使用JSON数组格式,推荐使用这种形式。通过以上步骤,我们可以使用该Dockerfile构建一个包含Java应用程序的镜像,并在容器启动时执行Java应用程序。- CMD ["executable","param1","param2"] :使用JSON数组格式,推荐使用这种形式。
2024-03-21 14:04:33
1033
原创 Docker指令
docker run -d -p 8888:80 --restart=always --name my-nginx nginx 该容器随docker服务启动而自动启动。docker run -it --name 别名 镜像名:tag (版本号) /bin/bash 运行容器。docker run -d -p 宿主机端口:容器端口 容器端口与服务器端口映射。docker exec -it 容器名/容器ID /bin/bash。docker run -d -P 容器名称 与上面一致。
2024-03-20 21:25:43
694
原创 Linux(openEuler)部署SpringBoot前后端分离项目(Nginx负载均衡)
5.2同时由于在vite.config.ts中添加过http://localhost:8080,所以要把localhost修改为虚拟机ip。6.打包前端代码到虚拟机的Nginx中 /usr/share/nginx/html/7.如果要实现均衡负载,只需配置下Nginx的配置文件 /etc/nginx/5.1在package.json中修改build的值为图中这样。5.把前端部分拷贝到Linux的nginx中。4.把打包好的jar包放到Linux中。测试负载均衡(再开一个窗口)输入。记得提前关闭防火墙!
2024-03-19 19:37:22
316
原创 Linux 常用指令
(5)关闭防火墙端口:firewall-cmd --zone=public --remove-port=9200/tcp --permanent。(4)开启防火墙端口:firewall-cmd --zone=public --add-port=9200/tcp --permanent。(3)查看开放的端口:firewall-cmd --list-ports。(2)重新加载配置:firewall-cmd --reload。(1)查看防火墙状态:firewall-cmd --一、防火墙的开启、关闭、禁用命令。
2024-03-18 16:29:07
709
原创 openEuler-22.03-LTS-SP2更改阿里云yum安装源
【代码】openEuler-22.03-LTS-SP2更改阿里云yum安装源。
2024-03-18 15:12:11
649
原创 java通过Excel批量上传下载数据
2、定义一个上传信息对象;准备工作:1、一个与你上传数据相对于的。请求配置:uploadApi.ts。请求配置:uploadApi.ts。
2024-03-14 17:15:58
739
原创 Pinia使用
官方地址:Pinia | The intuitive store for Vue.js (vuejs.org)https://pinia.vuejs.org/Pinia是一个基于Vue 3的状态管理库,它使得管理Vue的全局状态变得更加容易和直观。而pinia-plugin-persistedstate是 Pinia 的官方插件之一,它提供了一种将 Pinia 状态持久化到本地存储的方式,以确保状态数据在刷新或关闭页面后仍然存在。换句话说,Pinia是用于管理Vue 3应用程序的状态管理库,而pini
2024-02-29 11:48:39
433
原创 @JsonFormat 和 @@DateTimeFormat 时间格式化注解详解(一篇带你解决问题)
既可以约束前端传入的时间类型参数格式,也可以约束后端响应前端的时间类型格式;只能约束前端入参时间类型的格式,并不会修改原有的日期对象的格式,如果想要获得期望的日期格式,是需要自己手动转换的;如果单独使用@DateTimeFormat 时,响应给前端的时间会比实际时间晚8个小时(时区原因)。
2024-02-03 10:55:31
3067
1
原创 Redis:定时清理垃圾图片
在填写表单信息时上传图片后就已经存入云中,但是此时取消表单的填写这个图片就变成垃圾图片,所以在点击新建填写表单的方法/upload中,把上传的图片名字存入Redis的value中,key(key1)值可以任意。然后在提交表单的方法中把成功提交表单的图片存入到value中,key(key2)与上面不同。利用Redis的差集sdiff就可以得到上传的垃圾图片的名字,再利用云的处理垃圾图片的方法就可以清除。注意两个代码都要放在上传成功代码之后!最后在QuartzConfig配置类中。在/upload方法中。
2024-01-24 15:14:43
678
原创 Redis常用命令
打开cmd:redis-server.exe redis.windows.conf。select切换Redis自带数据库(有下标0-15共16个数据库)expire和ttl:设置和查看key的失效时间。flaushall:清空所有数据库的命令。flushdb:清空当前数据库的数据。exists:判断key值是否存在。keys *:查看所有key值。incr和decr:自增和自减。
2024-01-23 16:22:06
351
原创 面试题:Redis持久化
save 300 10 300秒内有300个key值发生变化,就执行RDB持久化。save 900 1 900秒内有一个key值发生变化,就执行RDB持久化。save 60 10000 60秒内有10000个key值发生变化,就执行RDB持久化。2.等待一秒观察appendonly.aof---->持久化。持久化:就是把数据存入到硬盘中,转换成持久数据 ,在内存中不是持久存在的。优点:不影响性能( 不是有一个key就存到硬盘)1、RDB:默认开启,在存数据时体现。
2024-01-23 16:18:11
432
原创 Quartz中Corn表达式
在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发。几个域有几个* 最后一个 * 变?在每天下午2点到下午2:59期间的每1分钟触发。在每天下午2点到下午2:05期间的每1分钟触发。在每天下午2点到下午2:55期间的每5分钟触发。周一至周五的上午10:15触发。表示在每月的1日的凌晨2点调整任务。给定的最小单位时间前面的单位由0代替。每天上午10点,下午2点,4点。朝九晚五工作时间内每半小时。表示每个星期三中午12点。Cron有两种语法格式。
2024-01-23 11:29:11
462
原创 定时任务组件Quartz
job:做什么事,比如查询当前时间,定时清理图片。SpringBoot 通过注解配置Quartz。再运行SpringBoot的启动类。scheduler:什么时候做什么事。trigger:什么时候做。quartz的核心概念。
2024-01-23 11:18:48
429
原创 数据库使用主键回填
keyProperty="id":返回的主键回填到pojo的id属性。useGeneratedKeys="true":开启主键回填。下面的例子回填到CheckGroup类中的id属性中。使用主键回填的简单方法。
2024-01-20 11:11:13
559
原创 SpringBoot实现自动分页
startPage()方法中的两个分别是 第一个参数是页数。第二个参数是条数,每页查询的条数。两个结果都可以在PageInfo中取得,具体怎么取不用深究。要返回两个参数 一个是总记录数,一个是当前页结果。MyBatis整合PageHelper。如果想详细详细了解如何分页,参考。首先需要引入一个依赖。完成分页需要三个步骤。
2024-01-19 16:31:59
469
原创 Java解决跨域问题
当浏览器控制台出现下面的问题,说明出现了跨域问题。还有就是注解一定一定不要导错!注入时不要用@Autowired。@Service注解的包是。要使用@Reference。
2024-01-19 14:33:16
862
原创 dubbox框架
Dubbo(读音[ˈdʌbəʊ])是阿里巴巴公司开源的一个基于Java的高性能框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。后期阿里巴巴停止了该项目的维护,于是当当网在这之上推出了自己的Dubbox。
2024-01-17 19:54:13
492
原创 SpringBoot多环境配置与添加logback日志
application-test.yml 测试环境 端口8091。application-prod.yml 生产环境 端口8092。application-dev.yml 开发环境 端口8090。所以SpringBoot提供了可以适应多个环境的配置文件。在application中选择使用哪个端口号。文件名必须为logback.xml。2、添加logback文件。一个项目会有多个运行环境。每个文件对应一个端口号。
2024-01-16 17:47:10
817
原创 Java异常:toString()和getMessage()区别
输出异常要使用toString()因为toString方法获取的是异常类型和异常详细信息。getMessage()只获取异常的详细信息字符串。使用toString()方法打印报错信息。空指针异常的错误信息是;
2024-01-15 11:15:05
604
原创 Spring的纯注解配置
transactional配置。保留properpies文件。service:配置。手写Springboot 小demo
2024-01-14 16:38:25
677
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人