自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(844)
  • 收藏
  • 关注

原创 RabbitMQ消息的可靠投递

其中自动确认是指,当消息一旦被Consumer接收到,则自动确认收到,并将相应 message 从 RabbitMQ 的消息缓存中移除。但是在实际业务处理中,很可能消息接收到,业务处理出现异常,那么该消息就会丢失。如果设置了手动确认方式,则需要在业务处理成功后,调用channel.basicAck(),手动签收,如果出现异常,则调用channel.basicNack()方法,让其自动重新发送消息。如果出现异常,则在catch中调用 basicNack,拒绝消息,让MQ重新发送消息。4.队列和交互机绑定。

2023-03-28 20:14:17 74

原创 java.lang.IllegalStateException: Channel closed; cannot ack/nack

java.lang.IllegalStateException: Channel closed; cannot ack/nack

2023-03-28 20:13:07 7

原创 LeetCode-115. 不同的子序列

从递推公式dp[i][j] = dp[i - 1][j - 1] + dp[i][j-1];从递推公式dp[i][j] = dp[i - 1][j - 1] + dp[i ][j-1];当t[i - 1] 与 s[j - 1]不相等时,dp[i][j]只有一部分组成,不用s[j - 1]来匹配(就是模拟在s中删除这个元素),即:dp[i][j-1]所以当t[i - 1] 与 s[j - 1]相等时,dp[i][j] = dp[i - 1][j - 1] + dp[i ][j-1];

2023-03-28 13:45:10 262

原创 HashMap何时会链表转红黑树

通过查看源码可以发现,默认是链表长度达到 8 就转成红黑树,而当长度降到 6 就转换回去,这体现了时间和空间平衡的思想,最开始使用链表的时候,空间占用是比较少的,而且由于链表短,所以查询时间也没有太大的问题。可是当链表越来越长,需要用红黑树的形式来保证查询的效率。

2023-03-28 13:18:14 192

原创 LeetCode-392. 判断子序列

t[j - 1]),此时相当于t要删除元素,t如果把当前元素t[j - 1]删除,那么dp[i][j] 的数值就是 看s[i - 1]与 t[j - 2]的比较结果了,即:dp[i][j] = dp[i][j - 1];if (s[i - 1] == t[j - 1]),那么dp[i][j] = dp[i - 1][j - 1] + 1;同理从递推公式可以看出dp[i][j]都是依赖于dp[i - 1][j - 1] 和 dp[i][j - 1],那么遍历顺序也应该是从上到下,从左到右。

2023-03-27 21:08:08 294

原创 Mysql查询优化_覆盖索引优化

简单说就是,select 到 from 之间查询的列使用了索引!select * from tName 不建议使用*使用覆盖索引后禁止使用select *禁止查询与业务无关字段尽量使用覆盖索引。

2023-03-27 20:32:34 5

原创 LeetCode-53. 最大子数组和

一定是取最大的,所以dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]);从递推公式可以看出来dp[i]是依赖于dp[i - 1]的状态,dp[0]就是递推公式的基础。根据dp[i]的定义,很明显dp[0]应为nums[0]即dp[0] = nums[0]。dp[i]:包括下标i(以nums[i]为结尾)的最大连续子序列和为dp[i]。dp[i - 1] + nums[i],即:nums[i]加入当前连续子序列和。nums[i],即:从头开始计算当前连续子序列和。

2023-03-26 13:30:30 103

原创 LeetCode-1035. 不相交的线

如果nums1[i - 1] 与 nums2[j - 1]不相同,那就看看nums1[0, i - 2]与nums2[0, j - 1]的最长公共子序列 和 nums1[0, i - 1]与nums2[0, j - 2]的最长公共子序列,取最大的。有人会问了max(dp[i - 1][j], dp[i][j - 1],dp[i-1][j-1]),因为dp[i-1][j-1]始终比dp[i - 1][j]小。即:dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);

2023-03-26 13:19:07 173

