面向对象设计指南 面向对象设计指南一般说设计模式都是指面向对象的设计模式,因为面向对象语言可以借助封装、继承、多态等特性更好的达到复用性、可拓展性、可维护性。 面向对象一般指以类、对象为组织代码的基本单元,并将封装、继承、多态、抽象四个特性(抽象有的定义里并不认为是四大特性)作为代码设计与实现的基石。 封装:通过访问权限控制,只对外暴露必要的操作,保护数据; 继承:代码复用,结构美感。不过 Java 语言不支持 2026-05-16 设计模式 #设计模式 #面向对象
Redis源码分析之ziplist篇 Redis源码分析之ziplist篇如果提到双向链表,我们应该很熟悉,每一个对象都有三个字段 指向前驱节点的指针; 指向后向节点的指针; 该节点的数据。 双向链表可以在两端执行 O(1) 级别的操作,缺点是可能产生内存碎片,对空间利用率低(每个节点除了存储数据还要存指向相邻节点的指针) 而 ziplist 就是一个特殊编码的双向链表,它特殊在哪里呢? ziplist 每个节点没有使用前后指针 2026-05-15 源码分析 > Redis #源码分析 #Redis
Redis源码分析之robj篇 Redis源码分析之robj篇在 Redis 中,一个 database 内的这个映射关系是用一个 dict 来维护的(ht[0])。dict 的 key 固定用一种数据结构来表达就够了,即动态字符串 sds。而 value 则比较复杂,为了在同一个 dict 内能够存储不同类型的 value,需要一个通用的数据结构,这个通用的数据结构就是 robj(全称 RedisObject )。 12345 2026-05-14 源码分析 > Redis #源码分析 #Redis
如何实现高吞吐的定时任务处理 如何实现高吞吐的定时任务处理实现一个定时任务的调度不算太难,一个简单的思路如下:一个存放定时任务的队列,一个按照固定时间间隔扫描的线程,这个线程每隔一段时间扫描队列里的所有任务,如果需要执行就进行调度。 首先,这个任务一定要暴露一些属性,使得线程可以判断某个时刻是否需要执行: 123456789101112131415161718192021222324252627282930public cla 2026-05-13 #Netty #TimeWheel #Kafka
Netty的EventLoopGroup是什么 Netty的EventLoopGroup是什么近期看到了一个 手写EventLoopGroup理解原理 的视频,觉得挺有意思的。 EventLoopGroup 与 EventLoop如果查看一下 Netty EventLoopGroup 的继承关系,我们会发现什么: EventLoopGroup 继承了 ScheduledExecutorService,进而也继承了 ExecutorServic 2026-05-12 #Netty
Redis源码分析之sds篇 Redis源码分析之sds篇Redis 是 C 语言编写的,C 语言里的字符串其实就是 char *,那 Redis 也是这样实现的吗? 如果不是的话,Redis 为什么要单独设计数据结构来存储字符串呢? 传统字符串在 C 语言的传统字符串里,判断字符串结束是通过末尾的 ‘\0’ 标记,这也意味着字符串里不能有该字符,否则会导致字符串提前结束。 12345678910#include <st 2026-05-11 源码分析 > Redis #源码分析 #Redis
Redis源码分析之dict篇 Redis源码分析之dict篇在上一篇 Redis长什么样 提到了 Redis 其实用了全局的 hash 表来存储所有的键值对,即下方图示的 dict,dict 中有两个数组,其中 ht[1] 只在 rehash 时候才真正用到,平时都是指向 null,hash 的底层又是使用数组来实现的,那就引出了接下来的几个问题: redis 初始化这个 dict 时数组容量是多少 如果发生了 hash 冲 2026-05-09 源码分析 > Redis #源码分析 #Redis
Redis长什么样 Redis长什么样我们都知道 Redis 是一个 <key,value> 的键值数据库,也就是一个 Map。我们平时是怎么实现这样一个 Map 的呢? 用数组,当一个 key 来的时候,首先进行 hash 运算,接着对数据的 length 取余,把这个键值对放在对应位置,这样能以 O(1) 的时间复杂度进行某个 key 的定位。 Redis 对外暴露了五种常见的数据结构,string、 2026-05-08 源码分析 > Redis #源码分析 #Redis
系统性能优化之TCP篇 系统性能优化之TCP篇TCP 是一个可以双向传输的全双工协议,常见的 HTTP 等协议都是基于 TCP 实现的。 TCP 数据交互的主要过程有三次握手建立连接,拥塞控制,四次挥手断开连接,接下来分别介绍几个主要过程涉及到的可能优化方向。 文中的配置参数均可通过 sysctl 参数 查看,syn -w 参数=newValue 修改。 三次握手与TFO三次握手建立连接的首要目的是同步序列号。只有同步了 2026-05-07 性能优化 > 通用 #性能优化 #TCP
Netty的Mpsc队列如何实现 Netty的Mpsc队列如何实现队列是一种 FIFO(先进先出)的数据结构,JDK 中定义了 java.util.Queue 的队列接口,与 List、Set 接口类似,java.util.Queue 也继承于 Collection 集合接口。此外,JDK 还提供了一种双端队列接口 java.util.Deque,我们最常用的 LinkedList 就是实现了 Deque 接口。JDK 提供了一些 2026-05-06 源码分析 > Netty #源码分析 #Netty