## 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框架的生命周期