原创 HashMap中HashCode的实现原理

但是如果我们将 hashCode 值右移 16 位,也就是取 int 类型的一半,刚好将该二进制数对半切开。并且使用位异或运算(如果两个数对应的位置相反,则结果为1,反之为0),这样的话,就能避免我们上面的情况的发生。如果数组长度是16,也就是 15 与运算这两个数, 你会发现结果都是0。这样的散列结果太让人失望了。对象 A 的 hashCode 为 1000010001110001000001111000000,这行代码就是为什么要让前面的 hash 方法移位并异或。首先,假设有一种情况,

2023-03-26 11:09:56 158

原创 HashMap中put的实现原理

(1)先判断当前Node[]数组是不是为空,为空就新建,不为空就对hash值与容量-1做与运算得到数组下标(2)然后会判断当前数组位置有没有元素,没有的话就把值插到当前位置,有的话就说明遇到了哈希碰撞(3)遇到哈希碰撞后,如果Hash值相同且equals内容也相同,直接覆盖,就会看下当前链表是不是以红黑树的方式存储,是的话,就会遍历红黑树,看有没有相同key的元素,有就覆盖,没有就执行红黑树插入。

2023-03-26 11:08:12 121

原创 Mysql查询优化_子查询优化

Mysql查询优化_子查询优化。

2023-03-26 11:00:57 4

原创 Mysql查询优化_关联查询优化

3.inner join 时,mysql会自动将小结果集的表选为驱动表。选择相信mysql优化策略。2.left join 时,选择小表作为驱动表,大表作为被驱动表。4.能够直接多表关联的尽量直接关联,不用子查询。1.保证被驱动表的join字段被索引。

2023-03-26 10:57:44 6

原创 HashMap核心参数

下次扩容的时候,就能够计算key在新key在新的table中index值。为啥需要key的hash值保存起来?

2023-03-25 19:52:52 6

原创 LeetCode-1143. 最长公共子序列

如果text1[i - 1] 与 text2[j - 1]不相同,那就看看text1[0, i - 2]与text2[0, j - 1]的最长公共子序列 和 text1[0, i - 1]与text2[0, j - 2]的最长公共子序列,取最大的。有人会问了max(dp[i - 1][j], dp[i][j - 1],dp[i-1][j-1]),因为dp[i-1][j-1]始终比dp[i - 1][j]小。即:dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);

2023-03-25 16:16:39 156

原创 LeetCode-718. 最长重复子数组

第一个是低级错误,nums1[i] == nums2[j]写成了nums1[i-1] == nums2[j-1]即当A[i] 和B[j]相等的时候,dp[i][j] = dp[i - 1][j - 1] + 1;根据dp[i][j]的定义,dp[i][j]的状态只能由dp[i - 1][j - 1]推导出来。dp[i][j]的定义也就决定着,我们在遍历dp[i][j]的时候i 和 j都要从0开始。根据dp[i][j]的定义,dp[i][0] 和dp[0][j],相等就为1。第二个是没判断边界值。

2023-03-25 14:49:00 318

原创 Mysql查询优化_单表使用索引及常见索引失效

结论:过滤条件要使用索引必须按照索引建立时的顺序,依次满足,一旦跳过某个字段,索引后面的字段都无法被使用。结论:计算、函数导致索引失效建议:将可能做范围查询的字段的索引顺序放在最后。

2023-03-25 12:36:46 257

原创 LeetCode-674. 最长连续递增序列

如果 nums[i] > nums[i - 1],那么以 i 为结尾的连续递增的子序列长度 一定等于 以i - 1为结尾的连续递增的子序列长度 + 1。以下标i为结尾的连续递增的子序列长度最少也应该是1,即就是nums[i]这一个元素。从递推公式上可以看出, dp[i + 1]依赖dp[i],所以一定是从前向后遍历。本题一层for循环就行,比较nums[i] 和 nums[i - 1]。dp[i]:以下标i为结尾的连续递增的子序列长度为dp[i]。即:dp[i] = dp[i - 1] + 1;

