云计算百科
云计算领域专业知识百科平台

十二、Redis -1

简介

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

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

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

  • 支持复杂数据结构,并提供对应的原子操作,对上层应用透明,不需要额外封装。
  • 数据运行在内存,同时支持持久化落盘;数据总量受物理内存限制。
  • 在内存操作复杂结构,效率远高于磁盘数据库。
  • 磁盘存储格式为追加写,不需要随机 IO 访问。
  • 哈希槽的基本概念(Redis‑Cluster 集群)

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

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

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

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

    Pipeline 流水线

  • RTT:一次网络往返时间。普通 N 条命令需要 N 次 RTT。
  • Pipeline:多条命令打包,一次网络发送,一次性返回全部结果,仅消耗 1 次 RTT。
  • Redis 内部依旧单线程顺序执行每条命令。
  • 网络延迟越大,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三种刷盘策略:

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

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

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

    客户端连接 Redis

  • 客户端分类
    • 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。
  • 客户端常用命令
  • 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存在会覆盖原有值
    GET testkey # 获取key对应的value值
    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键

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 十二、Redis -1
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!