news 2026/9/9 8:58:04

Redis入门到生产:安装配置、核心参数与安全实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Redis入门到生产:安装配置、核心参数与安全实践

去年我接手了一个订单系统的性能优化,MySQL的CPU在高峰期直接冲到90%,热点商品的库存接口每秒被打几百次。临时方案是给Redis加了一层缓存,用INCRBY命令做库存扣减,系统才勉强顶住。那以后我几乎每天都在和Redis打交道,在安装、配置上也踩了不少坑。这篇就从入门到精通的第一个台阶讲透:Redis到底是个什么东西、怎么装、装完之后配置文件里那些关键项怎么填。

这一篇的定位是零基础可上手的实操文,不扯源码,不堆概念。目标就三个:搞懂Redis的核心模型,在一台干净机器上把它装起来并确认能跑通,再把redis.conf里影响生产的关键项逐行讲清楚。如果你已经能在本地跑起来Redis,可以直接跳到第3章以后的内容,重点看配置和安全加固。

1. 先搞明白Redis是干什么的,再决定要不要学

1.1 一句话定位Redis:它不只是“缓存”

Redis的官方全称是REmote DIctionary Server,直译过来是“远程字典服务”。命名虽然拗口,但信息量很大:远程意味着它是独立的网络服务,字典意味着它用key-value结构组织数据。

很多人一提到Redis就说“缓存”,这句话没问题,但如果只把它当缓存看,格局就小了。它本质上是一个跑在内存里的键值数据库,数据操作基于内存完成,所以延迟极低;同时它又能通过主从复制、哨兵和集群把可用性拉高。这也是为什么现在几乎所有后端系统都会出现Redis的身影——从最简单的页面缓存,到分布式锁、榜单统计、消息队列,它都能干。

我去带团队面试的时候经常问一个题:为什么Redis单线程还能这么快?很多人只会背“因为数据在内存”,这不够。真正的原因有三层:一是内存访问本身就是纳秒级,没有磁盘IO的瓶颈;二是单线程模型避开了多线程下锁竞争和上下文切换的开销;三是它用I/O多路复用机制去管理大量客户端连接,比如Linux上的epoll可以同时监听几千上万个连接。数据在内存、线程模型简洁、网络模型高效,这三件事加在一起,才让Redis实现了单机十万级甚至更高的QPS。

1.2 这些业务场景里,Redis其实早就参与了

很多项目技术选型时会把Redis拉进来,不是跟风,是确实有硬需求。我把自己这几个常见使用场景列一下,读完你就知道它解决的到底是什么问题:

  • 热点数据缓存:像商品详情、登录用户信息这种读多写少的数据,放进Redis后,数据库的压力能降一个数量级。内存的操作速度比磁盘快几个量级,命中缓存后响应时间能压到毫秒级。
  • 分布式锁:多个实例同时操作同一个库存或者账户余额,必须有个公共的地方来做互斥。Redis里用SETNX加过期时间,就能实现一个基础但可用的分布式锁,这是单机锁解决不了的问题。
  • 排行榜与计数:用Zset(有序集合)维护热度排行、成绩排行,用INCR/DECR维护阅读数、点赞数,都是Redis的典型用法。数据库里COUNT(*)一多就容易卡,Redis的原子自增则非常轻。
  • 会话共享和临时令牌:当你部署了多个Web实例,用户登录状态不能分别存到各自的服务器内存里,Redis把Session或Token集中存下来就成了标准做法。
  • 简单的消息队列:用List结构做LPUSH/BRPOP,或者用Stream做延迟队列和消费组。它的可靠性和完整消息队列没得比,但应对轻量级的异步解耦任务很顺手。

这里面随便挑一个场景,都够支撑你学习Redis的动机。而且这些话题,面试的时候也是被问得最密的一块,所以这一篇虽然从安装配置讲起,其实是在为后面的数据结构、性能优化、分布式场景打地基。

1.3 和 MySQL、Memcached 放在一起看差别

