Redis AOF、RDB 持久化策略
Redis 持久化策略Redis 为什么需要持久化?Redis 是基于内存的数据库,内存访问速度快,但内存数据在进程退出或机器宕机后必然丢失。因此,Redis 提供持久化机制,将内存中的数据以一定策略写入磁盘,用于服务重启后的数据恢复。 需要明确一个前提结论: Redis 持久化只能降低数据丢失风险,并不能保证强一致性或绝对不丢数据。实际丢失多少数据,取决于持久化策略、刷盘频率以及宕机发生的时间点。 Redis 提供两种核心持久化机制: AOF(Append Only File)日志 RDB(Redis DataBase)快照 AOF 日志持久化AOF 是什么AOF(Append Only File)通过记录写命令的方式持久化数据。Redis 会将所有会修改数据的命令,按执行顺序追加写入日志文件。 AOF 默认是关闭的,可通过配置开启: 12appendonly yesappendfilename "appendonly.aof" AOF 只记录写操作命令,不记录读操作,因为读命令无法用于数据恢复。 AOF...
Redis 过期删除策略+缓存淘汰策略
Redis 过期删除策略在介绍 Redis 的过期删除机制之前,需要先说明:定时删除、惰性删除、定期删除是对过期数据清理思路的抽象划分,用于分析不同策略在 CPU 开销与内存占用之间的取舍。实际的高性能缓存系统通常不会采用其中某一种,而是进行组合设计。 常见的过期删除策略1. 定时删除定时删除指的是:当键到达过期时间的瞬间立即删除该键。 其实现通常需要: 为每一个设置了过期时间的 key 维护独立的定时事件(如定时器或最小堆) 到期后触发删除回调 优点: 过期键能够被及时清理 内存利用率高 缺点: 定时事件数量与过期 key 数量近似线性相关 当过期 key 较多时,定时回调会占用大量 CPU 严重影响主线程吞吐量 因此,Redis 并未采用这种高精度但高成本的策略。 2. 惰性删除惰性删除的核心思想是:不主动删除过期 key,仅在访问时检查其是否过期。 执行流程: 客户端访问 key Redis 判断 key 是否已过期 若已过期,立即删除并返回 key 不存在 优点: 对 CPU 非常友好 不做无意义的主动扫描 缺点: 如果某些 key...
Redis 使用实践
这一部分更多偏实践部分,理论部分见其余 Redis 相关博客
Redis 线程模型
Redis 线程模型Redis 常被描述为“单线程高性能”的代表,但单线程并不等于简单或低效。准确理解 Redis 的线程模型,需要区分:命令执行、网络 I/O、后台任务这三条路径。 Redis 的单线程指的是什么是指—— Redis 的命令执行路径(command execution)是单线程的。 具体来说: 所有客户端命令,统一在 主线程 中,按顺序完成:读取 → 解析 → 执行 → 返回结果 这意味着: 不需要加锁、命令天然具备原子性、数据结构实现可以极度简化 但是,Redis 并不是整个进程只有一个线程 基于内存的设计Redis 将所有核心数据结构存放在内存中,而不是磁盘。 这带来的不仅是“快”这么简单: 避免磁盘 I/O 阻塞 单次命令执行时间高度可控 延迟分布稳定,适合单线程顺序执行模型 相比之下,频繁访问磁盘的系统(如传统关系型数据库)更容易出现阻塞点,不适合纯单线程执行所有逻辑。 关于数据不丢失的问题Redis...
docker个人实践记录
记录了一些docker日常使用或具体实践的例子
JSON处理工具
JSON 处理工具使用依赖1234<dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2</artifactId></dependency> 12import com.alibaba.fastjson2.JSON;import com.alibaba.fastjson2.JSONObject; 使用 JSONObject 和 JSON 即可
Redis 底层数据结构
Redis 底层数据结构Redis 的高性能并非来自单一结构,而是通过多种针对场景高度定制的数据结构实现。上层五种数据类型(String / List / Hash / Set / ZSet)只是抽象接口,真正的性能边界由底层结构决定。 SDS(Simple Dynamic String)基本原理SDS 是 Redis 自定义的字符串实现,替代 C 原生 char*。其核心是显式维护字符串长度与剩余空间。 典型结构: 12345struct sdshdr { int len; // 已用长度 int alloc; // 分配总长度 char buf[];} 核心特点 O(1) 获取长度(避免 strlen) 支持二进制数据(不依赖 \0作为字符串的结尾) 预分配与惰性释放,减少内存重分配 避免缓冲区溢出 使用到的数据类型 String 所有 key Hash / List / Set / ZSet 内部元素 时间复杂度 获取长度:O(1) 追加:均摊 O(1) 修改:O(n) 链表(Linked...
Redis中Lua脚本的使用
Redis中Lua脚本的使用参考资料:cnblogs.com、Redis Lua 脚本介绍Redis 从 2.6 版本开始内置 Lua 脚本执行引擎,用于在服务器端组合多个 Redis 命令为一个原子操作,从而避免客户端多次往返网络、保证复杂逻辑的原子性执行。Lua 是一种轻量级、可嵌入的脚本语言,非常适合嵌入 Redis 这种高性能内存数据库中。 Lua 在 Redis 中执行时无需额外配置,只需通过命令将脚本发送到 Redis。脚本由 Redis Server 内的 Lua 5.1 解释器运行。Redis 脚本将命令组合在一起,避免多次网络往返,并在执行期间阻塞其他客户端命令,确保原子性。脚本执行结果可返回值给客户端。 Lua 脚本基本语法Lua 语法简单,适合嵌入式脚本应用。基本数据类型包括:nil(空)、boolean(布尔值)、number(数字)、string(字符串)和 table(表)。table 是 Lua 的核心数据结构,它既可表现为数组也可表现为字典。 变量声明: 12name = 'example' --...
RedisTemplate & StringRedisTemplate 使用指南
RedisTemplate & StringRedisTemplate 使用指南前言由于对于 Redis 始终停留在理论阶段——懂数据结构类型、数据结构底层实现、缓存击穿、缓存穿透、缓存雪崩,还有各种防xxx的方案,但是貌似都停留在学习上、代码阅读上,现在重新补充一下代码实现的细节上。 项目中很多地方使用了 StringRedisTemplate,其实是继承自 RedisTemplate 的。 然后就去搜 RedisTemplate 的 API、搜如何使用,挑选了7-8篇博客结合 ai 整理知识点如下: 从导入依赖开始为什么是从导入依赖开始呢?主要是这个过程引发了我的疑问: 看到有一篇博客使用如下pom依赖: 12345<!--Redis--><dependency> <groupId>org.springframework.boot</groupId> ...
nvm使用
nvm:Node 版本管理工具nvm 是什么nvm(Node Version Manager)是一款用于管理 Node.js 版本的工具。它允许在同一台机器上安装多个 Node 版本,并可随时切换。避免因不同项目依赖不同 Node 版本而导致冲突。 核心功能 安装多个 Node 版本 快速切换当前使用的版本 卸载不再需要的版本 隔离不同 Node 版本的全局包环境 简单原理nvm 使用目录隔离不同 Node 版本,并在你切换版本时动态修改系统 PATH 指向对应版本。无需重新安装系统级 Node,也不会破坏现有项目。 Windows 平台的 nvm(nvm-windows)Windows 不支持官方 Linux nvm 工具,需要使用专门为 Windows 编写的版本:nvm-windows(又叫 nvm for Windows)这是一个独立实现,与 Linux/macOS 的原版 nvm 不同,但功能一致。 Windows 安装步骤卸载旧版 Node(若已安装)以前直接从官网安装过 Node,需要先卸载:控制面板 → 程序 → 卸载...










