Redis (一)

Redis 作为高性能内存数据库,在后端开发中占据重要地位,无论是缓存、分布式锁还是消息队列,都离不开对其核心配置、持久化、事务、发布订阅以及数据淘汰策略的掌握。本文将从redis.conf配置文件入手,逐步解析 Redis 持久化、事务、发布订阅、数据删除与淘汰策略,覆盖面试高频考点与生产实战要点。

一、redis.conf 核心配置详解

Redis 配置文件默认名为redis.conf(Windows 系统为redis.windows.conf),存放于安装目录下,所有核心行为均可通过此文件配置。

1. units 单位配置

配置文件开头定义了基础度量单位,仅支持 bytes,不支持 bit ,且对大小写不敏感,BYTES/Bytes/bytes效果完全一致。

2. INCLUDES 包含配置

支持通过include指令引入其他.conf配置文件,实现配置拆分与复用,便于多实例统一管理。

3. NETWORK 网络配置

网络配置直接决定 Redis 的访问权限与连接特性,是生产环境安全配置的核心:

  • bind 0.0.0.0:绑定服务器所有 IP,允许外部设备访问 Redis;
  • 保护模式:默认开启,限制外部访问;
  • port 6379:Redis 默认监听端口,可自定义修改;
  • 超时配置:客户端闲置指定时长后关闭连接,设为 0 则关闭此功能。

4. 日志配置

日志级别与输出路径直接影响问题排查效率,核心配置如下:

复制代码
loglevel notice
logfile ""
databases 16
always-show-logo yes
  • 日志级别:debug(开发调试)、verbose(详细信息)、notice(生产推荐)、warning(仅关键错误);
  • logfile:指定日志文件路径,空则输出到控制台;
  • databases 16:默认数据库数量为 16;
  • always-show-logo:是否始终显示 Redis 启动 LOGO。

5. 持久化规则配置

Redis 基于内存存储,断电即失,持久化可将内存数据落地磁盘,默认触发规则:

复制代码
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dir ./
  • save 时间 次数:规定时间内触发指定次数修改则持久化;
  • stop-writes-on-bgsave-error:持久化出错是否停止写入;
  • rdbcompression:是否压缩 RDB 文件;
  • rdbchecksum:开启 RDB 文件校验;
  • dir:持久化文件保存目录。

6. SECURITY 安全配置

默认无密码,可通过requirepass设置 Redis 连接密码,提升安全性。

7. CLIENTS 客户端限制

控制 Redis 最大连接数与内存上限,避免资源耗尽:

复制代码
maxclients 10000
maxmemory <bytes>
maxmemory-policy noeviction
  • maxclients:最大客户端连接数,超限则拒绝新连接;
  • maxmemory:Redis 最大可用内存;
  • maxmemory-policy:内存达上限后的淘汰策略。

8. AOF 配置

AOF 持久化核心配置,默认关闭:

复制代码
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
  • appendonly:是否开启 AOF;
  • appendfilename:AOF 文件名;
  • appendfsync:同步策略,分always(每次修改同步)、everysec(每秒同步)、no(系统自动同步)。

9. 配置修改方式

  1. 文件修改 :直接编辑redis.conf,重启后生效;

  2. 命令修改 :运行时动态调整,重启失效

    复制代码
    # 获取配置
    CONFIG GET loglevel
    # 修改配置
    CONFIG SET loglevel "notice"

二、Redis 持久化机制

持久化是 Redis 数据安全的核心,避免内存数据因宕机丢失,提供RDBAOF两种方案,可单独或混合使用。

1. 持久化简介

Redis 是内存数据库,数据默认存于内存,持久化即把内存数据写入磁盘。重启时通过持久化文件恢复数据,混合持久化下优先使用 AOF 恢复,因其数据完整性更高。

2. RDB 持久化

概念

RDB(Redis DataBase)即快照持久化,指定时间间隔内将内存数据集生成快照(dump.rdb),恢复时直接加载快照文件。

工作原理

  1. Redis 通过fork创建子进程,父进程继续处理客户端请求;
  2. 子进程遍历内存数据,序列化写入临时 RDB 文件;
  3. 利用 Linux COW(写时复制) 机制,父进程修改数据时复制内存页,不影响子进程快照;
  4. 完成后替换旧 RDB 文件,子进程退出。

触发机制

  • 满足save配置规则自动触发;
  • 执行flushall清空数据库触发;
  • 正常退出 Redis 自动生成。

优缺点

  • 优点:适合大规模数据恢复,恢复速度快,对性能影响小;
  • 缺点:宕机易丢失最后一次快照后的数据,fork 子进程占用内存。

3. AOF 持久化

概念

AOF(Append Only File)以日志形式记录所有写命令,重启时回放命令重建数据,默认关闭。

工作原理

  1. 父进程接收写命令,追加到 AOF 缓冲区;
  2. 子进程重写 AOF 文件,压缩日志体积;
  3. 重写完成后替换旧文件,保证数据连续性。

AOF 文件修复

AOF 文件损坏时,使用工具修复:

复制代码
redis-check-aof --fix appendonly.aof

优缺点

  • 优点:数据完整性高,每秒同步仅丢失 1 秒数据;
  • 缺点:文件体积大,恢复速度慢,运行效率低于 RDB。

