PHP开发知识结构
  • README
  • Architecture
    • 架构基础
      • 参考资料
      • [分布式架构 Broker](Architecture/架构基础/分布式架构 Broker.md)
      • 高可用
      • 高性能
      • 架构设计原则
      • 架构原则
      • 可扩展
      • 模块化
      • 业务架构
    • 建模
      • PERM
    • 网关
      • 微服务与API网关
    • DDD
      • 1.基础
      • 参考资料
    • JOB
      • 设计
    • MQ
      • Kafka
        • 常见问题
        • 架构
        • kafka介绍
      • Notes
        • RabbitMQ和Kafka的比较
      • Rabbit Mq
        • Notes
          • 常见问题
          • 存储机制
          • 错误问题处理
          • 消息持久化
          • 消息确认机制
        • [1. RabbitMq的基础](Architecture/MQ/RabbitMq/1. RabbitMq的基础.md)
        • [2. RabbitMq的概念](Architecture/MQ/RabbitMq/2. RabbitMq的概念.md)
        • [x1. RabbitMQ与Redis队列对比](Architecture/MQ/RabbitMq/x1. RabbitMQ与Redis队列对比.md)
      • 消息队列
  • Base
    • 架构
      • 1.如何保证缓存与数据双写一致性
    • 文件系统
      • 文件系统原理
    • 性能
      • 1.缓存
    • 异步编程
      • 基于任务的异步编程
    • Networks
      • 常见问题
        • 跨域
        • 三次握手和四次分手
        • RPC和REST
        • RPC框架
      • 进程和线程
        • 多线程和多线程
        • 进程、线程、协程
        • 进程间通信方式有哪些
        • 进程切换
        • [通道 Chan](Base/Networks/进程和线程/通道 Chan.md)
        • 同步异步、阻塞非阻塞
        • 协程
      • 执行体
        • 协同
      • HTTP
        • [1. 互联网协议入门](Base/Networks/HTTP/1. 互联网协议入门.md)
        • [2. HTTP协议入门](Base/Networks/HTTP/2. HTTP协议入门.md)
        • [3. HTTP报文内的HTTP信息](Base/Networks/HTTP/3. HTTP报文内的HTTP信息.md)
        • [4. HTTP状态码](Base/Networks/HTTP/4. HTTP状态码.md)
        • [6. HTTPS](Base/Networks/HTTP/6. HTTPS.md)
        • [7. 用户身份的认证](Base/Networks/HTTP/7. 用户身份的认证.md)
        • Untitled
      • IO编程
        • IO
        • IO定义
        • IO模型
      • Notes
        • 多进程共用数据库连接问题
    • OOAD
      • 面向对象
        • 抽象类和接口
        • 对象
        • 多态
        • 封装
        • 克隆
        • 控制反转
        • 类的变量
        • 依赖注入
        • MVC
        • ORM
  • Business
    • 权限
      • Casbin
    • 注册登录
      • 单点登录
    • 1.服务端接口版本问题
    • 2.一致性问题
    • [3.if else 太多](Business/3.if else 太多.md)
    • 4.如何做监控统计
    • 5.规则引擎
    • 6.滑块验证码
    • 7.大规模上报一致性问题
    • 8.状态机
  • Cloud
    • 云存储
    • Docker
      • 常见问题
        • [Certificate Signed By Unknown Authority](Cloud/Docker/常见问题/certificate signed by unknown authority.
        • [No Route To Host](Cloud/Docker/常见问题/no route to host.md)
      • [0. 简介](Cloud/Docker/0. 简介.md)
      • [1. 安装](Cloud/Docker/1. 安装.md)
      • [2. 基本概念](Cloud/Docker/2. 基本概念.md)
      • [3. 镜像操作](Cloud/Docker/3. 镜像操作.md)
      • [4. 容器操作](Cloud/Docker/4. 容器操作.md)
      • [5. 仓库操作](Cloud/Docker/5. 仓库操作.md)
      • [6. 数据卷](Cloud/Docker/6. 数据卷.md)
      • [7. 资源列表](Cloud/Docker/7. 资源列表.md)
      • [8. 应用](Cloud/Docker/8. 应用.md)
    • Kubernetes
      • 安装
      • 基础知识
      • 说明
    • Micro Services
      • [1. 服务框架](Cloud/MicroServices/1. 服务框架.md)
      • [3. 服务安全](Cloud/MicroServices/3. 服务安全.md)
      • [4. 后台服务](Cloud/MicroServices/4. 后台服务.md)
      • [5. 服务容错](Cloud/MicroServices/5. 服务容错.md)
      • [6. 服务监控](Cloud/MicroServices/6. 服务监控.md)
      • [7. 服务部署平台](Cloud/MicroServices/7. 服务部署平台.md)
      • [8. 服务化](Cloud/MicroServices/8. 服务化.md)
      • 参考资料
      • HTTP
      • RPC
      • [x1. API网关](Cloud/MicroServices/x1. API网关.md)
      • [x2. 服务发现](Cloud/MicroServices/x2. 服务发现.md)
      • [x3 监控](Cloud/MicroServices/x3 监控.md)
  • Concept
    • Etcd
    • Swoole
  • Data
    • Algorithm
      • 排序
        • 插入排序
        • 快速排序
        • 冒泡排序
        • 选择排序
        • 直接插入排序
      • 参考资料
      • 哈希算法
      • 一致性hash
    • Data Structure
      • 数据结构
        • [1. 什么是数据结构](Data/DataStructure/数据结构/1. 什么是数据结构.md)
        • [2. 线性表](Data/DataStructure/数据结构/2. 线性表.md)
        • [3. 链表](Data/DataStructure/数据结构/3. 链表.md)
        • [4. 数组](Data/DataStructure/数据结构/4. 数组.md)
        • [5. 栈](Data/DataStructure/数据结构/5. 栈.md)
        • [6. 队列](Data/DataStructure/数据结构/6. 队列.md)
        • [7. 哈希表](Data/DataStructure/数据结构/7. 哈希表.md)
        • [8. 堆](Data/DataStructure/数据结构/8. 堆.md)
        • [9. 二叉查找树](Data/DataStructure/数据结构/9. 二叉查找树.md)
      • Notes
        • Hash表的时间复杂度为什么是O(1)
      • [1 简介](Data/DataStructure/1 简介.md)
      • [2 时间复杂度](Data/DataStructure/2 时间复杂度.md)
  • Data Base
    • Cache
      • 如何保证缓存与数据库的双写一致性
      • Memcached和Redis对比
    • ES
      • 倒排索引
      • 概念
      • 入门
    • Memcached
      • Memcached介绍
      • Memcached使用
    • Mongo DB
      • 安装
      • MongoDB查询
      • MongoDB连接
      • MongoDB入门
    • My Cat
      • 原理
      • Mycat中的概念
    • My SQL
      • 基础篇
        • [1. Mysql](DataBase/MySQL/基础篇/1. Mysql.md)
        • [2. 数据库操作](DataBase/MySQL/基础篇/2. 数据库操作.md)
        • [3. 数据类型](DataBase/MySQL/基础篇/3. 数据类型.md)
        • [4. 数据库设计](DataBase/MySQL/基础篇/4. 数据库设计.md)
        • [5. 索引](DataBase/MySQL/基础篇/5. 索引.md)
        • [6. 事务](DataBase/MySQL/基础篇/6. 事务.md)
        • 编码
        • 范式
        • 一条SQL查询语句是如何执行的?
      • 实践篇
        • [1. 事务回滚](DataBase/MySQL/实践篇/1. 事务回滚.md)
        • [2. 隐式转换](DataBase/MySQL/实践篇/2. 隐式转换.md)
        • [3. 分库分表](DataBase/MySQL/实践篇/3. 分库分表.md)
      • 事务和锁
        • 表锁&行锁
        • 乐观锁&悲观锁
        • 事务
        • 数据库锁
        • mysql死锁的条件及应对措施
      • 性能优化
        • [0. 性能优化](DataBase/MySQL/性能优化/0. 性能优化.md)
        • [1. 执行优化](DataBase/MySQL/性能优化/1. 执行优化.md)
        • [2. 架构优化](DataBase/MySQL/性能优化/2. 架构优化.md)
      • Note
        • 如何进行分库分表
        • 如何选择主库和从库
        • 如何做数据恢复
        • 删除和添加索引,为什么要先加后删
        • 什么是关系表
        • 数据库单表由万级变成亿级,怎么处理
        • 索引失效的场景
        • 一条SQL查询语句是如何执行的
        • count查询为什么会慢
        • [MySQL 意外宕机,如何数据恢复](DataBase/MySQL/Note/MySQL 意外宕机,如何数据恢复.md)
        • Mysql安装
        • mysql查询语句怎么做性能分析?
        • mysql批量删除表名符合条件的表
        • MySQL数据库规范
        • Pt Online Schema Change
        • SQL慢查优化方案
        • [Warning PDO Statementexecute SQLSTATE HY 093 Invalid Parameter Number Number Of Bound Variables Doe
      • [x1. 常见问题](DataBase/MySQL/x1. 常见问题.md)
      • [x2 参考资料](DataBase/MySQL/x2 参考资料.md)
      • [x3 资料推荐](DataBase/MySQL/x3 资料推荐.md)
    • Redis
      • 多线程
        • KeyDB实现
        • [Redis 多线程](DataBase/Redis/多线程/Redis 多线程.md)
      • 分布式
        • 集群
        • 清理集群
        • 哨兵机制
        • 主从复制
        • Redis分布式锁
      • 基础知识
        • [1. 简介](DataBase/Redis/基础知识/1. 简介.md)
        • [2. 数据结构](DataBase/Redis/基础知识/2. 数据结构.md)
        • 配置说明
        • 问题画像
        • 知识图
      • 进阶
        • 管道
        • 消息队列
        • 性能调优
        • 性能分析
        • 优化建议
        • redis升级
      • 使用场景
        • 数据类型适用场景
        • Redis的问题
      • 数据结构
        • 底层的数据结构
        • 复杂度
        • 键值
        • 内存分配
      • Notes
        • 缓存特征、介质
        • 如果有大量的key需要设置同一时间过期,一般需要注意什么?
        • 如何查找key
        • 如何应对缓存穿透和缓存雪崩问题?
        • 如何找到最大值对应的key
        • 为什么要使用Nosql
        • [为什么Redis 是单线程却能支撑高并发](DataBase/Redis/Notes/为什么Redis 是单线程却能支撑高并发.md)
        • 应用场景
        • [Redis 字典遍历](DataBase/Redis/Notes/Redis 字典遍历.md)
        • [Redis Cluster请求路由原理](DataBase/Redis/Notes/Redis Cluster请求路由原理.md)
        • Redis的监控
        • Redis的同步机制
        • redis的hash怎么实现的?
        • redis过期策略和缓存置换策略
        • [Redis缓存数据类型的选择 ](DataBase/Redis/Notes/Redis缓存数据类型的选择 .md)
        • Redis集群之间是如何复制?
        • Redis迁移
        • Redis如何做持久化的
        • Redis写入大量数据后,为什么变慢了
        • redis有哪些危险的命令?怎么避免
      • 参考资料
  • Distributed
    • Zookeeper
      • 常见问题
    • 多线程环境解决方案
    • 分布式链路追踪
    • 分布式事务
    • 分布式系统原理以及常用解决方案
    • 分布式最终一致性
    • 数据一致性
    • 一致性哈希
    • CAP定理
    • Map Reduce
    • Untitled
  • Front End
    • [01 前端工具](FrontEnd/01 前端工具/README.md)
      • [Apidoc](FrontEnd/01 前端工具/Apidoc.md)
      • [Sublime](FrontEnd/01 前端工具/Sublime.md)
      • [Webpack](FrontEnd/01 前端工具/Webpack.md)
      • [Web Storm](FrontEnd/01 前端工具/WebStorm.md)
    • 04 Java Script
      • [javascript上传图片检测宽度高度文件大小](FrontEnd/04 JavaScript/javascript上传图片检测宽度高度文件大小.md)
      • [js中iframe的使用](FrontEnd/04 JavaScript/js中iframe的使用.md)
    • 10 Vue
      • [开源项目库汇总](FrontEnd/10 Vue/开源项目库汇总.md)
      • [学习步骤](FrontEnd/10 Vue/学习步骤.md)
      • [Awesome](FrontEnd/10 Vue/awesome.md)
      • [My Vue](FrontEnd/10 Vue/MyVue.md)
      • [Vue](FrontEnd/10 Vue/Vue.md)
      • [Vuejs入门](FrontEnd/10 Vue/Vuejs入门.md)
    • x1 资源
      • [博客推荐](FrontEnd/x1 资源/博客推荐.md)
    • x2 常见问题
      • [Cross Domain](FrontEnd/x2 常见问题/Cross-domain.md)
  • Notes
    • 1.Shell
      • 常用命令
      • 替换功能
      • Gocron处理Docker进程的问题
      • Shell中date命令用法
      • shell字符串
    • 编码
      • 参考资料
      • 代码调试
      • 代码规范
      • 代码简洁之道
      • 代码质量
      • 代码走查
    • 监控
      • Prometheus
    • 开发
      • 脚本常见问题
    • 开发流程
      • 持续集成
    • 其他
      • Gitbook自动生成SUMMARY
    • API
      • API加密方案
      • api设计
    • Git
      • 常见问题
      • 代码回滚
      • 多版本工作流
      • 工作流
      • 快速入门Git
      • 三路合并
      • [git blame出现的人员不一致](Notes/Git/git blame出现的人员不一致.md)
      • Git撤销merge合并
      • Git忽略.gitignore
      • Git远程分支
    • HTTP
      • 499问题处理
      • HTTP状态码
    • Linux
      • 安装扩展
      • 回收站
      • 解析配置
      • 命令
      • 文件权限问题
      • [Apache 和 nginx](Notes/Linux/Apache 和 nginx.md)
      • [Linux 防止rm误删文件,将rm配置成mv到.trash ](Notes/Linux/Linux 防止rm误删文件,将rm配置成mv到.trash .md)
      • [Linux 中 Crontab 定时任务执行时的环境变量问题](Notes/Linux/Linux 中 Crontab 定时任务执行时的环境变量问题.md)
      • [Linux下执行shell脚本,提示No such file or directory](Notes/Linux/Linux下执行shell脚本,提示No such file or director
      • linux压缩和解压缩命令大全
      • Untitled
      • Vim批量替换
    • Nginx
      • ERR_CONTENT_LENGTH_MISMATCH解决方法
      • [Nginx 和 Apache 各有什么优缺点?](Notes/Nginx/Nginx 和 Apache 各有什么优缺点?.md)
      • windows下安装LNMP
  • Ops
    • 软件和架构标准化
  • PHP
    • 0.原理
      • php的四种运行模式
    • 1.语言参考
      • 命名空间
      • 事件系统
      • 数组
      • 注解
      • Collection
    • 2.编码
      • 代码分析
      • 事务和锁代码优化
      • Sonar Qube
      • Validate
    • 3.框架
      • 基础
        • Swoole高效跟传统的web开发区别
      • Codeigniter
        • 安全性
        • 钩子
        • 缓存机制
        • 路由
        • 配置管理
        • Common
        • MVC
        • ORM的接口
      • Laravel
        • 介绍
        • 最佳实践
      • Laravel Admin
        • 介绍
      • Lumen
        • 脚本
        • 入门
      • Slim
        • 如何编写Cron脚本
      • Swoft
        • 数据库操作
          • Dao
          • [x0 学习资料](PHP/3.框架/Swoft/数据库操作/x0 学习资料.md)
        • [0. 安装](PHP/3.框架/Swoft/0. 安装.md)
        • [1. 目录结构](PHP/3.框架/Swoft/1. 目录结构.md)
        • [2. 生命周期](PHP/3.框架/Swoft/2. 生命周期.md)
        • [3. HTTP服务](PHP/3.框架/Swoft/3. HTTP服务.md)
        • [4. 缓存](PHP/3.框架/Swoft/4. 缓存.md)
        • [6. 视图](PHP/3.框架/Swoft/6. 视图.md)
        • 注解
        • Task
        • [x1. 问题](PHP/3.框架/Swoft/x1. 问题.md)
      • Swoole
        • swoole协程
      • Tars
        • 安装后台
    • 4.进阶
      • 加密
        • AES
      • 进程
        • 管道
        • 进程间通信
      • 扩展
        • 如何编写一个PHP的C扩展
      • 内核
        • 参考资料
        • 看源码原则
      • Composer
        • 参数
        • 钩子
        • 类加载优化
        • PSR
    • 5.性能
      • 调用链
        • 跟踪系统
      • 性能分析
        • 非侵入式监控平台
        • 接口性能分析实践
        • Xhprof
      • Notes
        • [Opcache 和 APCu的关系](PHP/5.性能/Notes/Opcache 和 APCu的关系.md)
      • 并发和异步
      • APCU
      • Xdebug
    • 6.常见问题
      • 常见问题
      • 常用函数
      • 反射类
      • 浮点数的精度
      • 环境搭建常见问题
      • [获取当前客户端的 IP 地址](PHP/6.常见问题/获取当前客户端的 IP 地址.md)
      • 垃圾回收机制
      • 敏感词过滤
      • 魔术方法
      • 内网和外网
      • 生成器
      • 事务处理
      • 无法常驻内存
      • 析构函数
      • 字符串加密解密
      • AOP
      • Curl
      • GET与POST的区别
      • include和require的区别
      • IP地址函数ip2long
      • Iterator
      • JSON
      • JSON解密的问题
      • [Nginx 设置 PHP_VALUE 的灵异问题](PHP/6.常见问题/Nginx 设置 PHP_VALUE 的灵异问题.md)
      • Nginx和PHP-fpm的关系
      • [php 后端实现JWT认证方法](PHP/6.常见问题/php 后端实现JWT认证方法.md)
      • [PHP Jit](PHP/6.常见问题/PHP jit.md)
      • PHP程序如何debug
      • PHP升级可能导致的坑
      • php数组
      • PHP注解的实现
      • [Session 和 Cookie](PHP/6.常见问题/Session 和 Cookie.md)
      • xdebug的使用
    • 7.不足
      • 无法常驻内存
    • 8.面试题
      • 参考资料
      • 面试题
  • Resource
    • Github
      • Github项目推荐
    • Interview
      • 腾讯面试
    • Tools
      • Git
        • 代码回滚
        • 多版本工作流
        • 工作流
        • Git忽略.gitignore
        • Source Tree
      • 流程图
      • 思维导图
      • Markdown
      • Other
      • Postman
      • Sublime
    • Website
  • Team
    • 研发效能
      • 持续开发
      • 定义
      • 度量
    • 工作总结
    • 研发体系
  • Web
    • 多环境测试方案
    • 应用框架
    • Web测试
    • Web基础开发
Powered by GitBook
On this page
  • 1、缩短键值对的存储长度;
  • 2、使用 lazy free(延迟删除)特性;
  • 3、设置键值的过期时间;
  • 4、禁用长耗时的查询命令;
  • 5、使用 slowlog 优化耗时命令;
  • 6、使用 Pipeline 批量操作数据;
  • 7、避免大量数据同时失效;
  • 8、客户端使用优化;
  • 9、限制 Redis 内存大小;
  • 10、使用物理机而非虚拟机安装 Redis 服务;
  • 11、检查数据持久化策略;
  • 12、禁用 THP 特性;
  • 13、使用分布式架构来增加读写速度。
  • 参考资料
  1. Data Base
  2. Redis
  3. 进阶

优化建议

1、缩短键值对的存储长度;

2、使用 lazy free(延迟删除)特性;

lazy free 对应了 4 种场景,默认都是关闭的:

lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
slave-lazy-flush no

它们代表的含义如下:

  • lazyfree-lazy-eviction:表示当 Redis 运行内存超过 maxmeory 时,是否开启 lazy free 机制删除;

  • lazyfree-lazy-expire:表示设置了过期时间的键值,当过期之后是否开启 lazy free 机制删除;

  • lazyfree-lazy-server-del:有些指令在处理已存在的键时,会带有一个隐式的 del 键的操作,比如 rename 命令,当目标键已存在,Redis 会先删除目标键,如果这些目标键是一个 big key,就会造成阻塞删除的问题,此配置表示在这种场景中是否开启 lazy free 机制删除;

  • slave-lazy-flush:针对 slave(从节点) 进行全量数据同步,slave 在加载 master 的 RDB 文件前,会运行 flushall 来清理自己的数据,它表示此时是否开启 lazy free 机制删除。

建议开启其中的 lazyfree-lazy-eviction、lazyfree-lazy-expire、lazyfree-lazy-server-del 等配置,这样就可以有效的提高主线程的执行效率。

3、设置键值的过期时间;

我们应该根据实际的业务情况,对键值设置合理的过期时间,这样 Redis 会帮你自动清除过期的键值对,以节约对内存的占用,以避免键值过多的堆积,频繁的触发内存淘汰策略。

4、禁用长耗时的查询命令;

Redis 绝大多数读写命令的时间复杂度都在 O(1) 到 O(N) 之间,在官方文档对每命令都有时间复杂度说明,地址:https://redis.io/commands

5、使用 slowlog 优化耗时命令;

我们可以使用 slowlog 功能找出最耗时的 Redis 命令进行相关的优化,以提升 Redis 的运行速度,慢查询有两个重要的配置项:

  • slowlog-log-slower-than :用于设置慢查询的评定时间,也就是说超过此配置项的命令,将会被当成慢操作记录在慢查询日志中,它执行单位是微秒 (1 秒等于 1000000 微秒);

  • slowlog-max-len :用来配置慢查询日志的最大记录数。

我们可以根据实际的业务情况进行相应的配置,其中慢日志是按照插入的顺序倒序存入慢查询日志中,我们可以使用 slowlog get n 来获取相关的慢查询日志,再找到这些慢查询对应的业务进行相关的优化。

6、使用 Pipeline 批量操作数据;

7、避免大量数据同时失效;

Redis 过期键值删除使用的是贪心策略,它每秒会进行 10 次过期扫描,此配置可在 redis.conf 进行配置,默认值是 hz 10,Redis 会随机抽取 20 个值,删除这 20 个键中过期的键,如果过期 key 的比例超过 25% ,重复执行此流程,如下图所示:

如果在大型系统中有大量缓存在同一时间同时过期,那么会导致 Redis 循环多次持续扫描删除过期字典,直到过期字典中过期键值被删除的比较稀疏为止,而在整个执行过程会导致 Redis 的读写出现明显的卡顿,卡顿的另一种原因是内存管理器需要频繁回收内存页,因此也会消耗一定的 CPU。

为了避免这种卡顿现象的产生,我们需要预防大量的缓存在同一时刻一起过期,就简单的解决方案就是在过期时间的基础上添加一个指定范围的随机数。

8、客户端使用优化;

在客户端的使用上我们除了要尽量使用 Pipeline 的技术外,还需要注意要尽量使用 Redis 连接池,而不是频繁创建销毁 Redis 连接,这样就可以减少网络传输次数和减少了非必要调用指令。

9、限制 Redis 内存大小;

在 64 位操作系统中 Redis 的内存大小是没有限制的,也就是配置项 maxmemory 是被注释掉的,这样就会导致在物理内存不足时,使用 swap 空间既交换空间,而当操心系统将 Redis 所用的内存分页移至 swap 空间时,将会阻塞 Redis 进程,导致 Redis 出现延迟,从而影响 Redis 的整体性能。因此我们需要限制 Redis 的内存大小为一个固定的值,当 Redis 的运行到达此值时会触发内存淘汰策略,内存淘汰策略在 Redis 4.0 之后有 8 种:

  1. noeviction:不淘汰任何数据,当内存不足时,新增操作会报错,Redis 默认内存淘汰策略;

  2. allkeys-lru:淘汰整个键值中最久未使用的键值;

  3. allkeys-random:随机淘汰任意键值;

  4. volatile-lru:淘汰所有设置了过期时间的键值中最久未使用的键值;

  5. volatile-random:随机淘汰设置了过期时间的任意键值;

  6. volatile-ttl:优先淘汰更早过期的键值。

在 Redis 4.0 版本中又新增了 2 种淘汰策略:

  1. volatile-lfu:淘汰所有设置了过期时间的键值中,最少使用的键值;

  2. allkeys-lfu:淘汰整个键值中最少使用的键值。

其中 allkeys-xxx 表示从所有的键值中淘汰数据,而 volatile-xxx 表示从设置了过期键的键值中淘汰数据。

我们可以根据实际的业务情况进行设置,默认的淘汰策略不淘汰任何数据,在新增时会报错。

10、使用物理机而非虚拟机安装 Redis 服务;

在虚拟机中运行 Redis 服务器,因为和物理机共享一个物理网口,并且一台物理机可能有多个虚拟机在运行,因此在内存占用上和网络延迟方面都会有很糟糕的表现,我们可以通过 ./redis-cli --intrinsic-latency 100 命令查看延迟时间,如果对 Redis 的性能有较高要求的话,应尽可能在物理机上直接部署 Redis 服务器。

11、检查数据持久化策略;

Redis 的持久化策略是将内存数据复制到硬盘上,这样才可以进行容灾恢复或者数据迁移,但维护此持久化的功能,需要很大的性能开销。

在 Redis 4.0 之后,Redis 有 3 种持久化的方式:

  • RDB(Redis DataBase,快照方式)将某一个时刻的内存数据,以二进制的方式写入磁盘;

  • AOF(Append Only File,文件追加方式),记录所有的操作命令,并以文本的形式追加到文件中;

  • 混合持久化方式,Redis 4.0 之后新增的方式,混合持久化是结合了 RDB 和 AOF 的优点,在写入的时候,先把当前的数据以 RDB 的形式写入文件的开头,再将后续的操作命令以 AOF 的格式存入文件,这样既能保证 Redis 重启时的速度,又能减低数据丢失的风险。

RDB 和 AOF 持久化各有利弊,RDB 可能会导致一定时间内的数据丢失,而 AOF 由于文件较大则会影响 Redis 的启动速度,为了能同时拥有 RDB 和 AOF 的优点,Redis 4.0 之后新增了混合持久化的方式,因此我们在必须要进行持久化操作时,应该选择混合持久化的方式。

查询是否开启混合持久化可以使用 config get aof-use-rdb-preamble 命令,执行结果如下图所示:

其中 yes 表示已经开启混合持久化,no 表示关闭,Redis 5.0 默认值为 yes。如果是其他版本的 Redis 首先需要检查一下,是否已经开启了混合持久化,如果关闭的情况下,可以通过以下两种方式开启:

  • 通过命令行开启

  • 通过修改 Redis 配置文件开启

① 通过命令行开启

使用命令 config set aof-use-rdb-preamble yes 执行结果如下图所示:

命令行设置配置的缺点是重启 Redis 服务之后,设置的配置就会失效。

② 通过修改 Redis 配置文件开启

在 Redis 的根路径下找到 redis.conf 文件,把配置文件中的 aof-use-rdb-preamble no 改为 aof-use-rdb-preamble yes 如下图所示:

配置完成之后,需要重启 Redis 服务器,配置才能生效,但修改配置文件的方式,在每次重启 Redis 服务之后,配置信息不会丢失。

需要注意的是,在非必须进行持久化的业务中,可以关闭持久化,这样可以有效的提升 Redis 的运行速度,不会出现间歇性卡顿的困扰。

12、禁用 THP 特性;

Linux kernel 在 2.6.38 内核增加了 Transparent Huge Pages (THP) 特性 ,支持大内存页 2MB 分配,默认开启。

当开启了 THP 时,fork 的速度会变慢,fork 之后每个内存页从原来 4KB 变为 2MB,会大幅增加重写期间父进程内存消耗。同时每次写命令引起的复制内存页单位放大了 512 倍,会拖慢写操作的执行时间,导致大量写操作慢查询。例如简单的 incr 命令也会出现在慢查询中,因此 Redis 建议将此特性进行禁用,禁用方法如下:

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

为了使机器重启后 THP 配置依然生效,可以在 /etc/rc.local 中追加 echo never > /sys/kernel/mm/transparent_hugepage/enabled。

13、使用分布式架构来增加读写速度。

Redis 分布式架构有三个重要的手段:

  • 主从同步

  • 哨兵模式

  • Redis Cluster 集群

使用主从同步功能我们可以把写入放到主库上执行,把读功能转移到从服务上,因此就可以在单位时间内处理更多的请求,从而提升的 Redis 整体的运行速度。

而哨兵模式是对于主从功能的升级,但当主节点奔溃之后,无需人工干预就能自动恢复 Redis 的正常使用。

Redis Cluster 是 Redis 3.0 正式推出的,Redis 集群是通过将数据库分散存储到多个节点上来平衡各个节点的负载压力。

Redis Cluster 采用虚拟哈希槽分区,所有的键根据哈希函数映射到 0 ~ 16383 整数槽内,计算公式:slot = CRC16(key) & 16383,每一个节点负责维护一部分槽以及槽所映射的键值数据。这样 Redis 就可以把读写压力从一台服务器,分散给多台服务器了,因此性能会有很大的提升。

在这三个功能中,我们只需要使用一个就行了,毫无疑问 Redis Cluster 应该是首选的实现方案,它可以把读写压力自动的分担给更多的服务器,并且拥有自动容灾的能力。

参考资料

https://mp.weixin.qq.com/s/F552aUKVh-y8aOyZUBAuZw

Previous性能分析Nextredis升级

Last updated 3 years ago

img
img
img
img