- 博客(185)
- 资源 (1)
- 收藏
- 关注
原创 项目中如何保证MQ【消息队列】的不重不漏
消息队列中主要涉及三方:生产者 消息队列 消费者对于消息的不重不漏需要分别从这三方面进行消息的不漏:生产者:同步等待队列落盘结果,异步等待落盘结果,保证消息正常推送到消息队列中。消息队列:通过多副本,多机器,多地域,保证数据的不丢失消费者:...
2021-06-17 00:14:42
543
原创 秒杀场景实践
目录一、场景分析:1、业务特点2、多环节(秒啥前商品信息读取,秒杀进行中 读取并减少库存,秒杀结束后 订单处理)3、场景的负载特征(高并发,读多写少)二、秒杀基本三阶段分析1、秒杀前,用户读取商品详情 缓存具体信息,无需服务端支持2、秒杀活动开始,获取库存并扣减Redis提供高并发和读取扣减的原子性控制3、下单成功相关操作较多,设计多表,有数据库完成为什么需要必须在Redis中完成库存的扣减:数据库更新速度慢于Redis,造成额外开销的同时,还可能出现超售...
2021-06-09 22:49:42
597
原创 线程池提交任务的方式
Java中的线程池在进行任务提交时,有两种方式:execute和submit方法。一、execute和submit的区别execute只能提交Runnable类型的任务,无返回值。submit既可以提交Runnable类型的任务,也可以提交Callable类型的任务,会有一个类型为Future的返回值,但当任务类型为Runnable时,返回值为null。 execute在执行任务时,如果遇到异常会直接抛出,而submit不会直接抛出,只有在使用Future的get方法获取返回值时,才会抛出异常。
2021-05-28 11:04:18
1411
原创 数据结构和算法之美 —— 哈希算法
数据结构和算法之美 - 21哈希算法的定义:将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。常用哈希算法:比如 MD5、SHA 等哈希算法几点要求:从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法); 对输入数据非常敏感,哪怕原始数据只修改了一个 Bit,最后得到的哈希值也大不相同; 散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小; 哈希算法的执行效率要尽量高效,针对较长的文本
2021-05-11 20:11:16
211
原创 数据结构和算法之美 —— 散列表
数据结构和算法之美 - 18一、散列思想:散列表的英文叫“Hash Table”,我们平时也叫它“哈希表”或者“Hash 表”。散列表 :用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有散列表。二、散列函数:key 表示元素的键值,hash(key) 的值表示经过散列函数计算得到的散列值(数组的小标)散列函数的基本要求:散列函数计算得到的散列值是一个非负整数; 如果 key1 = key2,那 hash(k
2021-05-11 14:56:24
101
原创 快速排序的优化
由于归并排序的空间复杂度问题,快速排序比较适合来实现排序函数,但是,我们也知道,快速排序在最坏情况下的时间复杂度是 O(n2),如何来解决这个“复杂度恶化”的问题呢?
2021-05-10 11:05:27
824
原创 数据结构与算法之美 —— 跳表
数据结构与算法之美 - 17二分查找底层依赖的是数组随机访问的特性,所以只能用数组来实现。如果数据存储在链表中,就真的没法用二分查找算法了吗?实际上,我们只需要对链表稍加改造,就可以支持类似“二分”的查找算法。我们把改造之后的数据结构叫做跳表。目录一、跳表(对链表建立多级索引)概念:时间复杂度:空间复杂度:插入删除操作:跳表索引动态更新:为什么 Redis 要用跳表来实现有序集合,而不是红黑树?(提供区间查询的优势)一、跳表(对链表建立多级索引)概念:对于一个
2021-05-07 18:15:26
147
原创 Java - 重写(override)和重载(overload)
Java基础 - 13重写(override)和重载(overload):重写是父子类中相同名字和参数的方法,不同的实现;重载则是相同名字的方法,但是不同的参数,本质上这些方法签名是不一样的;方法名称和参数一致,但是返回值不同,这种情况在 Java 代码中不属于重载,编译都会出错的。public int doSomething() { return 0;}// 输入参数不同,意味着方法签名不同,重载的体现public int doSomething(List<Strin
2021-03-24 00:18:41
136
原创 ConcurrentHashMap 分析
目录早期 ConcurrentHashMap:Java 8 和之后的版本的ConcurrentHashMap:Java基础-10早期 ConcurrentHashMap:其实现是基于:分离锁,也就是将内部进行分段(Segment),里面则是 HashEntry 的数组,和 HashMap 类似,哈希相同的条目也是以链表形式存放。HashEntry 内部使用 volatile(禁用缓存) 的 value 字段来保证可见性,也利用了不可变对象的机制以改进利用 Unsafe 提供的底层能力
2021-03-23 23:59:05
164
原创 HashMap 树化的原因
为什么 HashMap 要树化呢?本质上这是个安全问题。因为在元素放置过程中,如果一个对象哈希冲突,都被放置到同一个桶里,则会形成一个链表,我们知道链表查询是线性的,会严重影响存取的性能。而在现实世界,构造哈希冲突的数据并不是非常复杂的事情,恶意代码就可以利用这些数据大量与服务器端交互,导致服务器端 CPU 大量占用,这就构成了哈希碰撞拒绝服务攻击,国内一线互联网公司就发生过类似攻击事件。...
2021-03-23 23:42:11
400
原创 Java默认的排序算法
Java基础-08 【08:11】Java默认的排序算法:需要区分:是 Arrays.sort() 还是 Collections.sort() (底层是调用 Arrays.sort()); 什么数据类型; 多大的数据集(太小的数据集,复杂排序是没必要的,Java 会直接进行二分插入排序)等。对于原始数据类型,目前使用的是所谓双轴快速排序(Dual-Pivot QuickSort),是一种改进的快速排序算法,早期版本是相对传统的快速排序。而对于对象数据类型,目前则是使用TimSort,思
2021-03-23 11:13:18
1439
原创 Java8 - 流排序
https://blog.youkuaiyun.com/qq_32091599/article/details/103137681
2021-03-23 10:29:26
138
原创 数据结构与算法之美笔记 - 递归
数据结构与算法之美 - 10目录一、递归二、使用递归需要满足的条件1. 一个问题的解可以分解为几个子问题的解2. 这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样3. 存在递归终止条件三、编写递归代码 【写出递推公式,找到终止条件】四、递归代码可能存在的问题1、警惕堆栈溢出2、警惕重复计算递归利弊:五、将递归代码改成非递归代码一、递归递归实现的常见算法:DFS 深度优先搜索、前中后序二叉树遍历等等二、使用递归需要满足的条件1. 一
2021-03-18 20:21:55
183
原创 数据结构 —— 数组,栈,链表,队列
时间复杂度:非多项式复杂度,随着n的增长,时间复杂度激增 最好时间复杂度,最坏时间复杂度,平均时间复杂度空间复杂度:空间复杂度是指除了原本的数据存储空间外,算法运行还需要额外的存储空间数组:线性表,利用连续内存存放相同类型数据。依据该原理可以根据脚标计算出数据位置,连续内存可以利用cpu缓存的预读 插入删除,引起大量的数据迁移,效率低。对于无需数组可以通过交换位置来避免插叙和删除的的数据迁移,从而提高效率 ArrayList和数组的区别?(动态扩容,存储内容,封装了基本...
2021-03-18 19:51:55
172
原创 知识点记录
数据结构与算法 (目的就是达到 速度快和空间省)时间复杂度:细致分析每一行代码执行的次数,核心代码执行次数的 n 的量级,就是整段要分析代码的时间复杂度加法法则:乘法法则:嵌套循环复杂度量级,我们可以粗略地分为两类,多项式量级和非多项式量级。其中,非多项式量级只有两个:O(2n) 和 O(n!)。当数据规模 n 越来越大时,非多项式量级算法的执行时间会急剧增加;...
2021-03-18 00:16:08
91
原创 MySQL-join语句
MySQL 执行 join 语句的两种可能算法,这两种算法是由能否使用被驱动表的索引决定的。而能否用上被驱动表的索引,对 join 语句的性能影响很大。一、指定驱动表直接使用 join 语句,MySQL 优化器可能会选择表 t1 或 t2 作为驱动表,用 straight_join 让 MySQL 使用固定的连接方式执行查询,来指定join顺序。以下sql,指定了t1来做驱动表,t2是被驱动表select * from t1 straight_join t2 on (t1.a=t2..
2021-03-16 00:17:25
413
原创 MySQL-order by 是怎么工作的?
在开发系统的时候,你总是不可避免地会使用到 order by 语句。你心里要清楚每个语句的排序逻辑是怎么实现的,还要能够分析出在最坏情况下,每个语句的执行对系统资源的消耗,这样才能做到下笔如有神,不犯低级错误。MySQL实战-16【5525】...
2021-03-12 15:47:33
183
原创 MySQL- 索引字段的函数使用
目录条件字段函数操作:对索引字段做函数操作,可能会破坏索引值的有序性,因此优化器就决定放弃走树搜索功能。进行全表扫描。隐式类型转换:字符串和数字做比较的话,是将字符串转换成数字。隐式字符编码转换:比较字段使用不同的字符集,utf8和utf8mb4 。解决办法:对于需要进行转换后进行比较的字段,可以选择将函数是加在输入参数上的,这样可以使用索引。条件字段函数操作:Mysql中规定,如果对字段做了函数计算,就用不上索引了。索引的B+Tree提供快速定位能力,来源于同一层兄弟节...
2021-03-11 20:20:27
1327
原创 MySQL-为字符串增加索引的方式
目录一、前缀索引降低字符串长度,降低内存占用,从而提高搜索效率。截取前缀索引需要注意:区分度和内存占用间取得平衡前缀索引对覆盖索引的影响:无法使用覆盖索引的优化二、其他索引方式1、使用倒序存储,再创建前缀索引 解决区分度问题2、使用hash字段增加额外字段3、倒叙存储和hash字段的比较(空间占用,cpu消耗,查询效率)倒叙存储和hash字段,都无法支持范围查询,只可以进行等值查询。一、前缀索引现在,几乎所有的系统都支持邮箱登录,如何在邮箱这样的字段上建立合理...
2021-03-10 23:56:07
250
原创 MySQL-概述
一、MySQL的架构:MySQL实战-01【5525】MySQL 可以分为 Server 层和存储引擎层两部分。Server 层:包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。查询缓存:MySQL 拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。但是大多数情况下我会建议你不要使用查询缓存,查询缓存的失效非常
2021-03-10 01:02:19
230
1
原创 Vector、ArrayList、LinkedList 有何区别?
三者都是实现集合框架中的 List,也就是所谓的有序集合。Vector 是 Java 早期提供的线程安全的动态数组,如果不需要线程安全,并不建议选择,毕竟同步是有额外开销的。Vector 内部是使用对象数组来保存数据,可以根据需要自动的增加容量,当数组已满时,会创建新的数组,并拷贝原有数组数据。 ArrayList 是应用更加广泛的动态数组实现,它本身不是线程安全的,所以性能要好很多。与 Vector 近似,ArrayList 也是可以根据需要调整容量,不过两者的调整逻辑有所区别,Vector 在扩容
2021-03-09 11:55:46
86
原创 访问控制功能 —— Servlet Filter、Spring Interceptor、AOP的区别?
在项目开发中,类似权限这样的访问控制功能,我们该选择三者(AOP、Servlet Filter、Spring Interceptor)中的哪个来实现呢?
2021-03-04 19:59:22
414
1
原创 int 和 Integer 有什么区别?
int 和 Integer 有什么区别?谈谈 Integer 的值缓存范围。int 是我们常说的整形数字,是 Java 的 8 个原始数据类型(Primitive Types,boolean、byte 、short、char、int、float、double、long)之一。Integer 是 int 对应的包装类,它有一个 int 类型的字段存储数据,并且提供了基本操作,比如数学运算、int 和字符串之间转换等。在 Java 5 中,引入了自动装箱和自动拆箱功能(boxing/unboxing),
2021-03-04 11:35:40
264
1
原创 String、StringBuffer、StringBuilder 有什么区别?
目录StringStringBufferStringBuilder扩展StringString被声明成为 final class,所有属性也都是 final 的。也由于它的不可变性,类似拼接、裁剪字符串等动作,都会产生新的 String 对象。由于字符串操作的普遍性,所以相关操作的效率往往对应用性能有明显影响。String 是 Immutable 类的典型实现,原生的保证了基础线程安全,因为你无法对它内部数据进行任何修改,这种便利甚至体现在拷贝构造函数中,由于不可变,Immutabl
2021-03-03 18:13:27
195
1
原创 强引用、软引用、弱引用、幻象引用有什么区别?
在 Java 语言中,除了原始数据类型的变量,其他所有都是所谓的引用类型,指向各种不同的对象,不同的引用类型,主要体现的是对象不同的可达性(reachable)状态和 对垃圾收集的影响。充分理解这些引用,对于我们设计可靠的缓存等框架,或者诊断应用 OOM 等问题。目录强引用(“Strong” Reference)软引用(SoftReference)弱引用(WeakReference)幻象引用强引用(“Strong” Reference)就是我们最常见的普通对象引用,只要还有强..
2021-03-03 17:17:21
214
2
原创 final、finally、 finalize的区别?
目录finalfinallyfinalizefinalfinal可以修饰变量,方法,类,标识变量不可以修改,方法不可以重写,类不可以被继承。final 只能约束 strList 这个引用不可以被赋值,但是 strList 对象行为不被 final 影响,添加元素等操作是完全正常的。String类型就是final修饰final List<String> strList = new ArrayList<>();strList.add("Hello");..
2021-03-03 16:54:08
144
1
原创 Exception 和 Error 有什么区别?
基本概念理解:问题:请对比 Exception 和 Error? 运行时异常与一般异常有什么区别?Exception 和 Error 都是继承了 Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。Exception 又分为可检查(checked)异常和不检查(unchecked)异常,可检查异常在源代码里必须显式地进行捕获处理,这是编译期检查的一部分。如何处理好异常:了解.
2021-03-03 11:57:21
112
原创 行测题汇总
鸽巢定理:n个鸽子巢,若有n+1只鸽子在里面,则必有一个巢里至少有2只鸽子。鸽巢定理的推广:设k和n都是任意的正整数,若至少有kn+1只鸽子分配在n个鸽巢里,则至少存在一个鸽巢中有不少于k+1只鸽子。(1)4项培训任选2项的组合数有4*3/2=6,即n=6,(2)无论如何安排,都至少有 5 名党员参加的培训完全相同,即k+1=5,k=4(3)所以kn+1=25...
2021-03-02 14:59:06
349
MemoryAnalyzer-1.12.0.20210602-win32.win32.x86_64.zip
2021-06-29
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人