4. 持久化方案选择

  • 追求数据安全:同时开启 RDB+AOF;
  • 允许少量数据丢失、追求性能:仅用 RDB;
  • 仅用 AOF 不推荐,RDB 更适合备份与快速恢复。

三、Redis 事务机制

Redis 事务与关系型数据库事务不同,单命令保证原子性,事务不保证原子性,核心是批量命令序列化执行。

1. 事务核心特性

  • 本质:一组命令的集合,序列化顺序执行;
  • 无隔离级别概念,命令执行前存入队列缓存;
  • 单个命令失败不影响其他命令执行,不支持回滚

2. 事务三大阶段

  1. 开启事务(MULTI);
  2. 命令入队;
  3. 执行事务(EXEC)或取消事务(DISCARD)。

3. 事务操作示例

正常执行

复制代码
MULTI
set k1 v1
set k2 v2
get k1
EXEC

取消事务

复制代码
MULTI
set k1 v1
DISCARD

4. 事务错误类型

  1. 语法错误 :事务内命令存在语法问题,EXEC后所有命令均不执行;
  2. 逻辑错误:命令语法正确但执行失败(如对字符串自增),仅错误命令失败,其他命令正常执行。

四、Redis 发布订阅

发布订阅(pub/sub)是 Redis 的消息通信模式,实现生产者与消费者解耦,类似公众号关注机制。

1. 核心原理

Redis 服务器维护频道字典,键为频道名,值为订阅客户端链表。发布消息时,遍历对应频道的客户端,推送消息。

2. 核心命令

  • SUBSCRIBE 频道名:订阅频道;
  • PUBLISH 频道名 消息:向频道发布消息;
  • PSUBSCRIBE 模式:模式匹配订阅;
  • PUBSUB channels:查看活跃频道。

3. 优缺点与应用场景

  • 优点:实现简单,轻量消息通信;
  • 缺点:消费者离线会丢失消息,消息积压易导致 Redis 崩溃;
  • 场景:简单聊天室、消息通知,复杂场景优先使用 MQ 中间件。

五、Redis 数据删除与淘汰策略

Redis 内存资源有限,需通过删除策略清理过期数据,淘汰策略释放内存空间。

1. 数据过期状态

通过TTL指令查看数据状态:

  • 正数:剩余存活时间;
  • -1:永久有效;
  • -2:已过期 / 未定义。

2. 过期数据删除策略

定时删除

  • 原理:过期立即删除,创建定时器;
  • 优点:节约内存;
  • 缺点:CPU 占用高,影响响应性能。

惰性删除

  • 原理:访问数据时判断是否过期,过期则删除;
  • 优点:节省 CPU;
  • 缺点:内存占用高,长期不访问的数据无法清理。

定期删除

  • 原理:每秒轮询数据库,随机抽取 key 检测过期,按比例控制删除频率;
  • 优点:平衡 CPU 与内存压力,可配置频率。

3. 内存淘汰策略

内存不足时,Redis 主动清理数据,分三类:

  1. 易失数据筛选

    • volatile-lru:淘汰最近最少使用的过期 key;
    • volatile-lfu:淘汰使用次数最少的过期 key;
    • volatile-ttl:淘汰即将过期的 key;
    • volatile-random:随机淘汰过期 key。
  2. 全库数据筛选

    • allkeys-lru:全库淘汰最少使用 key;
    • allkeys-lfu:全库淘汰使用次数最少 key;
    • allkeys-random:全库随机淘汰。
  3. 禁止淘汰

    • noeviction:默认策略,禁止淘汰,写入报错引发 OOM。

策略配置

复制代码
maxmemory-policy noeviction

六、总结

  1. redis.conf是 Redis 行为核心,需掌握网络、安全、持久化关键配置;
  2. 持久化优先混合使用,RDB 适合备份,AOF 保证数据安全;
  3. Redis 事务不支持原子性与回滚,仅实现批量命令序列化;
  4. 发布订阅适用于简单场景,复杂业务改用专业 MQ;
  5. 过期删除与内存淘汰需结合业务选择,避免内存溢出与数据丢失。
相关推荐
字符串str2 小时前
sql的基本技术栈
数据库·sql·oracle
秦jh_2 小时前
【Redis】客户端使用
数据库·redis·缓存
剑之所向2 小时前
DataEase 做大屏,只认 2 种 SQL 格式
数据库·sql·正则表达式
我真会写代码2 小时前
Redis核心特性详解:事务、发布订阅与数据删除淘汰策略
java·数据库·redis
TDengine (老段)3 小时前
TDengine IDMP 工业数据建模 —— 数据标准化
大数据·数据库·物联网·ai·时序数据库·tdengine·涛思数据
IT 行者3 小时前
LangChain4j 集成 Redis 向量存储:我踩过的坑和选型建议
java·人工智能·redis·后端
wenlonglanying3 小时前
nginx 代理 redis
运维·redis·nginx
羊小蜜.3 小时前
Mysql 01:基础查询(SELECT)全解——从单表到多字段的完整语法
数据库·mysql·查询
猿小喵3 小时前
记录一次从库并行回放出现死锁的问题
数据库·mysql·tdsql