- 博客(166)
- 收藏
- 关注
原创 动态规划算法题 小松鼠吃巧克力
小松鼠爱吃巧克力,巧克力可以吃一定数量,可以吃N天,每天可以多吃,或者少吃;只有前1天不吃,第2天才能多吃,也可以连续每天少吃。求小松鼠N天可以吃到的最大的巧克力的数量。如下示例,第1行输入为天数,第2-5行,分别为每天少吃或才多吃的数量,中间用空格隔开。示例:61 32 154 77 344 225 13结果:62。
2025-03-29 18:13:39
310
原创 DDD领域驱动设计
在事件风暴过程中,通过团队交流达成共识的,能够简单、清晰、准确描述业务涵义和规则的语言就是通用语言。通用语言包含术语和用例场景,并且能够直接反映在代码中。通用语言中的名词可以给领域对象命名,如商品、订单等,对应实体对象;而动词则表示一个动作或事件,如商品已下单、订单已付款等,对应领域事件或者命令。
2025-03-23 18:50:48
1020
原创 分布式事务
应用程序通过与事务管理器开启全局事务,待全局事务开启之后,访问本地资源管理器,本地资源管理器向事务管理器申请注册分支事务,在完成逻辑操作之后,通过事务管理器,进行两阶段提交协议 ,进行协调各个本地资源管理器进行提交或者回滚操作。,第一阶段:can commit阶段,协调者询问事务参与者,是否有能力完成此次事务,如果都返回yes,则进入第二阶段,否则中断事务,向所有参与者发送abort请求,另外两阶段就是2PC,也就是上述的两阶段协议。参与者检查自身状态,如果可以进行事务提交,则返回Yes,否则返回No。
2025-03-16 21:47:41
962
原创 亿级Mysql数据表的复杂逻辑执行脚本
因为只有成功发送消息,对方还要成功接收消息,有至少1条发送,一条接收成功的消息,互动才算成功。发送多条消息的时候,流水号会有多条,但是消息明细表的状态一定至少有一个0-发送消息,与一个1-接收消息,因此通过消息流水号与状态两个字段进行去重,如果有2条记录,则代表互动成功。只有成功发送消息,对方还要成功接收消息,有至少1条发送,一条接收成功的消息,互动才算成功。因本省的学生互动较多,普通联表查询,查询出本省学生互动时较多,查询本省学生互动时耗时30分钟,但是查询与其他省学生互动时,耗时较久,约90分钟。
2024-08-26 08:52:12
338
原创 kubernetes中使用Helm搭建Redis集群
如果选择bitnami/redis包,则安装出来的不一定是集群模式的,此时如果发现了安装的不是集群模式,直接安装到kubernetes的redis,可以修改。找到Star数多的Chart包,一类是redis包,一类是redis-cluster,顾名思义,redis-cluster是笔者所需的集群模式的redis的Chart包,而另外一个是单机模式或者主从模式的Chart包。默认为ClusterIP,安装后查询SVC信息时,TYPE列为ClusterIP,无法提供访问redis集群的IP。
2024-06-30 15:12:42
1694
原创 Kubernetes:Kubernetes应用包管理Helm
Chart:一个Helm包,其中包含运行一个应用所需要的工具和资源定义,还可能包含Kubernetes集群中的服务定义。可以理解为包含了一组定义Kubernetes 资源相关的YAML文件。Release:在Kubernetes集群上运行的一个Chart实例。在同一个集群上,一个Chart可以被安装多次。例如有一个MySQL Chart,如果想在服务器上运行两个MySQL数据库,就可以基于这个Chart安装两次。每次安装都会生成新的Release,会有独立的Release名称。
2024-04-01 18:38:33
872
原创 连接Redis不支持集群错误,ERR This instance has cluster support disabled,解决方案
1. 问题背景调整redis的配置后,启动程序时, 会报如下错误:[redis://172.16.0.8@xxx]: ERR This instance has cluster support disabled Suppressed: io.lettuce.core.RedisCommandExecutionException: ERR This instance has cluster support disabled at io.lettuce.core.internal.Exception
2024-03-30 19:31:05
3297
原创 Mysql求今天每个年级最早来学校的学生信息
解决方案,先联表查询,按时间排序后,再子查询,取最早时间的各个年级的学生信息。求今天每个班级最早来学校的学生信息。
2024-02-26 19:08:42
435
1
原创 MYSQL查询数据DATE_FORMAT() 函数时间格式问题
DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据。语法date 参数是合法的日期。format 规定日期/时间的输出格式。格式描述%a缩写星期名%b缩写月名%c月,数值%D带有英文前缀的月中的天%d月的天,数值(00-31)%e月的天,数值(0-31)%f微秒%H小时 (00-23)%h小时 (01-12)%I小时 (01-12)%i分钟,数值(00-59)%j年的天 (001-366)%k小时 (0-23)%l。
2024-01-31 18:58:05
1136
原创 SQL注入安全漏洞详解
表字典存在 SQL 注入漏洞,远程攻击者可利用该漏洞攻击系统数据库,获取敏感数据或者进行数据库违规操作。在开发项目过程中,可能会存在一些框架引入的安全问题,最好的方案就是按照官方的指引,升级最新的解决安全漏洞的版本。攻击者通过利用SQL注入漏洞,获取数据库的各种信息(如后台的账号密码),从而脱取数据库的内容(脱库);过滤关键词可能会有一些绕过的攻击方案,目前以上的过滤关键词没有绕过的方案。2.未对用户可控参数进行严格的过滤,便把参数内容拼接到SQL语句中。升级至3.6.1版本,不兼容的请自行调整。
2023-12-29 19:23:13
845
原创 高并发下数据库插入操作死锁问题
比如说本篇博客中的A表与B表可以校验两者的数据一致性,因为高并发会时时刷新数据,因此即使是死锁造成的短暂的数据不一致,在下一次刷新时,也会刷新为最新的数据。此场景在多线程批量同时对两张表进入插入操作,一张A表,一张B表,A表是原始数据表,B表是处理数据表,插入B表时,每批次插入数据量为50,产生死锁导致数据不一致问题。在一个事务中的 INSERT 按照主键或唯一键的顺序增序插入,即 session1 可以先插入 a=33 的记录,再插入 a=35 的记录,可一定程度避免受到 GAP 锁的影响。
2023-12-28 19:33:20
2752
原创 高并发情况下,数据库与缓存数据不一致问题
先读取这家店铺最新的定价策略,有缓存读缓存,无缓存读数据库,再通过计算生产商品的售价,同时会将这家店铺的定价策略存入缓存A中。原来定价策略缓存A被一家店铺的所有商品所共用,并发情况下,商品进行售价计算逻辑较复杂,因此耗时较高,在一个线程进入读取旧缓存定价策略后,管理端才编辑操作,删除了旧缓存,但是程序中的定价策略还是旧的,所以在计算完商品售价,再将旧的定价策略更新为定价策略存入缓存A中,由并发不断刷新,所以这个缓存一直不失效。同时会有新的批量读取缓存中的最新定价策略来更新缓存。
2023-12-24 20:26:52
186
原创 Linux服务器磁盘占用过高解决思路
1、是否有产生过大的日志文件,或者大文件中的log过大,导致磁盘占用过高;2、进入文件目录,通过du -sh 查看内存占用,可以发现占用较大的文件。3、查看服务器是否有进行DB数据备份,占用资源过多,可进行适当清理;1、可通过df -h 查询磁盘状态,发现占用过高的文件目录。5、应用生成的文件没有过期删除策略,导致文件一直堆积增长。2、查看磁盘占用情况,分析哪个目录中文件占比最大;如果存在,则可以使用通配符删除。4、是否有定时任务正在执行等。
2023-12-08 18:51:55
1099
原创 Mysql内联接inner join以后数据条数比原数据表多
数据表A有500条数据,数据表B有600条数据,执行如下sql,预期500条结果但是执行结果有520条,
2023-12-04 19:00:45
1386
原创 使用easyExcel框架报错:服务器缺少字体
后台服务使用easyExcel框架生成表格,但是生成的时候报如下的错误:这种报错其实就是部署服务的服务器缺少字体,正确的方法是安装字体。需要注意的是,测试环境服务器与生产环境服务器的在配置版本上可能存在差异,因此需要提前比对,避免测试环境测试成功的操作步骤,但是在生产环境上运行时有问题。
2023-11-30 21:34:36
1407
原创 java.lang.reflect.InvocationTargetException:null报未知异常
查询网上此报错的原因,大多是jdk包不对,依赖不对等。但此次问题是表中数据做了大量的人工维护,导致某个字段的值为空,所以产生了此空指针异常,项目的框架问题,导致堆栈信息没有完整打印出哪一行代码出现空指针报错。此堆栈信息竟不同以往的报错,可以定位到项目的哪一行代码,只能看到是空指针异常,在经过日志中的SQL语句比对之后,初步确认到哪一行代码的空指针异常,但是此代码没有改动,究竟是什么原因导致的报错呢。
2023-08-25 18:34:12
4770
1
原创 MYSQL线上无锁添加索引
在需求上线过程中,经常会往一个数据量比较大的数据表中的字段加索引,一张几百万数据的表,加个索引往往要几分钟起步。如果Online DDL操作不支持对表的继续写入,则DDL操作失败,对表修改无效。LOCK=EXCLUSIVE:排它锁:Online DDL操作期间不允许对锁表进行任何操作。LOCK=DEFAULT:默认方式,MySQL自行判断使用哪种LOCK模式,尽量不锁表。LOCK=SHARED:共享锁:Online DDL操作期间堵塞写入,不影响读取。3.读取聚簇索引,构造新的索引项,排序并插。
2023-08-17 18:53:23
1093
原创 MYSQL的IN查询效率慢的问题
当然在in的字段添加了索引的情况下,最终in走不走索引由mysql 优化执行器去判断,此底层逻辑较为复杂,但是在笔者的条件下,in的取值范围限制在10000条以内时,将走索引。
2023-07-09 21:00:41
3335
原创 iframe跨框架脚本攻击,安全问题解决办法
跨框架脚本(XFS)漏洞使攻击者能够在恶意页面的 HTMLiframe 标记内加载易受攻击的应用程序。攻击者可以使用此漏洞设计点击劫持攻击,以实施钓鱼式攻击、框架探查攻击、社会工程攻击或跨站点请求伪造攻击。个人理解就是其他网站会在他的iframe中调用我的网站内容,来截取他人的点击事件或者窃取他人敏感信息。
2023-06-02 22:16:37
1287
原创 微服务调用feign.RetryableException超时问题
Feign 和 Ribbon 的超时时间只会有一个生效,规则:如果没有设置过 feign 超时,也就是等于默认值的时候,就会读取 ribbon 的配置,使用 ribbon 的超时时间和重试设置。feign的超时配置有很多,有feign自身的,也有ribbon相关的。超时主要有两类配置:一个是连接超时,一个是读取超时。这里有一个要注意的点就是如果只配置了连接超时或者读取超时其中一个是不会生效的,必须在配置文件中对这两类超时全部配置才会生效。在没有做特定配置的情况下,feign的默认超时时间是。
2023-05-31 23:31:04
8041
原创 超人自学手册:JUC并发编程
多线程进阶=》JUC并发编程java.util.concurrent工具包业务:普通的线程代码ThreadRunnable没有返回值、效率相比入Callable相对较低1. 线程与进程进程:一个程序。一个进程往往可以包含多个线程,至少包含一个java默认有几个线程?2个 main、GC线程:开启了一个程序,打字,自动保存(线程负责)对于java而言:Thread、Runnable、CallableJava可以开启线程吗?不能并发:多线程操作同一个资源CPU一核并行:多个人一起行走
2021-12-13 20:07:24
712
1
原创 浅析@ControllerAdvice 注解
大家在开发项目的过程中,经常会使用注解来定义Bean和自动注入等,可以说注解方便了我们的开发与代码编写。Annotation(注解)是JDK1.5及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以@注解名在代码中存在的。根据注解参数的个数,可以将注解分为:标记注解、单值注解、完整注解三类。它们都不会直接影响到程序的语义,只是作为注解(标识)存在,可以通过反射机制编程实现对这些元数据(用来描述数据的数据)的访问。另外,可以在编译时选择代码里的注解是否只存在于 源代码级,
2021-09-25 19:07:18
418
原创 后端学习之数据库设计规范
话说,在一个大型项目中,后端工程将会有很多张数据表,这些表通过一些逻辑将数据组合起来,使项目的数据处理与运用更加合理与迅捷。好的数据库设计将会使整个架构清晰,数据模型完整,使用户查询信息更加迅速,用户体验更加友好。可以说,随着用户量的不断提升,数据库的性能是制约系统性能的一个重要的因素,因此,好的数据库设计是每个程序员都应该掌握的,团队内部形成一些规范将有助于开发工作的顺利进行,这其中包括数据库的设计规范以及数据库的操作规范。今天我们首先来聊聊数据库的设计规范。(1)数据表的字段设计中,字段尽量使用非空
2021-09-21 23:05:35
588
原创 后端学习之swagger
话说,在一个大型项目中,后端工程将会有很多接口,很多时候团队会花一些时间来形成一些文档来梳理这些接口,也会通过yapi来登记接口,但是后项目运营的后期优化过程中,接口的改动难以避免,并且在改动的过程中的梳理的文档和yapi有时候会忘记同步修改,隔一段时候团队就会让梳理一下现在的接口,你是否会因为梳理太多的接口而心生畏惧?所以这个时候我们需要一种新的工具来对后端项目中的这些这些接口进行一定的梳理。Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总
2021-09-12 18:53:00
377
原创 synchronized和volatile的区别
synchronized和volatile的区别1.volatile本质:是java虚拟机(JVM)当前变量在工作内存中的值是不确定的,需要从主内存中读取;synchronized则是锁定当前的变量,只有当前线程可以访问到该变量,其他的线程将会被阻塞。2.volatile只能实现变量的修改可见性,并不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性。3.volatile只能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的。4.volatile不会造
2021-07-28 23:29:51
250
原创 超人自学手册:设计模式-七大原则
JAVA程序员必须知道的-设计模式-七大原则(单一职责原则、开闭原则、里氏替换原则、接口隔离原则、依赖倒置原则、合成复用原则、迪米特法则)单一职责原则就是一个模块、方法、类,不要承担过多的责任,高内聚低耦合的设计思想。开闭原则软件实体(模块、方法、类)应该“对扩展开放,对修改关闭”里氏替换原则子类对象能够替换父类对象出现的任何地方,并且保证原来程序的逻辑行为不被破坏接口隔离原则客户端不应该依赖倒置原则合成复用原则迪米特法则...
2021-03-14 16:25:41
132
原创 如何备份或复制数据库的整表数据?
最近一瓢在备份数据库中的一个表的数据的时候遇到了一个问题,就是用下面的sql语句进行备份的时候,只是备份了数据,但是索引等一些要素都没有了,那么该如何正确备份表中数据呢?//如果新表是不存在的create table new_table select * from old_table;1. 同一个库进行整表数据的备份//先新建表,来保证新建表的结构与原来的表是一样的。create table if not exits new_table like old_table;//从旧表中插入数据到新表
2021-01-27 09:19:47
1170
原创 向数据库中批量插入大量数据
1. addBatch(sql)Class.forName("com.mysql.jdbc.Driver");//指定连接类型Connection con = DriverManager.getConnection(url, username, password);PreparedStatement pst = con.prepareStatement("");for (int i = 0; i < 10; i++) { StringBuilder sql = new StringBu
2020-12-25 19:27:55
1815
1
原创 分割有空序列的方法-split与subString
分割有空序列的方法-split与subStringString str1 = "1,2,3,,,,7"String str2 = "1,2,3,,,,"对于以上两个字符串,如何将它们用“,”分割为数组呢?1. splitsplit(" “)与split(” “,-1)的区别1.如果字符串最后一位有值(如str1),则没有区别,2.如果最后n位都是切割符,split(” “)不会继续切分,split(” ", -1)会继续切分str1.split(",")//结果[1,2,3,,,,7]
2020-12-23 09:17:41
175
原创 数据库迁移
https://zhuanlan.zhihu.com/p/59693739https://www.cnblogs.com/aobing/p/13279852.html迁移失败:数据迁移失败怎么办数据丢失:怎么判断迁移后数据是否完整业务中断:迁移到一半遇到不可抗力怎么办数据、传输加密:数据传输过程中怎么加密,防止被不法之徒中途获取数据热切换:怎么做到不停服切换,以及数据源切换过程中的数据一致性...
2020-11-30 19:50:38
105
原创 LINUX西工大附中学习内参:问题解决--虚拟机的启动LINUX显示grub,需手动引导内核
在VMware虚拟机上安装了centOS 7,安装完之后出现grub,并没有正常开机,这种情况我查了很多,需要手动配置。我查了几个,但是都有一些问题,所以博主整合了一下。出现这个问题的原因是grub配置文件错误、损坏或丢失,需要执行以下步骤修复:罗列所有的磁盘区块:grub>ls出现(hd0),(hd0,msdos1),(hd0,msdos2)确定boot分区:ls (hd0,X)/boot/grub如果存在,则列出该文件夹里的所有文件,不存在则会报错。若boot为独立分区
2020-09-04 08:51:47
766
原创 MySQL黄冈学习内参:7.管理事务处理、全球化和本地化、安全管理、数据库备份、改善性能
7.1 管理事务处理事务处理可以用来维护数据库 的完整性,它保证成批的MySQL操作要么完全执行,要么完全 不执行。事务,指一组SQL语句回退,指撤销指定SQL语句的过程提交,指将未存储的SQL语句结果写入数据库表保留点,指事务处理中设置的临时占位符,可以 对它发布回退标识事务的开始START TRANSACTION使用ROLLBACK使用COMMIT在事务处理块中,提交 不会隐含地进行,为进行明确 的提交,使用COMMIT语句。使用保留点SAVEPOINT delete1;
2020-08-31 15:38:20
124
原创 MySQL黄冈学习内参:6.使用存储过程、使用游标、使用触发器
6.1 使用存储过程为以后的使用而保存的一条或金条 MySQL语句的集合CREATE PROCEDURE productpricing()BEGIN SELECT Avg(pro_price) AS priceaverage FROM productsEND;使用CALL productpricing();删除存储过程DROP PROCEDURE productpricing;DROP PROCEDURE productpricing IF EXISTS;使用参数6.2 使
2020-08-31 14:34:40
136
原创 MySQL黄冈学习内参:4.联结表、创建高级联结、组合查询、全文本搜索
4.1 联结表外键:外键为某个表中的一列,它包含另一个表的主键值,定义 了两个表之间的关系。内部联结 SELECT v_name, p_name, p_priceFROM ven INNER JOIN proON ven.id = pro_id;联结多个表4.2 创建高级联结使用不同类型的联结LEFT/RIGHT OUTER JOIN使用带聚集函数的联结4.3 组合查询UNION:自动去除重复的行包含或取消重复的行UNION ALL:不取消重复的行对组合查询结果排序在用UN
2020-08-30 23:59:57
115
原创 MySQL黄冈学习内参:3.创建计算字段、使用数据处理函数、汇总数据、分组数据、使用子查询
创建计算字段计算字段拼接字段SELECT语句 中可以使用Contact()函数来连接两个列。SELECT Contact(name, '(', country, ')')FROM vendorsORDER BY nameRtrim可以删除数据右侧多余的空格Ltrim左侧Trim删除两边的空格SELECT Contact(Rtrim(name), '(', Rtrim(country), ')')FROM vendorsORDER BY name使用别名SELECT Cont
2020-08-30 17:43:31
181
原创 MySQL黄冈学习内参:1. 检索数据、排序检索数据、过滤数据、数据过滤
都是一些基础知识:1. 检索数据SELECT语句的返回表中的行,但是数据没有过滤(过滤将得出结果集中的一个子集),也没有排序。mysql命令行,必须加上分号来结束SQL语句。SQL语句不区分大小写,但是,为了易于阅读,关键字大写,列和表名用小写。LIMIT 1 总是从第一行开始,给出的数为返回的行数。LIMIT 1,1LIMIT:行0,检索出来的第一行为行0而不是行1LIMIT检索出第二行而不是第一行。2. 排序检索数据ORDER BY 子句取一个或多个列的名字,据此对输出进行排序。S
2020-08-28 23:43:52
149
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人