很多人一开始分不清Redis和MySQL的区别,甚至有人问“有MySQL了为什么还要Redis”。这俩不是一个阵营的东西:MySQL是持久化的关系型数据库,适合存有关系、需要事务保障、需要复杂查询的数据;Redis是内存KV存储,适合存访问频率极高、不需要复杂关联查询的临时或热点数据。它俩是协作关系,不是替代关系。

另一个常被拿来和Redis比较的是Memcached。Memcached出现更早,主打纯KV缓存,但数据结构只有字符串一种,不支持持久化和主从复制。Redis出现后,很多原本用Memcached的团队直接迁移过来了,就是因为Redis支持更丰富的数据结构、有持久化能力,还自带高可用方案。

这里我放一个简单对比表格,比较直观:

维度MySQLRedisMemcached
存储介质磁盘为主内存为主内存为主
数据模型关系表key-value,支持多种结构纯字符串key-value
数据持久化完整事务与落盘RDB/AOF可选不持久化
典型延迟毫秒级甚至更高亚毫秒级亚毫秒级
适用场景企业核心业务数据缓存、锁、排行榜、会话极简缓存

把这三者放在一起看就能明白一个道理:技术选型不是越新越好,而是匹配场景才最好。Redis的定位就是“让访问频率最高的那部分数据,离CPU更近一点”。

2. 三次安装实操模式:Linux编译、macOS包管理器、Windows别硬刚

2.1 Linux源码编译安装:生产环境的第一选择

绝大多数生产服务器是Linux,所以源码编译安装是我认为必须掌握的一条路。虽然发行版仓库里往往也有Redis包,比如Ubuntu的apt install redis-server,但版本经常滞后,而且没法按自己的需求调整编译参数。生产环境建议直接从官方源码编译指定版本,可控性最强。

我以Redis 7.2.4为例,在CentOS 7/Ubuntu 22.04上都实测过这套流程。编译前置条件是需要gcc和make等基础工具:

# CentOS / RHEL 系 yum -y install gcc gcc-c++ make tcl # Debian / Ubuntu 系 apt update apt install -y build-essential tcl

然后下载源码并编译:

wget https://download.redis.io/releases/redis-7.2.4.tar.gz tar xzf redis-7.2.4.tar.gz cd redis-7.2.4 make

编译完成后,推荐用PREFIX方式安装到独立目录,避免零零散散埋进/usr/local/bin里看不清楚:

make install PREFIX=/usr/local/redis

装完验证一下版本,能看到版本号就说明编译链没问题:

/usr/local/redis/bin/redis-server --version

这里有个新手极易遇到的报错:编译到一半出现zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory。不要慌,这是Redis默认使用自己的内存分配器jemalloc,但在某些Linux环境下和系统库冲突导致的。解决办法是在make时指定用libc分配器:

make MALLOC=libc

如果之前已经make到一半失败了,记得先make distclean清掉中间文件再重新编,否则可能还是同一套旧缓存。

编译安装的另一个好处是,你可以用prefix指定安装路径,后面在systemd服务文件里引用绝对路径,维护起来非常清晰。如果你自己管理服务器,这一步值得耐心走完。

2.2 macOS:Homebrew 一条命令就够了

在macOS开发机上我基本不编译,直接用Homebrew。原因是本机环境复杂,各种库容易打架,而Homebrew会把Redis的依赖、配置文件路径、启动脚本都安排得明明白白,适合把精力放在业务上。

安装命令:

brew install redis

安装完成后可以用临时前台方式启动验证:

redis-server

跑起来后另开一个终端窗口执行:

redis-cli ping

会看到PONG。如果想让Redis以后跟着系统自启,用:

brew services start redis

这样哪怕你电脑重启了,Redis也会自动拉起来。开发机上的数据恢复能力和性能配置都不需要太较真,关键是够顺手。

2.3 Windows:别再硬找官方安装包,走 WSL 或 Docker

这是我在各种技术群里被问得最多的话题之一:“Redis官网怎么没有Windows安装包?”

