## redis变慢的原因
* 使用复杂度过高的命令
~~~
设置慢日志的阈值
命令执行耗时超过 5 毫秒,记录慢日志
CONFIG SET slowlog-log-slower-than 5000
只保留最近 500 条慢日志
CONFIG SET slowlog-max-len 500
(1)经常使用 O(N) 以上复杂度的命令,例如 SORT、SUNION、ZUNIONSTORE 聚合类命令
(2)使用 O(N) 复杂度的命令,但 N 的值非常大(注:N<=300最佳)
~~~
* 操作bigkey
插入数据分配内存时比较耗时,删除数据释放内存也会比较耗时
* 集中过期
主动过期策略的原因
**这个主动过期 key 的定时任务,是在 Redis 主线程中执行的**。
也就是说如果在执行主动过期的过程中,出现了需要大量删除过期 key 的情况,那么此时应用程序在访问 Redis 时,必须要等待这个过期任务执行结束,Redis 才可以服务这个客户端请求。此时就会出现,应用访问 Redis 延时变大。
* 实例内存达到上限
配置了**maxmemory**,设置了内存淘汰策略,写入是延迟变大,当 Redis 内存达到 maxmemory 后,每次写入新的数据之前,**Redis 必须先从实例中踢出一部分数据,让整个实例的内存维持在 maxmemory 之下**,然后才能把新数据写进来
* fork耗时严重
~~~
操作 Redis 延迟变大,都发生在 Redis 后台 RDB 和 AOF rewrite 期间**,那你就需要排查,在这期间有可能导致变慢的情况。
当 Redis 开启了后台 RDB 和 AOF rewrite 后,在执行时,它们都需要主进程创建出一个子进程进行数据的持久化。
主进程创建子进程,会调用操作系统提供的 fork 函数。
而 fork 在执行过程中,**主进程需要拷贝自己的内存页表给子进程**,如果这个实例很大,那么这个拷贝的过程也会比较耗时。
~~~
补充:
什么是内存大页?
我们都知道,应用程序向操作系统申请内存时,是按**内存页**进行申请的,而常规的内存页大小是 4KB。
Linux 内核从 2.6.38 开始,支持了**内存大页机制**,该机制允许应用程序以 2MB 大小为单位,向操作系统申请内存。
应用程序每次向操作系统申请的内存单位变大了,但这也意味着申请内存的耗时变长。
内容来源:https://mp.weixin.qq.com/s/iYCiaa53nXWugU5uTHjeSw
- 消息队列
- 为什么要用消息队列
- 各种消息队列产品的对比
- 消息队列的优缺点
- 如何保证消息队列的高可用
- 如何保证消息不丢失
- 如何保证消息不会重复消费?如何保证消息的幂等性?
- 如何保证消息消费的顺序性?
- 基于MQ的分布式事务实现
- Beanstalk
- PHP
- 函数
- 基础
- 基础函数题
- OOP思想及原则
- MVC生命周期
- PHP7.X新特性
- PHP8新特性
- PHP垃圾回收机制
- php-fpm相关
- 高级
- 设计模式
- 排序算法
- 正则
- OOP代码基础
- PHP运行原理
- zavl
- 网络协议new
- 一面
- TCP和UDP
- 常见状态码和代表的意义以及解决方式
- 网络分层和各层有啥协议
- TCP
- http
- 二面
- TCP2
- DNS
- Mysql
- 锁
- 索引
- 事务
- 高可用?高并发?集群?
- 其他
- 主从复制
- 主从复制数据延迟
- SQL的语⾔分类
- mysqlQuestions
- Redis
- redis-question
- redis为什么那么快
- redis的优缺点
- redis的数据类型和使用场景
- redis的数据持久化
- 过期策略和淘汰机制
- 缓存穿透、缓存击穿、缓存雪崩
- redis的事务
- redis的主从复制
- redis集群架构的理解
- redis的事件模型
- redis的数据类型、编码、数据结构
- Redis连接时的connect与pconnect的区别是什么?
- redis的分布式锁
- 缓存一致性问题
- redis变慢的原因
- 集群情况下,节点较少时数据分布不均匀怎么办?
- redis 和 memcached 的区别?
- 基本算法
- MysqlNew
- 索引new
- 事务new
- 锁new
- 日志new
- 主从复制new
- 树结构
- mysql其他问题
- 删除
- 主从配置
- 五种IO模型
- Kafka
- Nginx
- trait
- genergtor 生成器
- 如何实现手机扫码登录功能
- laravel框架的生命周期