2023-03-24 22:47:44 360

原创 LeetCode-300. 最长递增子序列

j其实就是遍历0到i-1,那么是从前到后,还是从后到前遍历都无所谓,只要吧 0 到 i-1 的元素都遍历了就行了。所以默认习惯 从前向后遍历。dp[i] 是有0到i-1各个位置的最长递增子序列 推导而来,那么遍历i一定是从前向后遍历。dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度。每一个i,对应的dp[i](即最长递增子序列)起始大小至少都是1.

2023-03-24 13:27:47 9

原创 Mysql中BTree和B+Tree

为啥要使用B+Tree,而不是用普通二叉树和AVL平衡二叉树呢B-Tree树即B树,B即Balanced,平衡的意思。B-Tree即B树,Balance Tree,平衡树。2-3树是最简单的B树结构。B树的阶:节点的最多子节点个数。比如2-3树的阶是3,2-3-4树的阶是4。B树通过重新组织节点,降低树的高度,并且减少IO读写次数来提升效率。关键字集合分布在整颗树中,即叶子节点和非叶子节点都存放数据。

2023-03-24 11:02:44 185

原创 MySQL架构_存储引擎简介

大于等于5.5之后,默认采用InnoDB引擎。InnoDB是MySQL的默认事务型引擎,它被设计用来处理大量的短期(short-lived)事务。可以确保事务的完整提交(Commit)和回滚(Rollback)。除了增加和查询外,还需要更新,删除操作,那么,应优选选择InnoDB存储引擎。除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑InnoDB引擎。

2023-03-24 11:01:59 90

原创 LeetCode-714. 买卖股票的最佳时机含手续费

dp[i][0]:有两个状态,一个是保持前一天的不持有的状态,另一个是卖掉(前一天持有),顺便要扣掉手续费。dp[i][0]:有两个状态,一个是保持前一天的持有的状态,另一个是买入(前一天不持有)从递推公式可以看出dp[i]都是由dp[i - 1]推导出来的,那么一定是从前向后遍历。dp[0][1]:表示不持有,说明当天买当天卖,即为0。dp[0][0]:表示持有,说明第一天要买入。dp[i][1]代表不持有股票。dp[i][0]代表持有股票。

2023-03-23 21:24:53 13

原创 LeetCode-309. 最佳买卖股票时机含冷冻期

dp[i][0] = Math.max(dp[i-1][0],dp[i-1][2]-prices[i])意思是你只有在股票冷冻期之后才能买入。操作一:前一天就是持有股票状态(状态一),dp[i][0] = dp[i - 1][0]操作二:冷冻期之后才能买 dp[i][0] = dp[i-1][2]-prices[i]操作二:持有股票才能卖出,dp[i][1] = dp[i-1][0]+prices[i]dp[i][2] = dp[i-1][1]意思是冷冻期肯定是卖出的状态(手上没有股票)

2023-03-23 15:22:30 234

原创 MySQL架构_查询计划

执行编号4时,比执行编号3时少了很多信息,从下面截图中可以看出查询语句直接从缓存中获取数据;如果对数据库表进行 insert ,update ,delete 这个时候,缓存会失效!1)修改配置文件/etc/my.cnf,先开启查询缓存。了解查询语句底层执行的过程:查看是否开启计划。注意:SQL必须是一致的,否则,不能命中缓存。虽然查询结果一致,但并没有命中缓存。2)再开启查询执行计划。4)显示最近执行的语句。

2023-03-23 15:04:13 167

原创 MySQL架构_杂项配置sql_mode

sql_mode设置是否允许一些非法操作,比如允许一些非法数据的插入,数据查询等。在生产环境必须将这个值设置为严格模式,所以开发、测试、生产环境的数据库也必须要设置,这样在开发测试阶段就可以发现问题。mysql 5.7的sql_mode=有ONLY_FULL_GROUP_BY说明:在查询的时候,使用group by要遵行一定的规则综上所述:使用group by进行分组的时候,查询项目,要么是组函数,要么是分组的字段。