确实没有。Redis官方不提供Windows原生版本。以前微软维护过一个Redis 3.0的移植版,但版本太老,功能落后,官方也停止了维护。现在再往新项目里塞那种老移植版的Redis,既不安全也不好扩展。正经的Windows开发环境,推荐下面两条路选一条。

第一条路是WSL2。在Windows里装好WSL2并运行Ubuntu后,直接在终端安装Redis:

sudo apt update sudo apt install redis-server sudo systemctl start redis-server

WSL2里的Linux环境和真实服务器非常接近,你在上面练习的命令、配置文件,换到云服务器上几乎是同一套操作,过渡很平滑。

第二条路是Docker Desktop。如果你日常已经在用容器,直接用镜像跑:

docker run -d --name redis \ -p 6379:6379 \ redis:7 --requirepass "你的密码"

这条命令会从镜像仓库拉取Redis 7镜像并启动一个容器。注意--requirepass参数是把启动参数传给容器内的redis-server,不是传给docker本身。这样容器跑起来时密码也就生效了。

如果你是刚开始学Redis,我不建议在Windows上装乱七八糟的第三方绿色版,优先WSL2或Docker。原因很简单:你的学习成本应该花在Redis本身,而不是花在帮某个不维护的移植版修兼容性问题上。

2.4 装完之后先跑一遍连通性验证

无论用哪种方式装好Redis,第一步都是验证连通性。我最常用的是redis-cli自带工具,它随Redis一起安装,不用额外配置:

redis-cli -h 127.0.0.1 -p 6379 ping

输出PONG说明服务正常。接下来再走一遍读写,确认数据管道也通:

redis-cli 127.0.0.1:6379> set hello "redis" OK 127.0.0.1:6379> get hello "redis" 127.0.0.1:6379> type hello string 127.0.0.1:6379> info server

INFO server能看到redis_version、process_id、uptime等关键信息。到这里,安装和基础连通就已经全部完成了,可以进入配置阶段。

3. 配置redis.conf的关键项:从网络、持久化和内存三个维度下手

Redis启动时如果没有指定配置文件,会用内置默认配置直接启动。默认配置逻辑上没有问题,但生产环境必须显式指定conf文件并按需修改。常见启动方式:

redis-server /etc/redis/redis.conf

下面我挑最关键、最容易影响线上稳定性的配置项来拆解,不追求把每一行都过一遍,那没有意义。理解这些核心项和它们背后的取舍逻辑,比一次性背完整个配置文本有用得多。

3.1 网络层:bind、port、protected-mode 决定了谁能连进来

默认情况下Redis监听在所有网卡上,这是很危险的。生产环境我一般先改bind配置,明确告诉Redis只接受哪些IP的连接:

bind 127.0.0.1

如果一台服务器有内网IP,又有公网IP,需要让内网其他机器访问但禁止公网访问,可以这样写:

bind 127.0.0.1 192.168.1.100

这一行允许多个IP,空格隔开就行。绑定在具体IP上,比只改防火墙更内层地控制了暴露面。

port默认6379,除非有端口冲突,否则我建议保持默认。改端口只能躲避一些默认扫描脚本,真正的安全要靠密码和网段隔离,靠改端口意义有限。

protected-mode这个参数是Redis 3.2之后引入的保护措施。当它开启时,如果Redis没有配置bind,也没有配置requirepass,那么Redis只会接受本机回环地址的连接,即使监听在公网也会拒绝远程客户端的访问。它的初衷是防止有人刚装完还没设置密码就把Redis暴露到公网。我建议始终保持protected-mode yes,同时配置好bind和密码,三层保护叠加才稳妥。

3.2 进程与日志:daemonize、logfile、dir

daemonize决定Redis以前台还是守护进程方式运行。开发时我喜欢先不用daemonize,前台运行可以看到控制台日志,Ctrl+C就停很方便;但生产环境必须daemonize yes,让Redis在后台跑起来。

daemonize yes pidfile /var/run/redis_6379.pid

pidfile会在启动时写入Redis的进程ID,systemd或一些管理脚本会读取这个文件来判断服务状态。如果用的是Linux标准路径,需要注意一下目录写权限,我记得装上后不做任何操作就遇到过一次pidfile目录没权限导致启动失败,当时排查了半天才发现是权限问题。

