上一篇 Redis三部曲(一)介紹了Laravel中Predis的幾種基本數(shù)據(jù)類型的使用和Redis的概念担敌,但是就算會寫了碧库,然而緩存什么時候使用呢堪夭??惹想?
下面就結合上一篇的內(nèi)容給大家說說Predis的一些組合用法问词,隊列如何配合STRING類型或者HASH類型來組合使用,甚至把非關系變成和MySQl一樣成為關系型的嘀粱。
隊列與哈希的組合使用 - 實現(xiàn)數(shù)據(jù)關系化
思路:利用隊列里的值來做需要取數(shù)據(jù)的唯一索引激挪,利用哈希的key的后綴名做原型數(shù)據(jù)的唯一索引
隊列和哈希的組合使用優(yōu)勢是,取出來可以直接使用锋叨,劣勢在于內(nèi)存占用相比較字符串而言要大
-
實例:因為Redis只能存數(shù)組而我們實例為了方便直接用DB類來寫的垄分,如果是ORM可以直接返回數(shù)組的
/** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { // $where = ['status'=>'1']; $obj = \DB::table('data_admin_login')->where($where)->get(); $array = $this->objectToArray($obj); dd($array); }
打印的數(shù)據(jù)如下:
-
接下來 我們要把從數(shù)據(jù)庫取出來的數(shù)據(jù)存入Redis,用什么樣的方法存娃磺,用什么樣的方法取薄湿,這些東西都得考慮好;下面實例如下:
/** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { // $where = ['status'=>'1']; $obj = \DB::table('data_admin_login')->where($where)->get(); $array = $this->objectToArray($obj); // 定義Redis的key $listKey = 'LIST:TEST:ADMIN'; $hashKey = 'HASH:TEST:ADMIN:'; // 遍歷時寫入Redis list為索引 hash為數(shù)據(jù) foreach($array as $v){ \Redis::rpush($listKey,$v['guid']); \Redis::hMset($hashKey.$v['guid'],$v); } return '緩存寫入成功'; }
-
查看下redis里面的情況
- 第一個 查看所有key 發(fā)現(xiàn)有1個隊列和16個哈希
- 第二個 取LIST:TEST:ADMIN 整個隊列 發(fā)現(xiàn)有16個 唯一識別ID的數(shù)據(jù)(而且順序和從數(shù)據(jù)庫取出來的順序是一樣的)
-
第三個取出其中一個哈希查看數(shù)據(jù)
可以看出來 我們想要的數(shù)據(jù)已經(jīng)存入了redis中偷卧,接下來豺瘤,如果我想通過redis直接獲取MySQL中管理員的列表數(shù)據(jù)怎么使用呢?
/** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { // // 定義Redis的key $listKey = 'LIST:TEST:ADMIN'; $hashKey = 'HASH:TEST:ADMIN:'; // 取出admin隊列的唯一識別id數(shù)組 $list = \Redis::lrange($listKey,0,-1); $array = null; foreach($list as $v){ // 取出哈希里的數(shù)據(jù)寫入大數(shù)組中 $array[] = \Redis::hGetall($hashKey.$v); } dd($array); }
我們來看看打印的結果
這樣取出來的數(shù)據(jù)是不是一樣可以遍歷到模版上?
-
-
最后來完整的做一個例子
思路:我們的目的是從redis里面取出想要輸出到模版上的數(shù)據(jù)听诸,但是redis大家也知道坐求,只是緩存服務器重啟了,就沒了(除非做磁盤持久化),但是我要做的是如果Redis里面沒有我要從MySQL里面取蛇更,取到了然后寫入Redis瞻赶,保證對MySQL的請求大大減少。
/** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { // // 定義Redis的key $listKey = 'LIST:TEST:ADMIN'; $hashKey = 'HASH:TEST:ADMIN:'; // 查看key是否存在派任? if(empty(\Redis::exists($listKey))){ // 如果Redis不存在 讀數(shù)據(jù)庫然后寫入redis $where = ['status'=>'1']; $obj = \DB::table('data_admin_login')->where($where)->get(); $array = $this->objectToArray($obj); // 遍歷時寫入Redis list為索引 hash為數(shù)據(jù) foreach($array as $v){ \Redis::rpush($listKey,$v['guid']); \Redis::hMset($hashKey.$v['guid'],$v); } return $array; } // 如果redis存在 直接讀redis的數(shù)據(jù) // 取出admin隊列的唯一識別id數(shù)組 $list = \Redis::lrange($listKey,0,-1); $array = null; foreach($list as $v){ $array[] = \Redis::hGetall($hashKey.$v); } return $array; }
不管我把redis的key手動刪除還是redis的key存在 我們輸出的都是這個(這是我的瀏覽器插件json-handle的效果)
刪除redis的key 效果依舊
-
那么肯定有人又要問了 你這只是在讀數(shù)據(jù)庫 如果我增 刪 改 后 redis不同步了哇
是這樣的砸逊,所以一般我們在實際商業(yè)項目中 做一個大型的redis數(shù)據(jù)隔離都需要把mysql的增刪改 綁上同步的redis操作,這樣下來掌逛,我每次讀redis既大大的提升了性能师逸,也保障了數(shù)據(jù)的同步性
-
下面拿添加做一個實例,如何MySQL與redis數(shù)據(jù)同步
-
restfulApi 添加方法
/** * Show the form for creating a new resource. * * @return \Illuminate\Http\Response */ public function create() { // // 定義Redis的key $listKey = 'LIST:TEST:ADMIN'; $hashKey = 'HASH:TEST:ADMIN:'; $data = [ 'guid'=> '12341234123412341234123412341234', 'email'=> 'adminadmin@163.com', 'password'=> '111dcfeb6d42b320d9b885f1b8fa498a', 'status'=> '1', 'sroce'=> '0', 'addtime'=> time(), 'logintime'=> '', 'ip'=> '' ]; $temp = \DB::table('data_admin_login')->insert($data); if($temp){ \Redis::rpush($listKey,$data['guid']); \Redis::hMset($hashKey.$data['guid'],$data); return '寫入成功'; } return '寫入失敗'; }
頁面響應:寫入成功
-
redis查看一下有沒有同步寫入
我們發(fā)現(xiàn)數(shù)據(jù)同步進入了redis
index方法代碼不變 再請求一次 數(shù)據(jù)也明顯同步了
-
-
-
以上講的就是最基本的redis隔離技術豆混,當然為了提現(xiàn)的簡單點篓像,直接都寫在控制器里面了动知,并沒有做過多的分層調(diào)用,RedisKey也沒有做配置話员辩,而是反復在用盒粮;實際項目中Redis是可以單獨做一個模塊的,架構的層級分化明確了也可以大大的提升Redis的復用性;當然這些只是建議和思路奠滑,主要還是看當前每個人手頭的架構為主丹皱。
-
其他組合關系型方法
至于其他的關系型的組合方法就在下面簡要做做介紹了,純手碼寫得也挺累,望大家體諒宋税。摊崭。
-
隊列和字符串類型
隊列和字符串類型一樣可以把數(shù)據(jù)關系型
思路:同樣的list存索引的key(ID或唯一識別ID),字符串存json字符串,字符串的key同樣后綴加唯一識別ID來進行區(qū)分。當需要輸出到頁面上的時候json_decode過來就行了
隊列和字符串的優(yōu)點是存儲的空間小杰赛,劣勢在于存的時候要解析成字符串呢簸,取的時候要解析為數(shù)組或?qū)ο?/p>
-
集合和字符串類型
集合和字符串類型一樣可以把數(shù)據(jù)關系型
思路:大家應該都知道 redis集合有有序集合和無序集合之分,在有些場景中乏屯,其實用集合的形勢反而更靈活(多維度集合控制)根时,比如 關注我的人、我關注的人辰晕、同時互相關注的啸箫、QQ中的'可能認識的人'、異步寫入時分區(qū)間等等等...
-
集合和哈希類型(第三部實戰(zhàn)將用這個)
思路其實就是和上面差不多伞芹,也就是存儲方便忘苛,消耗內(nèi)存相比較而言較大。
-
本篇基本都是參照倡哥博客而來唱较,因為筆者也是看著博客學會的扎唾,所以直接拿來分享給大家,若有需要歡迎轉(zhuǎn)載南缓,但是務必注明來源胸遇,否則后果自負(丟丟哥不會饒了你哦)
第三篇將會是筆者根據(jù)自己最近的實戰(zhàn)經(jīng)驗,感想而來的汉形,純自己手碼纸镊,歡迎拍磚!當然還是歡迎轉(zhuǎn)載概疆,請注明來源
博客地址:http://blog8090.com