Redis緩存Mysql技術實作:
Redis緩存的相關内容這裡不介紹,具體可參考博文《Redis安裝、配置及拓展使用總結》。而這裡着重介紹下Redis如何緩存Mysql的IO壓力,做到可觀的性能提升目的。在實際的業務需求下,随着企業資料量的不斷遞增,通路資料庫的IO頻率大大提升,即使Mysql做了相關的優化,但也不能滿足需求,時而等待許久服務端才會響應。
· 準備工作
· 緩存實作
一、準備工作
1、資料建構
結合上一篇文章《Redis管道技術使用總結》中的資料同步為例進行說明,位址:
http://blog.csdn.net/why_2012_gogo/article/details/51260264
2、緩存描述
以使用者登入為例進行說明(隻實作背景部分,使用Redis前提是使用者量已經達到百萬級,否則有點大才小用)。首先從Redis中查詢(為了提高通路響應速度),前提是Mysql中的資料已經同步到Redis中,如果Redis中已經存在該使用者,那麼就直接從其中擷取并傳回,否則再從Mysql中讀取。
二、緩存實作
Redis緩存Mysql的實作比較簡單,在文章的叙述部分已經說明,這裡不再贅述。這部分主要介紹的内容是介紹如何從Redis和mysql中擷取資料,如何緩存Mysql的基本實作,因為前面已經做好了Redis和Mysql之間的資料格式協定,并在同步的時候,就将redis的Hash做好了對應關系,并轉化為json格式。
1、PHP代碼
<?php
// 使用Redis緩存Mysql
public function redisCacheMysql(){
header("Content-Type:text/html;charset=utf-8");
$uRedis = new \Redis();
$uRedis->connect('127.0.0.1',6379);
// 前端獲得的賬号資訊(這隻是示範例子,也隻是一種方式)
$account = 'cwteam';
$password = 'e10adc3949ba59abbe56e057f20f883e';
$result = '';
$userKey = $account.$password.'_hash';
// 先從Redis中取,如果沒有就去請求mysql
if(!$uRedis->exists($userKey)) {
// 不存在 讀取資料庫
$where = array();
$where['account'] = $account;
$where['password'] = $password;
$user = D('UserInfo')->where($where)->find();
if($user) {
$result .= json_encode($user).'</br>';
} else {
$result .= '結果:該使用者不存在!</br>';
}
$result .= '我從mysql中讀取的!';
} else {
// 存在 就從redis中取
$user =$uRedis->hGetAll($userKey);
if($user) {
$result .=json_encode($user).'</br>';
} else {
$result .= '結果:該使用者不存在!</br>';
}
$result .= '我從Redis中讀取的!';
}
echo '結果:'.$result .= '</br>';
}
?>
2、結果驗證
Redis無緩存時:
此時,我們可以在mysql中新增一條Redis中未緩存的記錄,然後執行:
Redis有緩存時:
NOTE:
使用Redis緩存Mysql的實作是很有必要的,當實際資料量很大并且請求頻次很高的時候,Redis就凸顯出了它的優勢所在,這樣做的目的有:a、減輕資料庫IO的壓力,b、提高使用者請求響應的速度。
技術讨論群:
489451956(新)