logfile指定日志路径,生产环境一定要配:

logfile "/var/log/redis/redis.log"

如果只看默认配置甚至没有logfile,Redis把日志写到标准输出,一旦daemonize yes,标准输出不会自动落盘,出问题的时候连日志都找不到。dir这个配置指定持久化文件的存放目录,RDB快照和AOF文件都会写到这个目录下:

dir /var/lib/redis

建议单独建一个redis数据目录,不要在根目录乱放。后面做数据备份时,你只需要关心这一个目录,成本很低。

3.3 持久化:RDB、AOF 的取舍,本地开发也得想清楚

Redis持久化有两条路:RDB和AOF。RDB是周期性把内存数据生成完整快照,文件小、恢复快,但如果两次快照之间宕机,会丢失最后一次快照之后的所有改动。AOF则是把每一条写命令追加到文件里,数据丢失窗口更小,但文件体积大,恢复速度也慢一些。

默认配置里RDB是开启的,典型规则是:

save 900 1 save 300 10 save 60 10000

这三行含义分别是:900秒内至少1次写操作,触发一次RDB快照;300秒内至少10次写操作;60秒内至少1万次写操作。写成save ""可以完全关闭RDB。

AOF默认关闭,生产环境不管你是做缓存还是存业务数据,我都建议至少开起来:

appendonly yes appendfsync everysec

appendfsync有三个取值:always表示每条命令都刷盘,最安全但性能损耗最大;everysec表示每秒刷一次,性能和数据安全比较均衡;no表示由操作系统决定刷盘时机,性能最好但丢失窗口不可控。生产环境首选everysec,这是我在多个项目里验证过的平衡点。

如果你的Redis只做纯缓存,数据丢掉无所谓的场景,可以把RDB和AOF都关掉,省掉fork和写盘的开销,性能上限更高。关掉持久化后Redis更像一个大号Map,但选这种方案前一定想清楚能不能接受内存数据全军覆没的代价。

3.4 内存上限与淘汰策略:别让Redis吃光你的机器

Redis本质是内存数据库,如果不设maxmemory,它会不断膨胀直到把机器内存耗尽。这个问题我见过太多次了:缓存Key设了过期时间但加载速度远大于过期速度,或者某些Key忘了设TTL,结果内存一路涨到物理内存上限,最后触发系统OOM,Redis进程直接被内核杀掉。

正确的做法是提前设置内存上限,比如允许Redis最大用1GB内存:

maxmemory 1gb

同时还要配置当内存达到上限后怎么处理新写入请求,这就是maxmemory-policy。常用值有:

策略行为适用场景
noeviction内存满后写操作直接报错业务强一致性,不能丢数据
allkeys-lru从所有Key里淘汰最久没用的通用缓存场景
volatile-lru从设置了过期时间的Key里淘汰最久没用的希望没TTL的Key不被删除
allkeys-random随机淘汰任意Key数据访问均匀,无热点
volatile-random随机淘汰过期的Key里的一个冷数据较多
volatile-ttl淘汰剩余过期时间最短的Key接近过期的先淘汰

我做缓存服务时最常用的组合是maxmemory 1gb加maxmemory-policy allkeys-lru。含义是:总内存上限1GB,满了之后按LRU算法淘汰最久未被访问的键。这套组合在绝大多数业务缓存场景下适用,也容易向非技术人员解释。

AOF重写和RDB快照在做fork子进程时,会使用Copy-on-Write机制,子进程复制的是父进程的内存页表,但写时会产生额外内存在峰值时翻倍。所以maxmemory不要顶满物理内存,要留出20%到30%的余量给系统、fork子进程和其他进程,否则Redis还没慢,先把整台机器拖死了。

4. 上线前你的Redis必须做的安全加固

4.1 requirepass 不是终点,还要管好bind和防火墙

