当前位置: 首页 > news >正文

Redis使用的常见问题及初步认识

点关注不迷路哟。你的点赞、收藏,一键三连,是我持续更新的动力哟!!!

主页:

一位搞嵌入式的 genius-CSDN博客一位搞嵌入式的 genius擅长前后端项目开发,嵌入式自学专栏,微机原理与接口技术,等方面的知识,一位搞嵌入式的 genius关注matlab,论文阅读,前端框架,stm32,c++,node.js,c语言,智能家居,vue.js,html,npm,单片机领域. https://blog.csdn.net/m0_73589512?spm=1000.2115.3001.5343

目录

Redis(缓存)

1. 问题

2. 问题的错误分析

3. 解决方案(Windows系统)

步骤 1:创建有写入权限的持久化目录

步骤 2:修改 Redis 配置文件

步骤 3:重新注册并启动 Redis 服务

步骤 4:验证是否解决问题

关键说明

4. 大家可能会有的疑问

4.1 经过以上操作之后我原路径下的redis服务还能正常启动吗?

4.2 可能会遇到没有权限更改配置文件的问题

4.2.1 场景 1:通过 “以管理员身份运行编辑器” 修改文件

4.2.2 场景 2:复制文件到其他目录修改后替换

4.2.3 场景 3:修改文件权限后直接编辑

Redis 全景指南

1. 诞生与定位

2. 数据结构总览

3. 线程模型与性能

4. 持久化机制

5. 高可用与分布式

6. 事务、原子性与 Lua

7. 发布订阅与消息队列

8. 内存管理

9. 典型应用场景

10. 生态与周边

11. 安装与快速体验

12. 版本演进时间线

13. 性能调优与最佳实践

14. 扩展阅读


Redis(缓存)

1. 问题

[25240] 06 Aug 10:32:50.566 # Server started, Redis version 3.0.504
[25240] 06 Aug 10:32:50.566 * The server is now ready to accept connections on port 6379
[25240] 06 Aug 10:38:36.428 * 100 changes in 300 seconds. Saving...
[25240] 06 Aug 10:38:36.565 * Background saving started by pid 5940
[5940] 06 Aug 10:38:36.673 # Failed opening .rdb for saving: Permission denied
[5940] 06 Aug 10:38:36.675 # rdbSave failed in qfork: Permission denied
[25240] 06 Aug 10:38:36.777 # fork operation complete
[25240] 06 Aug 10:38:36.778 # Background saving error
[25240] 06 Aug 10:38:42.058 * 100 changes in 300 seconds. Saving...
[25240] 06 Aug 10:38:42.197 * Background saving started by pid 24696
[24696] 06 Aug 10:38:42.331 # Failed opening .rdb for saving: Permission denied
[24696] 06 Aug 10:38:42.333 # rdbSave failed in qfork: Permission denied
[25240] 06 Aug 10:38:42.409 # fork operation complete
[25240] 06 Aug 10:38:42.409 # Background saving error
[25240] 06 Aug 10:38:48.077 * 100 changes in 300 seconds. Saving...
[25240] 06 Aug 10:38:48.254 * Background saving started by pid 12896

2. 问题的错误分析

Redis 日志中反复出现 Failed opening .rdb for saving: Permission denied 错误,原因是 Redis 没有权限写入 RDB 持久化文件,导致数据无法正常持久化到磁盘。

3. 解决方案(Windows系统)

步骤 1:创建有写入权限的持久化目录

  1. D: 盘根目录(或非系统盘)新建一个文件夹,例如 D:\redis-data (避免使用 Program Files 等系统目录,这类目录默认权限严格)

  2. 右键 redis-data 文件夹 → 属性安全 标签页

  3. 点击 编辑 → 选择当前登录用户(如你的用户名)→ 勾选 写入 权限 → 点击 确定 保存

