十二、Redis -1

简介

Redis 是BSD 协议开源的高性能 key‑value 内存数据库。 三大核心特点:

  1. 支持数据持久化,内存数据保存到磁盘,重启可重新加载恢复。
  2. 不只简单 key‑value,支持list、set、zset、hash多种复杂数据结构。
  3. 支持 master‑slave 主从复制,实现数据备份。

Redis 优势

  1. 性能极高:QPS 可达 10 万‑100 万 +,微秒级响应;MySQL 一般几千~几万 QPS,毫秒级响应。
  2. 丰富的数据类型:支持二进制安全的 String、List、Hash、Sets、ZSet。
  3. 操作原子性 :单条命令天然原子;多条操作使用MULTI / EXEC事务保证原子。
  4. 附加功能:发布订阅、key 过期等。

Redis 与其他 key‑value 存储有什么不同

  1. 支持复杂数据结构,并提供对应的原子操作,对上层应用透明,不需要额外封装。
  2. 数据运行在内存,同时支持持久化落盘;数据总量受物理内存限制。
  3. 在内存操作复杂结构,效率远高于磁盘数据库。
  4. 磁盘存储格式为追加写,不需要随机 IO 访问。

哈希槽的基本概念(Redis‑Cluster 集群)

  1. Redis 集群固定总共有 16384 个哈希槽,编号 0‑16383。
  2. 映射公式:HASH_SLOT = CRC16(key) mod 16384;同一个 key 永远映射到同一个哈希槽。
  3. 集群中每个节点负责一部分哈希槽。
  4. 支持在线迁移哈希槽,扩容缩容时迁移的数据量可控。

Redis 常见应用场景

  1. 热点数据缓存(Cache‑Aside 旁路缓存):电商商品、用户信息;先查缓存,未命中查询数据库再回写缓存;设置 TTL 过期,缓存空值防止缓存穿透。
  2. 分布式锁 :SET key value NX PX 过期时间加锁;Lua 脚本实现原子解锁;长任务需要锁续期,获取锁失败做重试。
  3. 计数器 & 限流 :INCR原子自增;用于阅读量、播放量统计、接口限流、秒杀库存。
  4. 排行榜系统:ZSet 有序集合实现销量、游戏积分排行榜。
  5. 分布式会话 session:多服务实例共享会话,key 设置过期自动清理无效会话。
  6. 消息队列(List 实现) :生产者LPUSH写入消息,消费者BRPOP阻塞消费;适合可靠性要求不高场景。
  7. Bitmap 位图:用户签到、活跃用户统计、布尔权限标记,节省内存。
  8. GEO 地理坐标:LBS 业务,附近的人、距离计算。

Redis 特性

  1. 性能高:内存操作、C 语言开发,QPS 可达 10 万。
  2. Redis6.0 之前,命令执行是单线程
    • 快的原因:全部内存运算;业务逻辑简单;规避多线程锁竞争;epoll IO 多路复用,单线程管理大量 socket 连接。
    • 注意:仅命令执行单线程,后台还有 fsync、关闭 fd 等辅助线程。
    • 风险:慢命令会阻塞整个 Redis 服务,如keys *、大 Lua 脚本、超大集合操作。
    • Linux IO 多路复用三种 API:select、poll、epoll。
  3. 支持 RDB/AOF 持久化。
  4. 丰富的数据结构。
  5. 多语言客户端支持。
  6. 扩展能力:Lua 脚本、发布订阅 pub/sub、事务、Pipeline 流水线。
  7. 代码精简,外部依赖少。
  8. 支持主从复制、哨兵、集群实现高可用。

缓存相关要点

  • 存储层级:CPU 缓存→内存→磁盘,速度递减,容量递增。
  • 缓存两大特征:高速介质加速访问;缓存容量小于后端存储,存在数据淘汰。
  • 旁路缓存:读写逻辑写业务代码,Redis 只被动接收请求。
  • 只读缓存:写操作直接操作数据库,修改数据后删除缓存。
  • 读写缓存:同步直写(同时写缓存 + 数据库,安全,性能差);异步写回(先写缓存,淘汰时回写数据库,性能高,存在丢数据风险)。
  • 缓存三大问题
    • 缓存雪崩:大量 key 同时过期 / Redis 宕机,请求全部打数据库;解决:过期增加随机偏移、高可用、限流、多级缓存。
    • 缓存穿透:查询不存在的数据;解决:参数校验、缓存空值、布隆过滤器。
    • 缓存击穿:单个热点 key 过期,大量并发打数据库;解决:互斥锁、热点 key 永不过期业务主动更新。

Pipeline 流水线

  1. RTT:一次网络往返时间。普通 N 条命令需要 N 次 RTT。
  2. Pipeline:多条命令打包,一次网络发送,一次性返回全部结果,仅消耗 1 次 RTT。
  3. Redis 内部依旧单线程顺序执行每条命令。
  4. 网络延迟越大,Pipeline 的性能收益越高。