很久以前我接手过一个项目,Redis直接裸奔在公网IP上,没有密码也没有防火墙限制,结果上线第二天就被扫到了,数据被人FLUSHALL清空。那次事故让我养成了一个习惯:不管多小的环境,Redis启动文件里的requirepass必须第一时间设置。

requirepass 你的强密码

设置后,所有客户端执行命令前必须认证,redis-cli里用-a参数或AUTH命令输入密码。

但密码只解决了“谁能访问”的问题,没解决“谁能碰得到”的问题。合理的部署应该是:Redis只监听内网网卡,或者只监听127.0.0.1,同时靠防火墙再限制一层。如果你需要跨机访问,务必把bind设置成内网IP,然后在云安全组或iptables层面只允许特定网段访问6379端口。

Redis 6之后还引入了ACL(Access Control List),可以给不同应用分配独立账号和权限范围,比如只允许某个用户操作特定前缀的Key。这个功能后面值得单独写一篇展开,但至少在你设置requirepass的同时,可以瞄一眼ACL文档,项目大了以后一定用得到。

4.2 高危命令重命名:KEYS、FLUSHALL 这类命令得锁住

Redis默认提供了一些“手滑毁灭器”,最典型的就是KEYS、FLUSHALL、FLUSHDB。KEYS命令在Key数量大时会阻塞整个服务,因为它是全量扫描匹配。FLUSHALL和FLUSHDB则是直接把数据都删掉,一旦被误执行或者被攻击者执行,后果不堪设想。

我处理线上问题时的原则是:日常排查Key用SCAN和TYPE代替KEYS,删除操作手动确认后再执行。如果要彻底防住误操作,可以在配置文件里重命名这些命令:

rename-command KEYS "" rename-command FLUSHALL "" rename-command FLUSHDB "" rename-command CONFIG ""

把命令名重命名为空字符串,等于禁用了该命令。执行tab键补齐或普通命令的时候会发现根本没有这条命令,算是从源头阻断。

但这里有个坑:如果是Redis主从架构,主库和从库的配置文件都必须做同样的rename,否则主从同步执行到被重命名的命令时会报错。如果你有脚本依赖FLUSHALL来清理测试环境数据,重命名后也要同步改脚本逻辑。说到底,禁用的不是你对数据的控制权,而是让你每次执行高危操作前多走一步确认流程。

4.3 别用root跑Redis,创建独立用户

Redis在Linux下默认没做降权处理,如果我们用root启动它,一旦Redis被攻破或者有本地漏洞,攻击者能拿到的是root权限的进程,麻烦就大了。更合理的做法是建一个专门运行Redis的系统用户,给它最小必要权限。

大概的操作流程:

useradd --system --home /var/lib/redis redis mkdir -p /var/lib/redis /var/log/redis /run/redis chown redis:redis /var/lib/redis /var/log/redis /run/redis

然后在systemd服务文件里指定User和Group为redis,确保Redis进程只以该用户身份运行。数据目录、日志目录、PID目录的写权限都给到这个用户,但没有系统管理权限。这样即使服务被入侵,影响的也只是Redis自身的数据范围,不会直接扩散到整个操作系统。

5. 从systemd自启到可视化客户端:装完之后的事

5.1 用 systemd 管理 Redis 自启

很多同学手动启动Redis之后,一重启服务器就懵了:Redis呢?跑了没有?没人管。用systemd把Redis托管成系统服务是最好的解决方式。

我一般会在/etc/systemd/system/redis.service放一个服务文件,内容大致如下:

[Unit] Description=Redis Server After=network.target [Service] Type=forking ExecStart=/usr/local/redis/bin/redis-server /etc/redis/redis.conf ExecStop=/usr/local/redis/bin/redis-cli -a '你的密码' shutdown Restart=always User=redis Group=redis PIDFile=/run/redis/redis.pid [Install] WantedBy=multi-user.target