步骤 2:修改 Redis 配置文件

  1. 打开 D:\Program Files\redis 目录,找到并右键 redis.windows.conf → 用记事本(或 VS Code)打开

  2. Ctrl+F 搜索 dir(找到持久化目录配置): 原配置可能是 dir ./(表示当前目录,即 D:\Program Files\redis) 修改为:dir D:/redis-data(指向刚创建的目录,注意用 /\\

  3. 继续搜索 dbfilename,确认值为 dump.rdb(默认即可,无需修改)

  4. Ctrl+S 保存配置文件

步骤 3:重新注册并启动 Redis 服务

  1. 以管理员身份打开命令提示符(重要!否则可能无权限操作服务): 按下 Win+R → 输入 cmd → 右键 命令提示符以管理员身份运行

  2. 执行以下命令切换到 Redis 安装目录:

    cd /d D:\Program Files\redis
  3. 先卸载旧服务(如果之前注册过):

    redis-server --service-uninstall
  4. 用新配置文件重新注册服务:

    redis-server --service-install redis.windows.conf --service-name Redis
  5. 启动 Redis 服务:

    redis-server --service-start

步骤 4:验证是否解决问题

  1. 打开新的命令提示符,切换到 Redis 目录,连接客户端:

    cd /d D:\Program Files\redis
    redis-cli.exe
  2. 执行以下命令手动触发持久化:

    SAVE
  3. 检查 D:\redis-data 目录是否生成 dump.rdb 文件,且文件大小不为 0

    如下图所示:

  4. 查看 Redis 日志(可在服务属性中找到日志路径),确认不再出现 Permission denied 错误

关键说明

  • Program Files 目录默认受系统保护,Redis 在此目录下没有写入权限,导致无法生成 dump.rdb

  • 核心解决思路:将持久化目录迁移到非系统目录,并确保 Redis 有写入权限

  • 若后续仍报错,检查 D:\redis-data 文件夹的权限是否正确应用(可尝试给 Users 组也添加写入权限)

按以上步骤操作后,Redis 即可正常进行数据持久化。

4. 大家可能会有的疑问

4.1 经过以上操作之后我原路径下的redis服务还能正常启动吗?

答案当然是:可以的

一、原理层面:服务与配置的关联 服务注册与配置绑定 在步骤 3 中,执行 redis - server --service - install redis.windows.conf --service - name Redis 时,已明确将 redis.windows.conf(修改后指向 D:\redis - data 的配置文件)与服务绑定。 后续启动服务(redis - server --service - start)时,Redis 会优先加载绑定的配置文件,而非依赖原路径的默认配置。 原路径的作用 原路径 D:\Program Files\redis 仍作为 Redis 程序的安装目录,存放 redis - server.exe、redis - cli.exe 等可执行文件,服务启动时会从该目录加载程序,不影响服务启动本身。

二、实际验证方法 检查服务状态 打开 服务管理器(Win+R → 输入 services.msc),找到 Redis 服务: 状态应为 “正在运行” 可通过右键 → 属性 → 可执行文件路径,确认服务启动的是原路径下的 redis - server.exe,且加载的配置是 D:\Program Files\redis\redis.windows.conf。

三、测试数据持久化 按步骤 4 连接 redis - cli,执行 SET test_key "test_value" 和 SAVE 命令: 若 D:\redis - data\dump.rdb 生成且无报错,说明服务正常启动,持久化功能恢复。

四、模拟重启场景 执行 redis - server --service - stop 停止服务,再执行 redis - server --service - start 重启: 重启后用 redis - cli 执行 GET test_key,若能获取到值,说明服务启动正常且数据持久化有效。

五、特殊情况说明 若仍遇到问题,需排查:

  1. 配置文件是否正确加载: 服务注册命令中需明确指定 redis.windows.conf,否则可能默认加载旧配置(如 redis.windows - service.conf)。

  2. 权限继承问题: 若 D:\redis - data 是通过复制创建的,需重新确认权限(右键 → 安全 → 确保当前用户和 Redis 服务运行用户有写入权限)。

  3. 日志排查: 在服务属性中找到日志路径(或修改 redis.windows.conf 中的 logfile 配置指定日志文件),通过日志确认启动过程是否有异常。 简单来说:原路径的 Redis 程序可正常启动,只要配置文件正确指向新的持久化目录,服务就能在保留原程序路径的同时,解决权限问题。

4.2 可能会遇到没有权限更改配置文件的问题

4.2.1 场景 1:通过 “以管理员身份运行编辑器” 修改文件

关闭当前打开的文件 / 编辑器(若 redis.windows.conf 已被记事本等程序打开,需先关闭)。 找到你常用的编辑器(如记事本、VS Code、Notepad++): 右键编辑器图标 → 以管理员身份运行。 在管理员权限的编辑器中,通过 “文件 → 打开”,导航到 D:\Program Files\redis\redis.windows.conf 并修改。 保存文件:此时因编辑器以管理员身份运行,可直接覆盖原文件,不会提示权限不足。

4.2.2 场景 2:复制文件到其他目录修改后替换

复制文件到临时目录: 把 D:\Program Files\redis\redis.windows.conf 复制到桌面(或其他非系统保护目录,如 D:\temp)。 修改临时文件: 在桌面用普通编辑器打开复制的 redis.windows.conf,修改 dir 为 D:/redis-data 等有权限的路径。 替换原文件: 先删除(或备份)原路径下的 redis.windows.conf。 把修改后的文件从桌面复制回 D:\Program Files\redis 目录。 若仍提示权限不足,需在复制时点击 “继续”(或提供管理员权限)。

4.2.3 场景 3:修改文件权限后直接编辑

右键 redis.windows.conf 文件 → 属性 → 安全 → 编辑。 添加当前用户的 “完全控制” 权限: 在 “组或用户名” 中选择你的用户(或 Users 组)。 勾选 “完全控制” → 应用 → 确定。 重新尝试修改文件:此时因权限已开放,可直接用普通编辑器打开并保存。

Redis 全景指南

Redis(REmote DIctionary SErver)是一个开源的、基于内存的、键值型数据结构存储系统,可用作 数据库、缓存、消息代理和流处理引擎。 以“快”闻名,官方基准测试中,单机可轻松达到 10 万 QPS;同时提供丰富数据结构、高可用与分布式方案,是现代架构的“瑞士军刀”。


1. 诞生与定位

维度说明
作者Salvatore Sanfilippo(@antirez),2009 年开源
LicenseBSD 3-Clause,可闭源商用
核心定位内存优先 的高性能数据结构服务器
常见角色缓存、分布式锁、计数器、排行榜、消息队列、实时风控、地理位置、AI 特征存储 …

2. 数据结构总览

类型内部编码常用命令典型场景
StringSDS、int、embstrGET/SET/INCR/DECR缓存、计数器、分布式锁
Listziplist → quicklistLPUSH/RPOP/BLPOP消息队列、时间线
Setintset / dictSADD/SISMEMBER/SPOP去重、抽奖池
Sorted Setskiplist + dictZADD/ZRANGE/ZPOPMIN排行榜、延迟队列
Hashziplist / dictHSET/HGETALL对象缓存、购物车
BitmapString 位操作SETBIT/BITCOUNT日活、签到
HyperLogLogHLL 稀疏/稠密编码PFADD/PFCOUNTUV 统计
GeoSorted Set + GeoHashGEOADD/GEORADIUS附近的人/车/店
Streamradix tree + listpackXADD/XREADGROUPKafka-like 消息流
BitField位域指令BITFIELD协议解析、状态位
Module可插拔扩展RedisSearch / RedisJSON / RedisBloom …全文检索、JSON、布隆过滤器

3. 线程模型与性能

  • 单线程处理命令: 网络 IO 与命令执行由 1 个主线程完成,避免锁竞争,保证原子性与可预测延迟。

  • 后台线程: AOF fsync、lazy-free、关闭文件描述符等操作异步化。

  • I/O 多路复用: 基于 epoll/kqueue/select,单线程可处理数万并发连接。

  • 性能基线(官方基准,单机):

    • 10 万 GET/SET QPS(value 256B)

    • 100 万 ops 在 pipeline 下

  • 横向扩展: 通过分片(Redis Cluster)或代理(Twemproxy、Codis、Redis-Sentinel)水平扩展。


4. 持久化机制

方式原理优点缺点适用
RDB定时 fork 子进程生成二进制快照恢复极快、文件紧凑可能丢失分钟级数据冷备、灾难恢复
AOF追加写命令日志数据更完整、秒级丢失文件大、恢复慢主备、实时性高
混合RDB + AOF(Redis 4.0+)启动快且数据全配置略复杂生产推荐

5. 高可用与分布式

  1. 主从复制(Replication)

    • 异步或半同步(WAIT 命令)。

    • 级联拓扑:主 → 从 → 从。

  2. 哨兵(Sentinel)

    • 监控、自动故障转移、客户端服务发现。

  3. Redis Cluster

    • 16384 slots 哈希槽分片,无中心 Gossip 协议。

    • 主从 + 哨兵 混合部署提升可用性。

  4. 客户端分片

    • Twemproxy、Codis、Redis-Proxy、云厂商 Proxy。


6. 事务、原子性与 Lua

  • MULTI/EXEC 事务:命令排队一次性顺序执行(无回滚)。

  • WATCH 乐观锁:监视 Key 变化,冲突则放弃事务。

  • Lua 脚本: EVAL/EVALSHA,脚本在单线程原子执行,实现复杂业务无竞态。


7. 发布订阅与消息队列

  • Pub/Sub: SUBSCRIBE/PUBLISH,轻量级消息广播,无持久化。

  • Stream: Kafka-like 持久化消息流,支持消费组、ACK、重放。

  • List + BRPOPLPUSH: 简易可靠队列(RPOPLPUSH 安全转移)。


8. 内存管理

  • 淘汰策略(maxmemory-policy): noeviction、allkeys-lru、volatile-lfu、allkeys-random…

  • 内存碎片率info memory 查看 mem_fragmentation_ratio,重启或 MEMORY PURGE 整理。

  • 内存压缩: 小数据用 ziplist/intset,节省 5-10 倍内存。


9. 典型应用场景

场景数据结构设计要点
热点缓存String + TTL雪崩、穿透、击穿防护
分布式锁SET key value NX PXRedlock、看门狗续期
计数器INCR单线程原子、防并发
排行榜Sorted SetZINCRBY 更新、ZRANGE 查询
购物车HashHINCRBY 商品数量
延迟队列Sorted Set 分值=时间戳ZPOPMIN + 轮询
实时风控Stream + Lua滑动窗口规则计算
附近的人GeoGEORADIUS 10km
用户签到BitmapSETBIT offset 1
UV 统计HyperLogLog0.81% 误差,省 1000 倍内存

10. 生态与周边

组件功能
RedissonJava 客户端 + 分布式锁、限流、队列
Lettuce响应式 Java 客户端
Jedis轻量同步 Java 客户端
ioredis高性能 Node.js 客户端
redis-pyPython 官方推荐
RedisInsight官方可视化工具
Redis Modules
  • RedisSearch:全文检索、聚合

  • RedisJSON:原生 JSON 文档

  • RedisTimeSeries:时序数据

  • RedisBloom:布隆/布谷过滤器 | | 云托管 |

  • AWS ElastiCache、Azure Cache、Alibaba Cloud Tair、腾讯云 CRS、UCloud Redis |


11. 安装与快速体验

# macOS
brew install redis
redis-server --port 6379 &
​
# Docker
docker run -d -p 6379:6379 redis:7-alpine redis-server --appendonly yes
​
# CLI
redis-cli ping  # PONG
redis-cli set foo bar
redis-cli get foo

12. 版本演进时间线

版本时间关键特性
3.02015官方 Cluster
4.02017混合持久化、模块系统、PSYNC2
5.02018Stream 数据结构、Redis-cli 集群支持
6.02020I/O 多线程(网络)、ACL、SSL
7.02022Functions、Sharded Pub/Sub、AOF 多文件
7.22023大幅优化内存、ACL LOG、Redis Functions 增强

13. 性能调优与最佳实践

  • 关闭 THPecho never > /sys/kernel/mm/transparent_hugepage/enabled

  • 最大连接ulimit -n 65535

  • 慢查询slowlog-log-slower-than 10000 微秒阈值。

  • Pipeline:批量写入减少 RTT,提升 5-10 倍吞吐。

  • 避免 big key:单个 value 建议 < 1 MB,List/Set 建议 < 8192 元素。

  • 只读副本:从节点开启 replica-read-only yes,分担读流量。

  • 监控指标used_memory_rssconnected_clientsinstantaneous_ops/seckeyspace_misses


14. 扩展阅读

  • 官方文档:Docs

  • 源码之旅:https://github.com/redis/redis

  • 《Redis 设计与实现》— 黄健宏

  • 《Redis 深度历险》— 钱文品

  • RedisConf 历年视频:https://www.youtube.com/c/Redisinc


Redis 远不止“缓存”二字。从原子计数到 AI 特征存储,从消息队列到实时风控,它已成为现代分布式架构的“万能胶”。掌握 Redis,就是掌握了高性能系统的关键钥匙。

http://www.lryc.cn/news/612412.html

相关文章:

  • JDK17新特性全解析
  • TFTP: Linux 系统安装 TFTP,文件系统启动后TFTP使用
  • win服务器系统10060问题解决
  • 【CSS】动态修改浏览器滚动条宽度
  • 楼宇自控系统对建筑碳中和目标的实现具重要价值
  • mysql死锁的常用解决办法
  • Java 里的Tree初认识
  • 【概念学习】什么是深度学习
  • 12、Docker Compose 安装 Redis
  • Effective C++ 条款25:考虑写出一个不抛异常的swap函数
  • 【前端开发】五. ES5和ES6对比
  • imx6ull-驱动开发篇11——gpio子系统
  • 常用排序方法
  • 排序算法归并排序
  • 单变量单步时序预测:CNN-BiGRU卷积神经网络结合双向门控循环单元
  • 202506 电子学会青少年等级考试机器人六级实际操作真题
  • 基于RPR模型的机械臂手写器simulink建模与仿真
  • Qt Frameless Widget跨平台无边框窗口
  • 机器学习-KNN​​
  • 云平台托管集群:EKS、GKE、AKS 深度解析与选型指南-第四章
  • iT 运维: WindoWs CMD 命令表
  • Flutter开发 Image组件使用示例
  • <form> + <iframe> 方式下载大文件的机制
  • 基于Github Pages搭建个人博客站点:hexo环境搭建、本地预览与发布
  • 当前就业形势下,软件测试工程师职业发展与自我提升的必要性
  • AI 软件工程开发 AI 算法 架构与业务
  • [FBCTF2019]RCEService
  • Kafka-exporter采集参数调整方案
  • android NDK 报错日志解读和还原报错方法名
  • 数语科技登陆华为云商店,助力企业释放数据潜能