📄🦌🙌🐟🏖️
日志记录
Where there is a where there is a way
随机文章
按住 Shift 横向滚动
热门文章
按住 Shift 横向滚动
Redis持久化

Redis持久化

Redis提供两种持久化方式:**RDB**和**AOF**。RDB是数据快照,将内存数据保存到磁盘文件(.rdb),可通过`save`(阻塞主进程)或`bgsave`(fork子进程,利用写时复制技术)执行。RDB文件体积小、恢复快,但两次备份间可能丢失数据。AOF记录每次写命令,默认关闭,通过`appendfsync`配置刷盘策略(always/everysec/no),数据完整性更高,但文件较大、恢复较慢。AOF支持重写(`bgrewriteaof`)以缩减体积。两者对比:RDB适合容忍分钟级丢失、追求快速启动的场景;AOF适合对数据安全性要求高的场景。实际应用中常结合使用。

基于Canal实现缓存同步

基于Canal实现缓存同步

本文介绍了三种缓存数据同步策略:设置有效期(简单但有时效差)、同步双写(强一致但耦合高)、异步通知(低耦合但中间状态不一致)。重点介绍了阿里巴巴开源项目Canal,它基于MySQL主从同步原理,通过解析数据库增量日志实现增量数据订阅与消费。文章详细说明了Canal的安装步骤:开启MySQL主从功能、设置用户权限、创建Docker网络、安装Canal容器并配置监听规则。Canal适用于需要异步同步数据且对时效性要求一般的场景,支持多服务同时监听。

OpenResty

OpenResty

本文介绍了OpenResty的安装与使用流程,重点实现一个多级缓存网关。首先通过yum安装OpenResty及opm工具,配置环境变量。然后配置nginx加载Lua模块,编写Lua脚本处理请求并返回JSON。接着封装HTTP查询函数,实现对Tomcat集群的负载均衡查询。为提高性能,集成Redis缓存预热和查询,并利用Nginx的共享字典实现本地缓存。最终流程为:请求先查本地缓存,未命中则查Redis,再未命中则查Tomcat,查询成功后回写缓存并设置有效期。整个方案有效降低了后端压力,提高了响应速度。

Lua语法

Lua语法

Lua是一种轻量级脚本语言。快速入门:创建`hello.lua`文件,写入`print("Hello World!")`,运行`lua hello.lua`即输出。数据类型包括nil、boolean、number、string、function、table(关联数组,索引可为数字/字符串)。变量用`local`声明,无需指定类型。字符串用`..`拼接。循环:`ipairs`遍历数组(下标从1开始),`pairs`遍历table(类似map)。函数用`function 函数名(参数) ... end`定义。条件控制:`if (表达式) then ... else ... end`,逻辑运算符用`and`、`or`、`not`。Table通过`{}`创建,访问可用`arr[1]`或`map['name']`/`map.name`。

缓存问题

缓存问题

本文介绍了缓存系统的四大核心问题及解决方案: 1. **缓存一致性**:企业最常用Cache Aside模式,推荐“先更新数据库再删除缓存”,其异常概率极低,配合缓存过期时间保证最终一致性。 2. **缓存穿透**:访问不存在的数据导致持续穿透数据库。解决方式包括缓存空值(简单)和布隆过滤器(高效低内存,存在极小误判率)。 3. **缓存雪崩**:大量缓存同时失效或Redis宕机。可添加TTL随机值、使用集群、限流降级、引入多级缓存等。 4. **缓存击穿**:热点Key失效瞬间高并发冲击数据库。采用互斥锁或逻辑过期(热点Key不设过期时间,活动后手动删除)避免并发重建。 缓存设计本质是在性能与强一致性之间权衡,通过上述策略将不一致概率降到极低,并利用过期兜底。

Redis内存回收

Redis内存回收

Redis基于内存存储,性能强但内存有限。通过设置`maxmemory`限制内存上限,并通过两种方式回收内存:**过期Key处理**(惰性删除:访问时检查过期;周期删除:定时任务SLOW模式与事件循环FAST模式抽样删除)和**内存淘汰策略**(内存满时主动淘汰,支持noeviction、LRU、LFU、Random等8种策略)。LRU基于最近访问时间,LFU基于逻辑访问频率(通过概率计算和衰减实现)。默认策略为noeviction,即拒绝写入。

Redis通信协议

Redis通信协议

本文介绍了Redis通信协议RESP(Redis Serialization Protocol),用于规范客户端与服务端之间的命令及响应格式。RESP通过首字节字符区分数据类型,包括:`+`(单行字符串)、`-`(错误信息)、`:`(数值)、`$`(多行字符串,支持二进制安全,最大512MB)、`*`(数组)。目前默认使用RESP2协议。此外,文章提供了Java模拟Redis客户端的代码示例,通过Socket连接Redis服务器,使用RESP协议发送认证和设置键值对命令,并解析响应结果(如单行字符串、数字、数组等),展示了协议的实际应用。

Redis网络模型

Redis网络模型

文章详细介绍了用户空间与内核空间、五种IO模型(阻塞、非阻塞、IO多路复用、信号驱动、异步),重点分析了IO多路复用的select/poll/epoll原理及事件通知机制。核心部分指出Redis核心命令处理为单线程,但v4.0引入多线程处理耗时任务,v6.0在网络模型中引入多线程;选择单线程的原因包括纯内存操作、性能瓶颈在网络而非执行速度、避免上下文切换和线程安全问题。最后简述Redis基于IO多路复用(AE事件库)实现单线程网络模型的流程。

Redis数据结构

Redis数据结构

本文介绍了Redis中几种核心底层数据结构:**SDS**(简单动态字符串)解决C字符串安全问题;**IntSet**(整数集合)支持类型升级以节约内存;**Dict**(字典)采用渐进式rehash实现高效扩容与收缩;**ZipList**(压缩列表)节省内存但存在连锁更新风险;**QuickList**(快速列表)由多个ZipList组成,控制内存并支持压缩;**SkipList**(跳表)支持有序查询且实现简单。同时,Redis通过**RedisObject**对象头封装不同编码(如RAW、EMBSTR、INT)以适配多种数据类型。五种常见类型(String、List、Set、ZSet、Hash)各有其底层编码策略,如String根据长度选择int/embstr/raw,ZSet结合跳表和哈希表,并在小数据时使用ZipList以节省内存。

集群优化

集群优化

Redis集群虽具备高可用与自动故障恢复能力,但使用不当会引发六大问题:集群完整性(如网络分区导致数据不一致)、带宽压力(节点间频繁ping携带插槽和状态信息,节点越多带宽消耗越大)、数据倾斜(BigKey或Hash_tag使部分节点负载过高)、客户端性能损耗(节点选择、插槽判断等增加开销)、命令兼容性(Mset/Mget需同一插槽)、Lua及事务受限(集群下无法执行多命令)。解决带宽问题需控制节点数(少于1000)、避免单机多实例、合理配置`cluster-node-timeout`。通常单体Redis(主从)已能达万级QPS且高可用,若业务可满足,应优先选择主从而非集群,以减少复杂度。

© 2026 日志记录