- 博客(21)
- 收藏
- 关注
原创 redis成神系列:redis过期删除、内存淘汰、集群
分析LRU (Least Recently Used) 算法是一种常见的缓存淘汰策略,Redis 使用近似的 LRU 算法而非标准的 LRU 算法。回答LRU 算法,即最近最久未使用,记录每个 key 的最近访问时间,淘汰最久未访问的数据。Redis 使用的是近似的 LRU 算法,而不是标准的 LRU 算法,这样可以减少内存开销。如果你想了解更多关于 Redis 如何实现近似 LRU 的细节,可以展开讲讲。分析LRU 算法只关注最近访问时间,忽略了访问频率。LFU 算法则将访问频率也纳入了考量。
2024-09-01 04:21:55
1334
原创 Redis成神系列:redis执行与持久化
新的 Incr AOF 日志和新的 Base AOF 日志共同构成了完整的新的 AOF 日志。因此,Redis 6.0 通过多线程优化了核心处理流程中的解包和发包两个耗费 CPU 时间的 I/O 操作,以充分利用多核的优势。在多数情况下,Redis的瓶颈在于内存和网络I/O,而不是CPU计算,使用单线程避免了线程调度和锁竞争的问题,使得Redis的处理效率更高。AOF 混合持久化方案将 RDB 持久化函数用于 AOF 的重写,将内存数据以 RDB 格式写入新的 AOF 文件中。
2024-09-01 04:10:09
1079
原创 redis成神系列:redis基础(二)
由于跳表每一层的节点数量是递减的,大多数情况下查找一个元素不需要遍历所有节点,因此在查找、插入和删除操作的平均时间复杂度都是 O(logn)O(\log n)O(logn),其中 nnn 是跳表中的节点数。具体来说,在跳表中插入一个节点时,为了决定该节点的层高,Redis 使用了一种随机化策略:最底层的节点(Level 1)一定存在,而每增加一层的概率是 25%(或 1/4),最高层数是 32 层。Redis 中的 Set 集合既可以是有序的,也可以是无序的,具体取决于底层编码的类型。
2024-09-01 03:56:22
969
原创 redis成神系列:redis基础(一)
Redis 是一个基于内存的存储系统,支持多种数据结构,可以作为数据库、缓存和消息中间件。它支持的数据结构包括字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。此外,Redis 还支持位图(bitmaps)、HyperLogLogs 和地理空间(geospatial)索引及半径查询等功能。
2024-09-01 03:40:53
1008
原创 Mysql大师之路:事务详解
1. ACID 特性ACID 是事务在数据库管理系统(DBMS)中的四大关键特性。它们确保了在数据库系统中的操作是可靠和一致的。下面是对 ACID 的每个特性的详细说明:原子性(Atomicity): 原子性确保一个事务中的所有操作要么全部完成,要么全部不完成,不会停留在中间的某个状态。如果在事务执行过程中发生错误,事务将回滚到开始之前的状态。原子性是通过 undo log(撤销日志) 实现的。当事务发生错误或被取消时,undo log允许数据库系统撤销已经执行的操作。
2024-08-30 14:28:31
750
原创 Mysql大师之路:索引应用
在 MySQL 中,联合索引(Composite Index)是一个包含多个列的索引。对于联合索引(a, b, c)首先按列a排序。在列a相同的情况下,再按列b排序。在列b相同的情况下,再按列c排序。这种排序方式决定了 MySQL 在使用联合索引时必须遵循最左匹配原则。最左匹配原则是指在使用联合索引时,查询必须从联合索引的最左边的列开始匹配。如果查询条件中的第一个列不在索引的最左边,则 MySQL 无法使用该联合索引。规则当使用联合索引(a, b, c)时,查询条件中必须包含列a。
2024-08-30 09:49:33
980
原创 Mysql大师之路:存储引擎详解
Server 层和存储引擎层。Server 层负责处理连接管理、查询解析、优化以及执行等功能,而存储引擎层负责具体的数据存储和检索操作。MySQL 提供了多种存储引擎,可以根据具体业务需求选择合适的引擎。
2024-08-30 09:20:30
964
原创 Java并发编程大师之路:线程池的使用和分析
线程池是 Java 中用于管理一组工作线程的机制,它可以有效地管理并控制线程的使用,以提高程序的性能和响应速度。线程池通过预创建一组线程,并维护一个任务队列来管理任务的执行。这种方式避免了频繁创建和销毁线程的开销。
2024-08-30 08:51:46
1064
原创 Java并发编程大师之路:CAS与并发工具
ABA 问题是 CAS 操作的一个常见问题,它描述了在多线程环境中,一个值可能会经历多次变化但最终变回原值的情况。问题描述: 假设某线程在使用 CAS 操作时,读取到了变量的值A,在准备进行更新操作时,另一个线程将该变量的值从A改为B,然后又改回了A。当第一个线程再次使用 CAS 操作时,发现变量的值依旧是A,就会认为该变量的值没有发生变化,成功执行了更新操作。但实际上,变量的值在中间经历了变化,这种情况可能会导致逻辑错误。
2024-08-30 07:17:28
844
原创 Java并发编程大师之路:锁的分析
也就是说,如果一个线程获取了一个锁,那么它有权再次获取该锁而不会被阻塞,这就是所谓的锁的可重入性。锁竞争的优化: 非公平锁允许一个新的线程插队获取锁,这样可以更高效地利用 CPU 资源。线程尝试获取锁时,如果锁是空闲的,即使其他线程已经在等待,它也可以立即获得锁。写锁(WriteLock): 是一种独占锁(Exclusive Lock),在一个线程持有写锁的同时,其他线程无法获取写锁或者读锁。它会先检查当前线程是否是同步队列中的第一个线程,如果是则尝试获取锁,否则等待队列中的其他线程先获取锁。
2024-08-30 06:26:20
764
原创 Java 并发编程大师之路:并发线程进程分析
进程是资源分配的单位,线程是调度和执行的单位。进程隔离性强,线程共享资源,线程间通信和切换开销小。多进程系统更健壮,多线程系统更高效。
2024-08-30 05:44:02
834
原创 Java并发编程大师之路:编程理论
Java 内存模型 (JMM)决定了一个线程对共享变量的写入何时对其他线程可见。JMM 定义了线程和主内存之间的抽象关系:主内存 (main memory): 存储所有线程共享的变量。本地内存 (local memory): 每个线程都有自己的本地内存,存储了线程从主内存中读取或写入的共享变量的副本。本地内存是 JMM 的一个抽象概念,实际并不是真实存在的,它涵盖了缓存、写缓冲区、寄存器以及其他硬件和编译器优化。
2024-08-29 16:31:34
616
原创 Java集合框架夯实之路:总体框架关联
add(E e)Unorderedadd(E e)add(E e)add(E e)Unorderedoffer(E e)remove()peek()Unordered。
2024-08-29 15:22:40
351
原创 Java集合框架夯实之路:Set, Queue概述
和 是 Java 中用于对象排序的两个接口,它们主要在集合排序和对象比较时发挥作用。以下是两者的主要区别和用途:1. Comparable 接口包: 位于 包中。方法: 具有一个方法 ,用来定义对象的自然排序顺序。用途:实现方式:Comparator 接口 包: 位于 包中。方法: 具有一个方法 ,用于定义自定义排序逻辑。用途:实现方式: 2.HashSet 的实现原理 基础: 是基于 实现的。底层使用 来存储所有的元素。 存储结构: 内部使用一个 实例来存储数
2024-08-29 14:41:30
597
原创 Java集合框架夯实之路:集合概述
基于双向链表实现,插入和删除效率高(O(1)),随机访问效率较低(O(n)),适合频繁插入和删除的场景。: 基于动态数组实现,随机访问效率高(O(1)),插入、删除效率相对较低(O(n)),适合频繁读取的场景。: 基于红黑树实现,保证元素按自然顺序或自定义顺序排序,不允许重复,时间复杂度为 O(log n)。机制下,遍历的是集合的一个副本(快照),所以即使在遍历过程中集合被修改,也不会影响到遍历结果。随机访问效率高(O(1)),插入、删除效率较低(O(n)),特别是在列表的中间位置。
2024-08-29 14:18:57
954
原创 Java集合框架夯实之路:Map接口讲解
1. Map 介绍是一个用于存储键值对(key-value)的接口,每个键只能映射到一个值,键不能重复。接口提供了对集合键、值、键值对等元素的访问和操作方法,允许以键值对的形式存储数据。2.接口是所有Map类型集合的祖先接口,用于存储键值对 (key-value) 的数据结构。Map中的键是唯一的,不能重复;每个键最多只能映射到一个值。SortedMap是Map的子接口,表示一个有序的Map。SortedMap中的键值对是按键排序的,可以通过键的自然顺序(即键实现的Comparable。
2024-08-29 05:31:55
966
原创 JVM成神之路: 类加载机制
这意味着在同一个 JVM 中,不同的类加载器可以加载相同名字的类,它们在 JVM 中会被视为不同的类。如果需要将类加载委派给启动类加载器,可以用。)不会被用户自定义类库覆盖,因为这些核心类首先会被启动类加载器加载,一旦加载成功,后续的类加载请求都会使用这个已经加载的类。如果启动类加载器无法加载这个类(例如,类不在它的加载范围内),才会逐层返回给下层的子加载器,让子加载器尝试自己加载该类。应用类加载器是大多数 Java 应用的默认类加载器,如果没有指定自定义类加载器,通常由它来加载用户定义的类。
2024-08-29 03:56:13
655
原创 JVM成神之路:内存分配和垃圾回收
1. 对象的访问方式Java 通过栈上的引用(reference)来操作堆中的对象。:JAVA堆中划分一块内存作为句柄池,引用中存储句柄地址,句柄包含对象实例和类型数据的地址。优点:在 GC 过程中,对象移动只需修改句柄中的实例数据地址,引用不变。:引用直接存储对象的地址,访问速度更快,节省一次指针定位的时间。HotSpot 虚拟机主要使用直接指针。2. Java 引用类型:最常见的引用,GC 不会回收。:用于描述非必需对象,在内存不足时回收,适合缓存使用。
2024-08-29 03:34:01
517
原创 JVM成神之路: 内存区域划分
堆可以是物理上不连续的内存空间,但在逻辑上应被认为是连续的,特别是对于数组等大对象,虚拟机会要求连续的内存空间以提高存储和访问效率。字面量和符号引用:Class 文件包含了常量池表,用于存储编译时生成的各种字面量(如字符串、数字常量等)和符号引用(如类名、方法名、字段名等)。服务本地方法:本地方法栈的作用与虚拟机栈类似,但它专门为本地方法(通常是用 C 或 C++ 编写的代码)服务。栈帧:每次方法调用时,都会创建一个栈帧,栈帧用于存储方法的局部变量表、操作数栈、动态链接和方法出口等信息。
2024-08-23 21:12:25
297
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人