redis(day08-Redis原理篇)

张开发
2026/4/14 17:45:21 15 分钟阅读

分享文章

redis(day08-Redis原理篇)
目录原理篇 - 01.Redis 原理课程介绍原理篇 - 02.Redis 数据结构 - 动态字符串问题:flags1表示什么原理篇 - 03.Redis 数据结构 - intset原理篇 - 04.Redis 数据结构 - Dict原理篇 - 05.Redis 数据结构 - Dict的渐进式rehash原理篇 - 06.Redis 数据结构 - ZipList原理篇 - 07.Redis 数据结构 - ZipList的连锁更新问题原理篇 - 08.Redis 数据结构 - QuickList问题:count和len区别原理篇 - 09.Redis 数据结构 - SkipList原理篇 - 10.Redis 数据结构 - RedisObject原理篇 - 11.Redis 数据结构 - 五种数据类型 - String原理篇 - 12.Redis 数据结构 - 五种数据类型 - List原理篇 - 13.Redis 数据结构 - 五种数据类型 - Set原理篇 - 14.Redis 数据结构 - 五种数据类型 - ZSet原理篇 - 15.Redis 数据结构 - 五种数据类型 - Hash原理篇 - 16.Redis 网络模型 - 用户空间与内核空间原理篇 - 17.Redis 网络模型 - 阻塞 IO原理篇 - 18.Redis 网络模型 - 非阻塞 IO原理篇 - 19.Redis 网络模型 - IO 多路复用原理篇 - 20.Redis 网络模型 - IO 多路复用之 select原理篇 - 21.Redis 网络模型 - IO 多路复用之 poll原理篇 - 22.Redis 网络模型 - IO 多路复用之 epoll原理篇 - 23.Redis 网络模型 - epoll 的 ET 和 LT 模式问题:什么是惊群现象原理篇 - 24.Redis 网络模型 - 基于 epoll 的服务端流程原理篇 - 25.Redis 网络模型 - 信号驱动 IO 及异步 IO原理篇 - 26.Redis 网络模型 - Redis 是单线程吗为什么用单线程原理篇 - 27.Redis 网络模型 - 多线程及多线程网络模型变更原理篇 - 28.Redis 通信协议 - RESP 协议原理篇 - 29.Redis 通信协议 - 基于 Socket 的自定义 Redis客户端问题:代码实现原理篇 - 30.Redis 内存回收 - 过期 key 处理原理篇 - 31.Redis 内存回收 - 内存淘汰策略末尾页原理篇 - 01.Redis 原理课程介绍原理篇 - 02.Redis 数据结构 - 动态字符串问题:flags1表示什么flags 值类型宏定义对应结构体len/alloc 类型最大可存储字符串长度适用场景0SDS_TYPE_5sdshdr5已废弃5bit 长度31 字节极短字符串1SDS_TYPE_8sdshdr8uint8_t1 字节255 字节短字符串如图中的name长度 42SDS_TYPE_16sdshdr16uint16_t2 字节65535 字节中等长度字符串3SDS_TYPE_32sdshdr32uint32_t4 字节4GB长字符串4SDS_TYPE_64sdshdr64uint64_t8 字节2^64 字节超大字符串原理篇 - 03.Redis 数据结构 - intset原理篇 - 04.Redis 数据结构 - Dict原理篇 - 05.Redis 数据结构 - Dict的渐进式rehash原理篇 - 06.Redis 数据结构 - ZipList原理篇 - 07.Redis 数据结构 - ZipList的连锁更新问题原理篇 - 08.Redis 数据结构 - QuickList问题:count和len区别因为QuickList里面存的是zipList而zipList里面存的是entry原理篇 - 09.Redis 数据结构 - SkipList原理篇 - 10.Redis 数据结构 - RedisObject原理篇 - 11.Redis 数据结构 - 五种数据类型 - String原理篇 - 12.Redis 数据结构 - 五种数据类型 - List原理篇 - 13.Redis 数据结构 - 五种数据类型 - Set原理篇 - 14.Redis 数据结构 - 五种数据类型 - ZSet原理篇 - 15.Redis 数据结构 - 五种数据类型 - Hash原理篇 - 16.Redis 网络模型 - 用户空间与内核空间原理篇 - 17.Redis 网络模型 - 阻塞 IO原理篇 - 18.Redis 网络模型 - 非阻塞 IO原理篇 - 19.Redis 网络模型 - IO 多路复用原理篇 - 20.Redis 网络模型 - IO 多路复用之 select原理篇 - 21.Redis 网络模型 - IO 多路复用之 poll原理篇 - 22.Redis 网络模型 - IO 多路复用之 epoll原理篇 - 23.Redis 网络模型 - epoll 的 ET 和 LT 模式问题:什么是惊群现象一堆进程 / 线程都在等同一个事件事件一来所有人同时被唤醒抢资源最后只有一个人能拿到其他人白醒一次白白浪费 CPU。原理篇 - 24.Redis 网络模型 - 基于 epoll 的服务端流程原理篇 - 25.Redis 网络模型 - 信号驱动 IO 及异步 IO原理篇 - 26.Redis 网络模型 - Redis 是单线程吗为什么用单线程原理篇 - 27.Redis 网络模型 - 多线程及多线程网络模型变更原理篇 - 28.Redis 通信协议 - RESP 协议原理篇 - 29.Redis 通信协议 - 基于 Socket 的自定义 Redis客户端问题:代码实现package com.company; import java.io.*; import java.net.Socket; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; public class Main { static Socket s; static PrintWriter writer; static BufferedReader reader; public static void main(String[] args) { try { // 1.建立连接 String host 192.168.150.101; int port 6379; s new Socket(host, port); // 2.获取输出流、输入流 writer new PrintWriter(new OutputStreamWriter(s.getOutputStream(), StandardCharsets.UTF_8)); reader new BufferedReader(new InputStreamReader(s.getInputStream(), StandardCharsets.UTF_8)); // 3.发出请求 // 3.1.获取授权 auth 123321 sendRequest(auth, 123321); Object obj handleResponse(); System.out.println(obj obj); // 3.2.set name 虎哥 sendRequest(set, name, 虎哥); // 4.解析响应 obj handleResponse(); System.out.println(obj obj); // 3.2.set name 虎哥 sendRequest(get, name); // 4.解析响应 obj handleResponse(); System.out.println(obj obj); // 3.2.set name 虎哥 sendRequest(mget, name, num, msg); // 4.解析响应 obj handleResponse(); System.out.println(obj obj); } catch (IOException e) { e.printStackTrace(); } finally { // 5.释放连接 try { if (reader ! null) reader.close(); if (writer ! null) writer.close(); if (s ! null) s.close(); } catch (IOException e) { e.printStackTrace(); } } } private static Object handleResponse() throws IOException { // 读取首字节 int prefix reader.read(); // 判断数据类型标示 switch (prefix) { case : // 单行字符串直接读一行 return reader.readLine(); case -: // 异常也读一行 throw new RuntimeException(reader.readLine()); case :: // 数字 return Long.parseLong(reader.readLine()); case $: // 多行字符串 // 先读长度 int len Integer.parseInt(reader.readLine()); if (len -1) { return null; } if (len 0) { return ; } // 再读数据,读len个字节。我们假设没有特殊字符所以读一行简化 return reader.readLine(); case *: return readBulkString(); default: throw new RuntimeException(错误的数据格式); } } private static Object readBulkString() throws IOException { // 获取数组大小 int len Integer.parseInt(reader.readLine()); if (len 0) { return null; } // 定义集合接收多个元素 ListObject list new ArrayList(len); // 遍历依次读取每个元素 for (int i 0; i len; i) { list.add(handleResponse()); } return list; } // set name 虎哥 private static void sendRequest(String ... args) { writer.println(* args.length); for (String arg : args) { writer.println($ arg.getBytes(StandardCharsets.UTF_8).length); writer.println(arg); } writer.flush(); } }原理篇 - 30.Redis 内存回收 - 过期 key 处理原理篇 - 31.Redis 内存回收 - 内存淘汰策略末尾页本文摘要 Redis原理课程系统介绍了Redis的核心数据结构和工作机制包括1) 5种动态字符串类型(SDS)及其适用场景2) 6种底层数据结构实现如intset、Dict、ZipList等3) 五种数据类型的存储结构4) 网络模型演进过程从阻塞IO到epoll多路复用5) 单线程模型优势及多线程扩展6) RESP通信协议及Java客户端实现示例7) 内存回收策略包括过期key处理和淘汰机制。课程全面剖析了Redis高性能背后的设计原理涵盖数据结构、网络通信、内存管理等核心模块。

更多文章