- 說明:一般redis作為緩存工具使用,例如統計類數據,熱點數據放在redis,因為redis是內存數據庫,讀取速度很可觀,能夠有效減輕mysql壓力;
- 注意:需要注意的是緩存穿透和雪崩問題
- 緩存穿透即繞過redis直接讀取mysql,例如熱點數據為空,不保存redis,導致每次請求讀取不到redis時都去查詢MySQL,建議是空數據時也要寫一個空值到redis中,并且設置一個小的過期時間(如幾分鐘等等);
- 緩存雪崩是redis突然失效,導致所有請求都去到了mysql,這種情況簡單方法是用互斥鎖,網上還有各種方法自行搜索
<br/>
##### 緩存穿透
```php
if (!($cacheData = $redis->get('key'))) {
$data = $mysql->getData();
if (empty($data)) {
$redis->set('key', json_encode($data), 60); // 當數據為空時,設置一個小的過期時間,這樣的好處是可以減低數據更新延時率
} else {
$redis->set('key', json_encode($data), 7200); // 正常的過期時間為兩個小時
}
}
```
##### 緩存雪崩 (參考:http://huoding.com/2015/09/14/463)
```php
$key = 'cache_create_lock'; // 鎖的名稱
$value = sha1(uniqid(getmypid().'_'.mt_rand().'_', true)); // 唯一值,加入唯一值判斷是為了避免刪除到其他操作的鎖(這種情況是發生在生成cache過程很久導致鎖到了過期時間,此時鎖被另一個用戶拿到,而當代碼繼續執行時,會把另一個用戶拿到的鎖誤刪掉)
$ttl = 10; // ttl表示超時時間time to live,單位是秒.
if ($redis->set($key, $value, array('nx', 'ex' => $ttl))) { // 鎖: nx表示not exists. ex表示expire.
$cache->create(); // 加鎖后執行業務邏輯,這里是生成緩存,注意鎖的過期時間必須比create長,否則會出現死鎖
if ($redis->get($key) === $value) { // 認證鎖,防止誤刪
$redis->del($key);
}
} else {
// 拿不到鎖,是sleep幾秒后重新查詢緩存,還是直接返回系統繁忙狀態?
// 緩存失效,又拿不到鎖生成緩存,怎么辦?直接返回請求失敗?
}
```
- php
- 編譯安裝
- 基本概念
- 垃圾回收機制
- 生命周期
- zval底層實現
- c擴展開發
- gdb調試工具
- 自定義擴展簡單demo
- 鉤子函數
- 讀取php.ini配置
- 數組
- 函數
- 類
- yaf擴展底層源碼
- swoole擴展底層源碼
- memoryGlobal內存池
- swoole協程使用記錄
- 單點登錄sso原理
- compser使用
- session實現機制
- c & linux
- gcc
- 指針
- 結構體,聯合和位字段
- 宏定義井號說明
- printf家族函數和可變參數
- 共享函數
- 靜態庫和動態庫
- makefile自動化構建
- 信號一
- 信號二
- inotify監控文件事件
- socket編程
- 簡介
- UNIX DOMAIN
- Internet DOMAIN
- TCP/IP
- 文件IO多路復用
- 內存管理
- 進程組,會話和控制終端
- daemon守護進程
- 多進程
- 多線程
- 常用進制轉換
- go
- 入門知識
- 字節和整數裝換
- python
- redis
- 應用場景
- 消息隊列
- 熱點數據
- 掃碼登錄
- 訂閱發布
- 次數限制
- 搶購超賣
- 持久化機制
- mysql
- 工作流程
- MyISAM和InnoDB區別
- 用戶和權限管理
- 執行計劃
- sql優化
- 事務和鎖
- 慢查詢日志
- case...when...then...end用法
- sql
- 參考
- linux
- 內核參數優化
- 防火墻設置
- docker
- docker入門知識
- 算法
- 多維數組合
- DFA算法
- 紅包金額分配