redis 的安装

源码编译(CentOS7)
复制代码
yum install tcl gcc gcc‑c++ -y
tar zxvf redis‑6.2.14.tar.gz -C /usr/local
cd /usr/local/redis‑6.2.14
make && make install
redis‑server redis.conf &
redis‑cli
yum/dnf 安装(CentOS Stream8)
复制代码
dnf install -y redis
systemctl enable redis --now
redis‑cli
ping #返回PONG代表服务正常
Redis 多实例:不同端口启动多个进程
复制代码
redis‑server --port 6380
redis‑cli -p 6380

Redis 配置文件说明 redis.conf

复制代码
bind 127.0.0.1          #监听绑定IP,0.0.0.0允许所有IP访问
protected‑mode yes      #保护模式,无密码且bind非127.0.0.1拒绝外部访问
port 6379               #服务端口
tcp‑backlog 511         #TCP半连接队列
timeout 0               #空闲连接超时,0代表不超时
tcp‑keepalive 300       #TCP保活探测周期
daemonize no            #是否后台守护进程
pidfile /var/run/redis_6379.pid
loglevel notice
logfile /var/log/redis/redis.log
databases 16            #默认16个逻辑数据库,select切换db

#RDB持久化快照
save 900 1
save 300 10
save 60 10000
stop‑writes‑on‑bgsave‑error yes
rdbcompression yes
rdbchecksum yes
dir /var/lib/redis
dbfilename dump.rdb

#AOF持久化追加日志
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec

#安全配置
requirepass 123456      #设置访问密码
maxclients 10000        #最大客户端连接数

#慢查询日志,单位微秒,1ms=1000us
slowlog‑log‑slower‑than 10000
slowlog‑max‑len 128

#复制相关
replica‑serve‑stale‑data yes
replica‑read‑only yes
replica‑priority 100    #哨兵选主优先级,0永不选为master

config 命令实现动态修改配置以及慢查询

复制代码
CONFIG GET *                    #查看全部运行时配置
CONFIG SET requirepass 123456   #内存动态修改配置
SLOWLOG LEN                     #查看慢日志总条数
SLOWLOG GET                     #获取慢查询详情

注意:CONFIG SET仅修改内存,重启服务失效,不会写入 redis.conf,部分参数不支持动态修改。

RDB(Redis DataBase)& AOF(Append-only File)持久化

Redis 是内存数据库,断电内存数据丢失;持久化把内存数据保存到磁盘,重启恢复数据,两种持久化可以同时开启。

RDB 快照持久化

把某一时刻全部内存数据生成二进制快照 dump.rdb 保存磁盘。

  • 自动触发:配置save 秒数 key变更数量条件。
  • 手动触发:SAVE主线程阻塞;BGSAVE fork 子进程后台执行,生产推荐。

✅优点:二进制文件体积小,适合备份迁移;重启恢复速度快。 ❌缺点:两次快照之间的数据存在丢失风险;fork 会消耗内存。

AOF 追加日志持久化

记录每一条写操作命令 ,追加写入 appendonly.aof 日志;重启重放日志恢复数据。 appendfsync三种刷盘策略:

  1. always:每一条写命令立刻刷磁盘;最安全,性能差。
  2. everysec:每秒刷盘,默认策略,最多丢失 1 秒数据。
  3. no:交给操作系统决定刷盘;性能高,丢失数据风险大。
  • AOF rewrite 重写:AOF 文件持续膨胀,rewrite 基于当前内存状态生成全新 AOF,剔除无效历史命令,压缩文件体积。
  • 混合持久化 aof‑use‑rdb‑preamble yes:rewrite 头部写入 RDB 快照,后面追加 AOF 日志,兼顾恢复速度和安全性。

✅优点:数据安全性高,最多丢失 1 秒数据。 ❌缺点:AOF 文件体积更大;重启重放命令恢复速度比 RDB 慢。

生产最佳实践:RDB + AOF 混合开启。

客户端连接 Redis

  1. 客户端分类
  • redis‑cli官方自带命令行

    redis‑cli -h IP -p 端口 -a 密码
    redis‑cli -h 127.0.0.1 -p 6379 -a 123456

  • 编程语言客户端:Java (Jedis、Lettuce)、python (redis‑py)、Go、PHP。

  • GUI 图形工具:Redis‑Desktop‑Manager。

  1. 客户端常用命令

    INFO #显示当前节点redis运行状态信息
    SELECT 0~15 #切换逻辑数据库,0‑15;集群模式仅允许db0
    KEYS * #查看当前库下所有key,此命令慎用,数据量太大可能导致死机
    DBSIZE #返回当前库下所有key数量
    FLUSHDB/FLUSHALL #强制清空当前库/所有库中所有key,此命令一般不要用,数据丢失
    SHUTDOWN #关闭redis服务,不要用,防止数据丢失