几个值得注意的细节:

  • Type=forking对应redis.conf里的daemonize yes,因为systemd需要知道服务会以守护进程方式在后台运行。
  • ExecStop里如果配了密码,明文写在service文件里,需要确保这个文件只有root可读,并且系统上不要有其他非管理员用户能查看进程列表。如果实在担心密码暴露,可以给Redis单独配一个只允许执行SHUTDOWN的ACL用户。
  • 修改service文件后必须执行systemctl daemon-reload,否则systemd还用旧配置。
  • 启动和设置开机自启用:
systemctl enable --now redis systemctl status redis

启用后,Redis就可以随系统启动自动拉起,进程意外挂掉也有Restart=always兜底,省了很多运维心力。

5.2 可视化客户端横向对比

命令行用久了确实顺手,但日常排查Key、看内存占用、清理测试数据,有图形界面效率会高不少。我整理了几款我实际用过的客户端,各有利弊:

客户端开源情况支持平台推荐场景
redis-cli官方内置所有平台最小环境快速排查,服务器上首选
RedisInsight官方免费Windows/macOS/Linux喜欢官方出品,想看集群和分析数据时用
Redis Desktop Manager老牌工具Windows/macOS老项目里存量用户较多,新版本部分功能收费
Another Redis Desktop Manager开源免费Windows/macOS/Linux日常可视化操作的常备选择

如果只让我推荐一个可视化工具,我选Another Redis Desktop Manager。它免费开源、跨平台,常用的Key查看、增删改、TTL修改都有,还支持按前缀模糊搜索Key。用Redis Desktop Manager的开源老版本也可以,但新版商业版策略有变化,刚入门时没必要折腾。

工具贵在顺手,不在多。生产服务器上我基本只用redis-cli,因为线上环境越简单越好;本机调试时才打开图形客户端,方便拖拽和观察数据。

5.3 跑一次 redis-benchmark 验证当前性能

安装配置完之后,最好用一个简单基准测试确认当前实例的真实性能,也便于后面调整配置时有对比依据。Redis自带redis-benchmark工具,基本用法:

redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 100000

-c 50表示同时50个并发连接,-n 100000表示总共发送10万次请求。测试结束后,工具会打印出各种命令每秒能处理的请求数。以我的经验,本机回环访问,一个默认配置的Redis 7实例跑到每秒10万次以上的SET/GET请求很正常,如果配置了AOF everysec或较强持久化,数字会略微下降,这也是预期内。

有个提醒:除非你明确知道自己在做什么,否则别在正在承接线上流量的生产实例上跑benchmark。高并发压测几百毫秒就可能把CPU打满,甚至触发慢查询,得不偿失。要测就在开发机或压测环境测。

6. 初始化安装最容易踩的四个坑

6.1 编译报错 zmalloc.h / jemalloc:MALLOC=libc 救场

源码编译安装时最经典的就是这个报错。错误信息里会出现zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory。

原因是Redis编译时会优先使用自带的jemalloc内存分配器,但部分Linux环境缺少对应头文件或存在链接冲突。解决办法就是我前面提到的,重新用libc编译:

make distclean make MALLOC=libc

注意一定要先make distclean清掉之前的编译残留,不要直接make MALLOC=libc,否则可能还会读取旧的对象文件,报同样的错。这个坑本身不难,但不少人在这里卡了一下午,换个参数编译也就一分钟。

6.2 THP 警告:不处理早晚吃性能亏

Redis启动日志里如果出现“WARNING you have Transparent Huge Pages (THP) support enabled in your kernel”,这不是一个可以忽略的小提示。THP是Linux内核的透明大页机制,它会尝试把内存页合并成更大的页以提升性能,但对Redis这类fork频繁的服务很不利:fork子进程做RDB或AOF重写时,THP会显著增加延迟,消耗更多内存,严重时会出现子进程长时间无响应。

解决办法是关闭透明大页:

echo never > /sys/kernel/mm/transparent_hugepage/enabled

不过这只是一次性调整,服务器重启后又会恢复。持久化处理可以把这个命令写入/etc/rc.local,或者放到systemd服务的ExecStartPre里。我在项目里更喜欢后者,因为统一用systemd管理,不会出现rc.local依赖某些服务未启动的问题。

6.3 TCP backlog 警告:顺手调一下内核参数

