Redis 三部曲之第二部 laravel中Redis 基本的數(shù)據(jù)隔離

上一篇 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)存占用相比較字符串而言要大

  1. 實例:因為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ù)如下:


  2. 接下來 我們要把從數(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ù)是不是一樣可以遍歷到模版上?

  3. 最后來完整的做一個例子

    思路:我們的目的是從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 效果依舊

  4. 那么肯定有人又要問了 你這只是在讀數(shù)據(jù)庫 如果我增 刪 改 后 redis不同步了哇

    是這樣的砸逊,所以一般我們在實際商業(yè)項目中 做一個大型的redis數(shù)據(jù)隔離都需要把mysql的增刪改 綁上同步的redis操作,這樣下來掌逛,我每次讀redis既大大的提升了性能师逸,也保障了數(shù)據(jù)的同步性

    • 下面拿添加做一個實例,如何MySQL與redis數(shù)據(jù)同步

      1. 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 '寫入失敗';
             }
        

        頁面響應:寫入成功

        1. redis查看一下有沒有同步寫入

          我們發(fā)現(xiàn)數(shù)據(jù)同步進入了redis

        2. 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

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末逗威,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子岔冀,更是在濱河造成了極大的恐慌凯旭,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異罐呼,居然都是意外死亡鞠柄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門嫉柴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來厌杜,“玉大人,你說我怎么就攤上這事计螺∑诒迹” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵危尿,是天一觀的道長。 經(jīng)常有香客問我馁痴,道長谊娇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任罗晕,我火速辦了婚禮济欢,結果婚禮上,老公的妹妹穿的比我還像新娘小渊。我一直安慰自己法褥,他們只是感情好,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布酬屉。 她就那樣靜靜地躺著半等,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呐萨。 梳的紋絲不亂的頭發(fā)上杀饵,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音谬擦,去河邊找鬼切距。 笑死,一個胖子當著我的面吹牛惨远,可吹牛的內(nèi)容都是我干的谜悟。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼北秽,長吁一口氣:“原來是場噩夢啊……” “哼葡幸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起贺氓,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤礼患,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缅叠,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡悄泥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了肤粱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弹囚。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖领曼,靈堂內(nèi)的尸體忽然破棺而出鸥鹉,到底是詐尸還是另有隱情,我是刑警寧澤庶骄,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布毁渗,位于F島的核電站,受9級特大地震影響单刁,放射性物質(zhì)發(fā)生泄漏灸异。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一羔飞、第九天 我趴在偏房一處隱蔽的房頂上張望肺樟。 院中可真熱鬧,春花似錦逻淌、人聲如沸么伯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽田柔。三九已至,卻和暖如春骨望,著一層夾襖步出監(jiān)牢的瞬間凯楔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工锦募, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留摆屯,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓糠亩,卻偏偏與公主長得像虐骑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子赎线,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理廷没,服務發(fā)現(xiàn),斷路器垂寥,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 轉(zhuǎn)自:http://bbs.redis.cn/forum.php?mod=viewthread&tid=481 p...
    木十2036閱讀 798評論 0 7
  • 本篇為基礎篇 前言 相信很多人都玩過新浪颠黎,新浪的首頁那么多模塊另锋,那么多文章,而且每天那么多的訪問量狭归, 如果每次有人...
    GQ1994閱讀 4,015評論 0 2
  • 之前我寫過一篇 「如何調(diào)整情緒」,有網(wǎng)友提出這樣的問題:“當一個人對我態(tài)度不好的時候疚宇,我的理解是亡鼠,他就是對我才這樣...
    貝加閱讀 822評論 0 3
  • 考古靈異故事其余章節(jié)簡介 第一章 戒指 我是一名考古專業(yè)的學生,一般別人聽到這個專業(yè)都會覺得很好奇敷待,...
    海貓丶閱讀 454評論 3 8