Lecture12-Redis-生产配置与安全

文章目录

    [toc]

    单词词性音标含义
    protectedadj./prəˈtektɪd/受保护的(protected-mode,开启时仅允许本地连接)
    bindv./baɪnd/绑定(指定 Redis 监听哪些 IP 地址)
    requirepassn./rɪˈkwaɪə(r)pɑːs/全局密码(requirepass 设置访问密码)
    ACLn./ˌeɪ siː ˈel/访问控制列表(Redis 6+ 按用户分配命令/键权限)
    maxmemoryn./mæks ˈmeməri/最大内存(写满后按策略淘汰键)
    evictionn./ɪˈvɪkʃn/淘汰(内存超限删除键释放内存)
    LRUn./ˌel ɑː ˈjuː/最近最少使用(淘汰长时间未访问的键)
    LFUn./ˌel ef ˈjuː/最不经常使用(淘汰访问频率最低的键)
    supervisedadj./ˌsuːpəˈvaɪzd/被监管的(supervised systemd,配合 systemd 管理)
    monitorv./n./ˈmɒnɪtə(r)/监控(MONITOR 实时查看所有命令;INFO 查看运行状态)

    Lecture12-Redis-生产配置与安全

    目标:把前面学的配置汇总成一份可上生产的 Redis 配置,重点讲安全(保护模式/绑定/ACL)、内存管理(淘汰策略)、systemd 服务化与监控。

    1、安全配置

    1、保护模式(protected-mode)

    保护模式开启时,且未设置密码,Redis 只接受本地连接(127.0.0.1),避免暴露到外网被攻击。

    protected-mode yes
    

    要让局域网其它机器访问时,不建议关闭保护模式,而是配置好 bind + requirepass:Redis 6 只需配其中一个即可放行;Redis 7 起受保护模式下两个都要配才放行。


    2、bind(IP 绑定)

    限制 Redis 监听的网卡地址,只允许指定来源连接:

    # 仅本机
    bind 127.0.0.1
    
    # 内网网卡(推荐生产:只监听内网 IP,防止外网直连)
    bind 192.168.100.100
    
    # 全部(开发方便,生产不推荐)
    bind 0.0.0.0
    

    多个 IP 写在同一行用空格分隔:bind 127.0.0.1 192.168.100.100(分行写会被覆盖)。


    3、密码:requirepass 与 ACL

    ①全局密码(简单)

    requirepass atguigu
    

    客户端连接后要先 auth:

    redis-cli -a atguigu
    # 或进入后
    127.0.0.1:6379> auth atguigu
    OK
    

    ②ACL(按用户分权限,推荐)

    Redis 6+ 支持为不同用户分配命令权限和键权限:

    # 创建只读用户
    127.0.0.1:6379> acl setuser readonly on >readpass ~* +@read
    OK
    # 查看用户
    127.0.0.1:6379> acl list
    

    生产建议:默认 default 用户设强密码,业务用最小权限用户(如只读用户给报表,读写用户只给指定 key 前缀)。


    4、禁用危险命令

    CONFIG、FLUSHALL、KEYS 等命令在生产很危险,可重命名/禁用:

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

    注意:禁用 KEYS 会同时影响 SCAN 吗?不会,SCAN 是独立命令。客户端要改密码也走 ACL,而不是 CONFIG。


    2、内存管理

    1、设置最大内存

    maxmemory 1gb
    

    建议设置,否则内存写满会导致系统卡死/OOM。集群/主从需给复制缓冲区留空间。


    2、淘汰策略(maxmemory-policy)

    内存写满时按策略淘汰键。共 8 种取值,命名规律:allkeys-* = 在所有 key 中淘汰;volatile-* = 只在设置了过期时间的 key 中淘汰。后缀是淘汰算法:lru(最久未使用)/ lfu(访问频率最低)/ random(随机)/ ttl(剩余存活时间最短)。

    策略含义适用
    noeviction不淘汰;内存写满时写操作直接报错(读、删仍可用),默认值数据不能丢
    allkeys-lru在所有 key 中淘汰最近最少使用的缓存首选
    allkeys-lfu在所有 key 中淘汰访问频率最低的热点波动大的缓存
    allkeys-random在所有 key 中随机淘汰访问均匀、无明显热点
    volatile-lru只在带过期时间的 key 中淘汰最久未用的部分数据可淘汰
    volatile-lfu只在带过期时间的 key 中淘汰访问频率最低的带 TTL 的热点缓存
    volatile-random只在带过期时间的 key 中随机淘汰带 TTL、无热点
    volatile-ttl只淘汰剩余存活时间最短(最快过期)的 key优先清理即将过期的
    maxmemory-policy allkeys-lru
    

    注意:volatile-* 系列如果当前没有任何设置了过期时间的 key,行为会退化成 noeviction——内存写满时写操作直接报错。所以用这类策略时,要确保"允许被淘汰的数据"都设置了 TTL。

    记忆:缓存业务用 allkeys-lru;业务数据(不能丢)用 noeviction。


    3、淘汰精度

    # LRU/LFU 是近似算法,抽样数量默认 5,越大越准但越耗 CPU
    maxmemory-samples 5
    

    3、systemd 服务化(开机自启)

    1、编译时开启 systemd 支持

    源码编译安装时带上(若不支持,supervised systemd 会退化为前台):

    cd /opt/redis-8.0.6
    make distclean
    make USE_SYSTEMD=yes MALLOC=jemalloc
    make install
    

    2、修改配置

    daemonize no        # 交给 systemd 管理,不再自己后台化
    supervised systemd  # 让 systemd 能感知 Redis 就绪
    

    3、创建服务文件

    # /etc/systemd/system/redis.service
    [Unit]
    Description=Redis Server 8
    After=network.target
    
    [Service]
    Type=notify
    User=redis
    Group=redis
    ExecStart=/usr/local/bin/redis-server /usr/local/redis/redis.conf
    ExecStop=/usr/local/bin/redis-cli -a atguigu shutdown
    Restart=always
    LimitNOFILE=65535
    PrivateTmp=true
    
    [Install]
    WantedBy=multi-user.target
    

    4、创建用户并设置权限(安全)

    groupadd -r redis
    useradd -r -s /sbin/nologin -g redis redis
    chown -R redis:redis /usr/local/redis
    chmod 600 /usr/local/redis/redis.conf
    

    5、启用服务

    systemctl daemon-reload
    systemctl enable --now redis
    systemctl status redis
    

    4、监控与运维

    1、运行状态

    redis-cli info                # 综合信息
    redis-cli info memory         # 内存
    redis-cli info replication    # 主从
    redis-cli info persistence    # 持久化
    

    2、实时命令监控

    redis-cli monitor             # 实时打印所有命令(排查用,慎用:有开销)
    

    3、慢查询

    slowlog-log-slower-than 10000   # 超过 10s 记入慢日志
    slowlog-max-len 128
    
    redis-cli slowlog get 10
    

    5、生产配置参考(汇总)

    # === 网络与安全 ===
    bind 192.168.100.100
    protected-mode yes
    requirepass atguigu            # 或使用 ACL 最小权限用户
    rename-command CONFIG ""
    
    # === 内存 ===
    maxmemory 1gb
    maxmemory-policy allkeys-lru
    
    # === 持久化 ===
    appendonly yes
    appendfsync everysec
    save 3600 1 300 100 60 10000
    
    # === systemd ===
    daemonize no
    supervised systemd
    
    # === 其它 ===
    databases 16
    tcp-keepalive 300
    slowlog-log-slower-than 10000
    

    6、生产架构总结

    prod-arch

    一条完整的生产链路:应用(SpringBoot4) → Redis(集群/主从+哨兵,设密码+bind+内存策略+持久化) → 数据库,配合监控与慢查询。


    7、课堂练习

    1. 给 Redis 设置 requirepass,重启后用 redis-cli -a 连接,确认未认证时操作报 NOAUTH。
    2. 创建 ACL 只读用户并验证只能读、不能写。
    3. 设置 maxmemory 100mb + allkeys-lru,写入大量数据观察淘汰。
    4. 编写 redis.service 并 systemctl enable --now redis,确认开机自启。
    5. 用 redis-cli info memory 和 slowlog get 观察运行状态。

    8、本节验证

    • 会配置保护模式、bind、requirepass、ACL、禁用危险命令 ✅
    • 会设置 maxmemory 与淘汰策略(LRU/LFU 及适用场景)✅
    • 会用 systemd 服务化 Redis 并做安全权限设置 ✅
    • 会用 INFO/MONITOR 监控、慢查询定位,参考生产配置汇总 ✅
    end