Redis 数据类型(命令模板)

1.String 字符串(二进制安全)

复制代码
SET testkey value          # 设置key‑value,key存在会覆盖原有值,MSET同时设置多个key
APPEND testkey "xxx"       # 追加key的数据
GET testkey                # 获取key对应的value值,MGET获取多个key值
SETNX testkey val          # key不存在才设置;key已存在不做任何操作(分布式锁基础)
INCR testkey               # 对key数字值原子+1,key不存在自动初始化为0
DECR testkey               # 对key数字值原子‑1,key不存在自动初始化为0
EXPIRE testkey 30          # 设置key过期时间,单位:秒,30秒后key自动删除
TTL testkey                # 查看key剩余存活过期时间;‑1永不过期,‑2key不存在
DEL testkey                # 删除指定key,不管什么数据类型都可以删除

2.List 双向链表,允许重复元素,用于消息队列

复制代码
LPUSH queue a b c       # 从链表【左侧头部】插入一个或多个元素
RPUSH queue d e f       # 从链表【右侧尾部】插入一个或多个元素
LPOP queue              # 从链表左侧头部弹出一个元素,弹出后该元素从列表移除
RPOP queue              # 从链表右侧尾部弹出一个元素,弹出后该元素从列表移除
BRPOP queue 10          # 阻塞式尾部弹出;队列无消息则阻塞等待最多10秒,有消息立刻返回,用于消费消息队列
LRANGE queue 0 -1       # 查看列表指定下标区间元素;0代表第一个,‑1代表最后一个,0‑1查看全部元素

3.Set 集合,无序、自动去重,支持交并差集

复制代码
SADD myset a b c        # 向集合添加元素,自动去重;重复元素不会重复存入
SMEMBERS myset          # 返回集合里面全部的成员元素
SISMEMBER myset a       # 判断a元素是否存在集合中;返回1存在,0不存在
SREM myset b            # 删除集合中指定成员元素
SINTER set1 set2        # 求两个集合【交集】,返回同时存在于两个集合的元素
SUNION set1 set2        # 求两个集合【并集】,返回两个集合全部不重复元素
SDIFF set1 set2         # 求两个集合【差集】,返回存在set1、但是不存在set2的元素

4.ZSet 有序集合,score 分数排序,用于排行榜

复制代码
ZADD rank 100 user1 95 user2 88 user3   # 添加有序集合成员;格式 ZADD key score member,score决定排序权重
ZRANGE rank 0 -1 WITHSCORES            # 按score【从小到大升序】输出成员,WITHSCORES同时打印对应分数
ZREVRANGE rank 0 -1 WITHSCORES         # 按score【从大到小降序】输出成员,做排行榜常用
ZREM rank user2                        # 删除有序集合中指定member成员
ZSCORE rank user1                      # 查询指定成员对应的score分数值

5.Hash 哈希,适合存储对象,field‑value

复制代码
HSET user:100 name zhangsan age 18   # 设置hash字段,user:100为hash键;设置name、age字段
HGET user:100 name                  # 获取hash中单个field字段的值
HGETALL user:100                    # 获取hash内全部field和value,返回所有字段与对应值
HKEYS user:100                      # 只获取hash中所有的字段名(field)
HVALS user:100                      # 只获取hash中所有字段对应的value数值
HDEL user:100 age                   # 删除hash内部指定的一个field字段,不会删除整个hash键
相关推荐
甜到心里的蛋糕2 小时前
Playwright 无头浏览器自动发布 CSDN 图文草稿的实践(持久化 profile + 图床直传)
运维·python·playwright·爬虫自动化·博客运营
这个DBA有点耶2 小时前
Change Buffer深入:二级索引写入的隐形加速器与它的代价
数据库·mysql·代码规范
for_ever_love__2 小时前
MySQL 事务隔离级别讲透:MVCC、幻读与四个级别怎么选
java·数据库·mysql·事务·mvcc·不可重复读·幻读
凌云若寒3 小时前
BarTender提示#807错误:无法在拥有其他许可证的Licensing Service上激活节点锁定的 Professional 版许可证 的解决办法
运维·服务器·前端·学习·软件需求
Knight_AL3 小时前
PostgreSQL Docker 数据库备份:pg_dump 与 SQL 格式备份的区别
数据库·docker·postgresql
写后端的胖头鱼3 小时前
Redis 的 RDB 和 AOF
java·数据库·redis
杨云龙UP3 小时前
Oracle 19c ADG 实时同步故障排查与修复:Standby Redo Log(SRL)文件缺失导致备库仅在主库归档后同步
数据库·oracle·adg·data guard·srl·ora-00313·ora-27037
Julien20043 小时前
管理 Ansible 配置文件
linux·运维·服务器·ssh·学习方法
禾小西3 小时前
Redis AOF 日志:宕机了,如何避免数据丢失?
java·redis·mybatis