2023-03-22 16:26:23 116

原创 LeetCode-188. 买卖股票的最佳时机 IV

选最大的,所以 dp[i][1] = Math.max(dp[i - 1][0] - prices[i], dp[i - 1][1]);所以dp[i][2] = Math.max(dp[i - 1][1] + prices[i], dp[i - 1][2])操作一:第i天买入股票了,那么dp[i][1] = dp[i - 1][0] - prices[i]操作一:第i天卖出股票了,那么dp[i][2] = dp[i - 1][1] + prices[i]第二次卖出初始化dp[0][4] = 0;

2023-03-21 15:01:48 184

原创 LeetCode-123. 买卖股票的最佳时机 III

所以dp[i][2] = Math.max(dp[i - 1][1] + prices[i], dp[i - 1][2])一定是选最大的,所以 dp[i][1] = Math.max(dp[i - 1][1],- prices[i]);操作二:第i天没有操作,而是沿用前一天买入的状态,即:dp[i][1] = dp[i - 1][1]操作一:第i天卖出股票了,那么dp[i][2] = dp[i - 1][1] + prices[i]第0天做第一次买入的操作,dp[0][1] = -prices[0];

2023-03-21 14:16:06 149

原创 MySQL架构_用户与权限管理

2.给li4用户用本地命令行方式下,授予donglindb这个库下的所有表的插删改查的权限。select_priv(查询) insert_priv(插入) drop_priv(删除)3.授予通过网络方式登录的joe用户 ,对所有库所有表的全部权限,密码设为123123.表示创建名称为zhang3的用户,密码设为123123;select_priv , insert_priv等。所有通过user表的修改,必须用该命令才能生效。3.收回mysql库下的所有表的插删改查权限。查看某用户的全局权限。

2023-03-21 11:17:08 173

原创 LeetCode-122. 买卖股票的最佳时机 II

那么第i天持有股票即dp[i][0],如果是第i天买入股票,所得现金就是昨天不持有股票的所得现金 减去 今天的股票价格 即:dp[i - 1][1] - prices[i]。在121. 买卖股票的最佳时机中,因为股票全程只能买卖一次,所以如果买入股票,那么第i天持有股票即dp[i][0]一定就是 -prices[i]。而本题,因为一只股票可以买卖多次,所以当第i天买入股票的时候,所持有的现金可能有之前买卖过的利润。可以先做一下121. 买卖股票的最佳时机。

2023-03-20 21:14:53 14

原创 LeetCode-121. 买卖股票的最佳时机

由递推公式 dp[i][0] = max(dp[i - 1][0], -prices[i]);和 dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);同样dp[i][1]取最大的,dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);那么dp[i][0]应该选所得现金最大的,所以dp[i][0] = max(dp[i - 1][0], -prices[i]);

2023-03-20 16:15:44 126

原创 LeetCode-213. 打家劫舍 II

这道题目和198.打家劫舍是差不多的,唯一区别就是成环了。(基本和打家劫舍I类似,就是多写了几行代码)

2023-03-20 11:58:18 12

原创 LeetCode-198. 打家劫舍

如果偷第i房间,那么dp[i] = dp[i - 2] + nums[i] ,即:第i-1房一定是不考虑的,找出 下标i-2(包括i-2)以内的房屋,最多可以偷窃的金额为dp[i-2] 加上第i房间偷到的钱。从dp[i]的定义上来讲,dp[0] 一定是 nums[0],dp[1]就是nums[0]和nums[1]的最大值即:dp[1] = Math.max(nums[0], nums[1]);从递推公式dp[i] = Math.max(dp[i - 2] + nums[i], dp[i - 1]);

2023-03-19 11:47:44 245

原创 搭建 Spring 源码阅读环境

