自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MySQL查询性能优化

减少重复计算:在一个复杂的查询中,某个值如果需要在多个地方使用,通常情况下可能需要重复计算这个值。通过将这个值存储在一个用户自定义变量中,可以避免重复计算,从而减少查询的总体资源消耗。编写偷懒的UNION:假设需要编写一个UNION查询,其第一个子查询作为分支条件先执行,如果找到了匹配的行,则跳过第二个分支。在某些业务场景中确实会有这样的需求,比如先在一个频繁访问的表中查找“热”数据,找不到再去另外一个较少访问的表中查找“冷”数据。(区分热数据和冷数据是一个很好的提高缓存命中率的办法)。

2024-08-01 02:12:17 540

原创 Reids笔记——单机数据库的实现

Redis服务器默认会创建16个数据库。默认情况下,Redis客户端的目标数据库为0号数据库。客户端可以通过执行SELECT命令来切换目标数据库。

2024-08-01 02:09:34 558

原创 Redis——多机数据库的实现

在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制(replicate)另一个服务器,我们称呼被复制的服务器为,而对主服务器进行复制的服务器则被称为。

2024-08-01 02:04:09 370

原创 JUC——线程安全集合类概述

Java 8数组(Node) +( 链表 Node | 红黑树 TreeNode ) 以下数组简称(table),链表简称(bin)初始化,使用 cas 来保证并发安全,懒惰初始化 table树化,当 table.length < 64 时,先尝试扩容,超过 64 时,并且 bin.length > 8 时,会将链表树化,树化过程 会用 synchronized 锁住链表头put,如果该 bin 尚未创建,只需要使用 cas 创建 bin;

2024-08-01 01:55:16 790

原创 JUC——共享模型之工具

这时 Thread-4 释放了 permits,接下来 Thread-0 竞争成功,permits 再次设置为 0,设置自己为 head 节点,断开原来的 head 节点,unpark 接 下来的 Thread-3 节点,但由于 permits 是 0,因此 Thread-3 在尝试不成功后再次进入 park 状态。,是阻塞式锁和相关的同步器工具的框架。提交任务的时,即使有线程池里的线程从阻塞队列中获取不到任务,如果线程池里的线程数还是小于核心线程数,那么依然会继续创建线程,而不是复用已有的线程。

2024-08-01 01:48:29 726

原创 JUC——共享模型之内存与无锁

如果 t 线程程频繁从主内存中读取 run 的值,JIT 编译器会将主存中run的值缓存至自己工作内存中的高速缓存中,减少对主存的访问,提高效率。volatile关键字可以用来修饰成员变量和静态成员变量,避免线程从自己的工作缓存中查找变量的值,必须到主存中获取它的值,线程操作 volatile 变量都是直接操作主存,保证了。ABA问题:如果在CAS操作执行之前,共享变量的值被改变了多次,且最终又恢复为原始值,那么CAS操作可能会误以为共享变量的值没有发生变化,导致数据的不一致。类来解决 ABA 问题。

2024-08-01 01:34:11 705

原创 JUC——共享模型之管程

内置锁在Java中被抽象为监视器锁(monitor),每个 Java 对象都可以关联一个 Monitor 对象,如果使用 synchronized 给对象上锁(重量级)之后,该对象头的 Mark Word 中就被设置指向 Monitor 对象的指针。例如,t1线程已经获得A对象锁,想获取 B对象的锁,而t2线程已经获得B对象锁,想获取A对象的锁。如果在尝试加轻量级锁的过程中,CAS 操作无法成功,这时就是有其它线程为此对象加上了轻量级锁(有竞争),需要进行锁膨胀,将轻量级锁变为重量级锁。

2024-08-01 01:29:30 933

原创 JUC——进程与线程

【阻塞状态】 如果调用了阻塞 API,如 BIO 读写文件,这时该线程实际不会用到 CPU,会导致线程上下文切换,进入 【阻塞状态】 等 BIO 操作完毕,会由操作系统唤醒阻塞的线程,转换至【可运行状态】 与【可运行状态】的区别是,对【阻塞状态】的线程来说只要它们一直不唤醒,调度器就一直不会考虑调度它们。有一种特殊的线程叫做守护线程,只要其它非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制结束。单核虽然不能通过多线程提高效率,但可以让不同的线程轮流使用CPU ,避免被一个线程长时间占用。

2024-08-01 01:13:43 961

原创 Redis笔记——数据结构与对象

Redis没有直接使用C语言传统的字符串表示,而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型,并将SDS用作Redis的默认字符串表示。Redis只会使用C字符串作为字面量,在大多数情况下,Redis使用SDS作为字符串表示。当Redis需要的不仅仅是一个字符串字面量,而是一个可以被修改的字符串值时,Redis就会使用SDS来表示字符串值,比如在Redis的数据库里面,包含字符串值的键值对在底层都是由SDS实现的。

2024-07-31 07:29:27 632

原创 高性能MySQL笔记

MySQL喜欢简单的原则:尽量避免过度设计,例如会导致极其复杂查询的schema设计,或者有很多列的表设计。使用小而简单的合适数据类型,除非真实数据模型中有确切的需要,否则应该尽可能地避免使用NULL值。尽量使用相同的数据类型存储相似或相关的值,尤其是要在关联条件中使用的列。注意可变长字符串,其在临时表和排序时可能导致悲观的按最大长度分配内存。尽量使用整型定义标识列。小心使用ENUM和SET。虽然它们用起来很方便,但是不要滥用。最好避免使用BIT。

2024-07-31 06:19:57 687

原创 关于leecode70.爬楼梯

今天在做这道题时想到用排列组合的方式求,但由于需要使用阶乘,导致在n>22的时候出现了结果不正确,但是没有报错,应为long字段溢出,因为21!=51090942171709440000,而java中Long的最大值为9223372036854775807,记录一下这个错误class Solution { public int climbStairs(int n) { int p=n/2; //最多可以有几个2 int a=p-1; //C(b,a).

2021-08-19 10:48:52 50

空空如也

空空如也

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

TA关注的人

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