日志里还常见这样一句:“WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.”

意思是Redis期望TCP连接队列容量是511,但系统内核参数somaxconn只允许128。连接量一旦上来,接受连接的速度可能跟不上,出现高并发下客户端连接超时的现象。解决办法是调大系统参数:

echo "net.core.somaxconn = 1024" >> /etc/sysctl.conf sysctl -p

somaxconn调大后,Redis的TCP backlog就不会再被压低到128了。这个坑在低负载环境完全看不出来,一旦遇到短连接密集的场景,比如配合接入层做频繁连接,就容易莫名其妙地出现established连接数和实际请求数对不上。

6.4 忘了 maxmemory 和密码,线上事故预定了

这个坑我前面反复提过,但值得单独列出来再强调一次。有两个组合拳式的事故模型,我都见过真实案例:

第一种,不设置maxmemory,Redis被数据灌满,物理内存耗尽,内核OOM把Redis进程杀掉,然后所有请求全部打回数据库,数据库跟着被压垮。表现看起来是数据库挂了,根因却在Redis。

第二种,只设了密码不设bind,或者只设了bind不设密码,Redis暴露在公网,被扫描工具发现。攻击者执行FLUSHALL清库或者篡改数据,等你发现时,前端页面已经一片狼藉。

配置上把这两件事都提前做掉,线上事故的很大一部分风险就封死了:

bind 127.0.0.1 你的内网IP requirepass 你的强密码 protected-mode yes maxmemory 1gb maxmemory-policy allkeys-lru

装好Redis后先写这几行再干别的,这个习惯能帮你避免大多数初始化阶段的安全事故。按我过去带新人的经验,把这篇里的步骤完整走一遍,一个干净、有密码、有日志、有内存上限的Redis实例就能稳稳跑起来了。接下来的重点是主从复制、哨兵、集群,以及分布式锁、缓存穿透这些工程问题,我会在系列后续部分逐个拆开讲。最后再提醒一件容易被忽略的小事:无论哪个环境,装完Redis第一件事把密码设上,第二件事确认日志路径和内存上限,真到出事时这两步决定你能不能快速定位并止损。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/9 8:57:14

降AI率工具实测:9款横向对比与避坑指南

如果你是个2026届的本科生,“降AI率”这四个字估计已经听出茧子了。课程论文查重刚熬过去,导师又甩来一句“这段是不是AI写的”,你打开Word一看,自己还真用AI扩写过几段。这届本科生最尴尬的地方在于:AI辅助写作早已是…

作者头像 李华
网站建设 2026/9/9 8:57:08

硬件四阶段验证法:从样机到量产的可靠性落地路径

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/9 8:56:09

STM32C5驱动IIS3DWB10IS震动计的SPI高可靠设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/9 8:55:30

从源码泄露看Claude Code三层架构:CLI、Agent编排与内核执行

先说结论:这份泄露出来的 Claude Code 相关源码,我第一时间看了,但没有停留在“哪个版本、哪个文件泄露”的吃瓜层面,而是把它当成一份难得的“AI 编程工具架构教材”来拆。看完之后最强烈的感受是——这类工具框架本质上就是一条…

作者头像 李华
网站建设 2026/9/9 8:55:14

机器视觉双轮廓重影解析:从边缘检测到光源优化

先说我遇到的一个真实情况。去年做一套金属反光件的表面划痕检测,算法跑出来的结果始终“多一条边”:明明是一道细小划痕,边缘检测却给出内外两条轮廓,外圈粗、内圈细,怎么调阈值都只能让两条一起变粗或一起变细。那段…

作者头像 李华
网站建设 2026/9/9 8:44:54

FineReport开发者自测:21道进阶模拟题覆盖核心易错点

上次整理完第一套FineReport模拟题之后,后台陆续收到不少留言,有人问能不能再出一套进阶版,也有人直接问“FineReport下载以后到底怎么系统地自测”。趁着最近项目不忙,我把团队面试和日常答疑里最容易踩坑的点重新梳了一遍&#…

作者头像 李华