Spring在github上的仓库地址是:https://github.com/spring-projects/spring-framework。GRADLE_HOME、PATH、GRADLE_USER_HOME【可以指向安装目录自己创建的.gradle文件夹】自己在gradle-6.8.2创建一个gradle文件夹。maven本地仓库 --> 所有的jar包。Gradle 还是从 maven 仓库下载的。尽量不要下载最新版本(我下载最新版本失败了)使用我们的gradle,jdk是15版本。

2023-03-19 09:46:02 183

原创 LeetCode-27. 移除元素

LeetCode-27. 移除元素

2023-03-18 22:44:21 32

原创 Redis案例实战:淘宝购物分享短连接推广

新浪使用短链接主要是因为微博只允许发144 字,如果链接地址太长的话,那么发送的字数将大大减少。短链接的主要职责就是把原始链接很长的地址压缩成只有6 个字母的短链接地址,当我们点击这6 个字母的链接后,我们又可以跳转到原始的真实链接地址。长短链接映射的要求,需要Redis存在hash结构里面。http传输好了很多,有助于带宽节约和高并发。防止尾巴参数泄密,不安全。

2023-03-18 11:34:20 18

原创 LeetCode-279.完全平方数

可以看出每次dp[j]都要选最小的,所以非0下标的dp[j]一定要初始为最大值,这样dp[j]在递推的时候才不会被初始值覆盖。此时我们要选择最小的dp[j],所以递推公式:dp[j] = Max.min(dp[j - i * i] + 1, dp[j]);dp[j] 可以由dp[j - i * i]推出, dp[j - i * i] + 1 便可以凑成dp[j]。dp[0]表示 和为0的完全平方数的最小数量,那么dp[0]一定是0。dp[j]:和为j的完全平方数的最少数量为dp[j]

2023-03-18 11:25:32 380

原创 Exception in thread “main“ java.net.BindException: Address already in use: JVM_Bind

Exception in thread "main" java.net.BindException: Address already in use: JVM_Bind。

2023-03-17 21:41:47 35

原创 LeetCode-704.二分查找

if (nums[middle] > target) right 更新为 middle,因为当前nums[middle]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下一个查询区间不会去比较nums[middle]例如到底是 while(left < right) 还是 while(left

2023-03-17 19:59:54 6

原创 LeetCode-322.零钱兑换

凑足总额为j - coins[i]的最少个数为dp[j - coins[i]],那么只需要加上一个钱币coins[i]即dp[j - coins[i]] + 1就是dp[j](考虑coins[i])递推公式:dp[j] = Max.min(dp[j - coins[i]] + 1, dp[j]);所以dp[j] 要取所有 dp[j - coins[i]] + 1 中最小的。组合和排列一个是先遍历物品,再遍历重量,另一个是先遍历重量,在遍历物品。dp[j]:凑足总额为j所需钱币的最少个数为dp[j]

2023-03-17 11:38:17 211

原创 Redis案例实战_微信抢红包

100÷10 X2 = 20, 所以第一个人的随机范围是(0,20 ),平均可以抢到10元。90÷9 X2 = 20, 所以第二个人的随机范围同样是(0,20 ),平均可以抢到10元。80÷8 X2 = 20, 所以第三个人的随机范围同样是(0,20 ),平均可以抢到10元。不可以,set会去重,举个例子100元的红包,分成4个,如果分成[10,20,20,15,35],那么就会变成4个,不满足。这个公式,保证了每次随机金额的平均值是相等的,不会因为抢红包的先后顺序而造成不公平。

2023-03-16 21:02:36 315

原创 Redis中Key出现乱码

我使用的是RedisTemplate,而RedisTemplate会出现编码问题,需要自行配置,如果不想配置,可以使用StringRedisTemplate,因为StringRedisTemplate的源码中是有帮我们配置的,因此使用StringRedisTemplate即可完美解决“乱码”问题。

2023-03-16 17:49:44 5

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除