閱讀目錄

回到頂部

1、降低redis內(nèi)存占用的優(yōu)點(diǎn)

  1、有助于減少創(chuàng)建快照和加載快照所用的時(shí)間

  2、提升載入AOF文件和重寫(xiě)AOF文件時(shí)的效率

  3、縮短從服務(wù)器進(jìn)行同步所需的時(shí)間

  4、無(wú)需添加額外的硬件就可以讓redis存貯更多的數(shù)據(jù)

回到頂部

2、短結(jié)構(gòu)

  Redis為列表、集合、散列、有序集合提供了一組配置選項(xiàng),這些選項(xiàng)可以讓redis以更節(jié)約的方式存儲(chǔ)較短的結(jié)構(gòu)。

回到頂部

  2.1、ziplist壓縮列表(列表、散列、有續(xù)集和)

  通常情況下使用的存儲(chǔ)方式

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷(xiāo)培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線(xiàn)營(yíng)銷(xiāo)培訓(xùn)

  當(dāng)列表、散列、有序集合的長(zhǎng)度較短或者體積較小的時(shí)候,redis將會(huì)采用一種名為ziplist的緊湊存儲(chǔ)方式來(lái)存儲(chǔ)這些結(jié)構(gòu)。

  ziplist是列表、散列、有序集合這三種不同類(lèi)型的對(duì)象的一種非結(jié)構(gòu)化表示,它會(huì)以序列化的方式存儲(chǔ)數(shù)據(jù),這些序列化的數(shù)據(jù)每次被讀取的時(shí)候都需要進(jìn)行解碼,每次寫(xiě)入的時(shí)候也要進(jìn)行編碼。

    雙向列表與壓縮列表的區(qū)別:

  為了了解壓縮列表比其他數(shù)據(jù)結(jié)構(gòu)更加節(jié)約內(nèi)存,我們以列表結(jié)構(gòu)為例進(jìn)行深入研究。

  典型的雙向列表

    在典型雙向列表里面,每個(gè)值都都會(huì)有一個(gè)節(jié)點(diǎn)表示。每個(gè)節(jié)點(diǎn)都會(huì)帶有指向鏈表前一個(gè)節(jié)點(diǎn)和后一個(gè)節(jié)點(diǎn)的指針,以及一個(gè)指向節(jié)點(diǎn)包含的字符串值的指針。

    每個(gè)節(jié)點(diǎn)包含的字符串值都會(huì)分為三部分進(jìn)行存儲(chǔ)。包括字符串長(zhǎng)度、字符串值中剩余可用字節(jié)數(shù)量、以空字符結(jié)尾的字符串本身。

  例子:

  假若一個(gè)某個(gè)節(jié)點(diǎn)存儲(chǔ)了’abc’字符串,在32位的平臺(tái)下保守估計(jì)需要21個(gè)字節(jié)的額外開(kāi)銷(xiāo)(三個(gè)指針+兩個(gè)int+空字符即:3*4+2*4+1=21)

  由例子可知存儲(chǔ)一個(gè)3字節(jié)字符串就需要付出至少21個(gè)字節(jié)的額外開(kāi)銷(xiāo)。

  ziplist

    壓縮列表是由節(jié)點(diǎn)組成的序列,每個(gè)節(jié)點(diǎn)包含兩個(gè)長(zhǎng)度和一個(gè)字符串。第一個(gè)長(zhǎng)度記錄前一個(gè)節(jié)點(diǎn)的長(zhǎng)度(用于對(duì)壓縮列表從后向前遍歷);第二個(gè)長(zhǎng)度是記錄本當(dāng)前點(diǎn)的長(zhǎng)度;被存儲(chǔ)的字符串。

  例子:

  存儲(chǔ)字符串’abc’,兩個(gè)長(zhǎng)度都可以用1字節(jié)來(lái)存儲(chǔ),因此所帶來(lái)的額外開(kāi)銷(xiāo)為2字節(jié)(兩個(gè)長(zhǎng)度即1+1=2)

  結(jié)論:

  壓縮列表是通過(guò)避免存儲(chǔ)額外的指針和元數(shù)據(jù),從而達(dá)到降低額外的開(kāi)銷(xiāo)。

  配置:

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷(xiāo)培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線(xiàn)營(yíng)銷(xiāo)培訓(xùn)

1 #list2 list-max-ziplist-entries 512  #表示允許包含的最大元素?cái)?shù)量3 list-max-ziplist-value 64    #表示壓縮節(jié)點(diǎn)允許存儲(chǔ)的最大體積4 #hash                  #當(dāng)超過(guò)任一限制后,將不會(huì)使用ziplist方式進(jìn)行存儲(chǔ)5 hash-max-ziplist-entries 5126 hash-max-ziplist-value 647 #zset8 zset-max-ziplist-entries 1289 zset-max-ziplist-value 64

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷(xiāo)培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線(xiàn)營(yíng)銷(xiāo)培訓(xùn)

 測(cè)試list:

1、建立test.php文件

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷(xiāo)培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線(xiàn)營(yíng)銷(xiāo)培訓(xùn)

1 #test.php2 <?php3 $redis=new Redis();4 $redis->connect('192.168.95.11','6379');5 for ($i=0; $i<512  ; $i++) 
6 { 
7     $redis->lpush('test-list',$i.'-test-list');  #往test-list推入512條數(shù)據(jù)8 }9 ?>

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷(xiāo)培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線(xiàn)營(yíng)銷(xiāo)培訓(xùn)

 

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷(xiāo)培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線(xiàn)營(yíng)銷(xiāo)培訓(xùn)

  此時(shí)的test-list中含有512條數(shù)據(jù),沒(méi)有超除配置文件中的限制

2、往test-list中再推入一條數(shù)據(jù)

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷(xiāo)培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線(xiàn)營(yíng)銷(xiāo)培訓(xùn)

  此時(shí)test-list含有513條數(shù)據(jù),大于配置文件中限制的512條,索引將放棄ziplist存儲(chǔ)方式,采用其原來(lái)的linkedlist存儲(chǔ)方式

  散列與有序集合同理。

回到頂部

  2.2、intset整數(shù)集合(集合)

  前提條件,集合中包含的所有member都可以被解析為十進(jìn)制整數(shù)。

  以有序數(shù)組的方式存儲(chǔ)集合不僅可以降低內(nèi)存消耗,還可以提升集合操作的執(zhí)行速度。

  配置:

1 set-max-intset-entries  512   #限制集合中member個(gè)數(shù),超出則不采取intset存儲(chǔ)

 

  測(cè)試:

  建立test.php文件

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷(xiāo)培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線(xiàn)營(yíng)銷(xiāo)培訓(xùn)

1 #test.php2 <?php3 $redis=new Redis();4 $redis->connect('192.168.95.11','6379');5 for ($i=0; $i<512  ; $i++) 
6 { 
7     $redis->sadd('test-set',$i);   #給集合test-set插入512個(gè)member8 }9 ?>

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷(xiāo)培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線(xiàn)營(yíng)銷(xiāo)培訓(xùn)

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷(xiāo)培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線(xiàn)營(yíng)銷(xiāo)培訓(xùn)

回到頂部

  2.3、性能問(wèn)題

  不管列表、散列、有序集合、集合,當(dāng)超出限制的條件后,就會(huì)轉(zhuǎn)換為更為典型的底層結(jié)構(gòu)類(lèi)型。因?yàn)殡S著緊湊結(jié)構(gòu)的體積不斷變大,操作這些結(jié)構(gòu)的速度將會(huì)變得越來(lái)越慢。

  測(cè)試:

#將采用list進(jìn)行代表性測(cè)試

測(cè)試思路:

1、在默認(rèn)配置下往test-list推入50000條數(shù)據(jù),查看所需時(shí)間;接著在使用rpoplpush將test-list數(shù)據(jù)全部推入到新列表list-new中,查看所需時(shí)間

2、修改配置,list-max-ziplist-entries 100000,再執(zhí)行上面的同樣操作

3、對(duì)比時(shí)間,得出結(jié)論

  默認(rèn)配置下測(cè)試:

  1、插入數(shù)據(jù),查看時(shí)間

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷(xiāo)培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線(xiàn)營(yíng)銷(xiāo)培訓(xùn)

 1 #test1.php 2 <?php 3 header("content-type: text/html;charset=utf8;"); 4 $redis=new Redis(); 5 $redis->connect('192.168.95.11','6379'); 6 $start=time(); 7 for ($i=0; $i<50000  ; $i++) 
 8 { 
 9     $redis->lpush('test-list',$i.'-aaaassssssddddddkkk');10 }11 $end=time();12 echo "插入耗時(shí)為:".($end-$start).'s';13 ?>

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷(xiāo)培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線(xiàn)營(yíng)銷(xiāo)培訓(xùn)

   seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷(xiāo)培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線(xiàn)營(yíng)銷(xiāo)培訓(xùn)seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷(xiāo)培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線(xiàn)營(yíng)銷(xiāo)培訓(xùn)

結(jié)果耗時(shí)4秒

  2、執(zhí)行相應(yīng)命令,查看耗時(shí)

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷(xiāo)培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線(xiàn)營(yíng)銷(xiāo)培訓(xùn)

 1 #test2.php 2 <?php 3 header("content-type: text/html;charset=utf8;"); 4 $redis=new Redis(); 5 $redis->connect('192.168.95.11','6379'); 6 $start=time(); 7 $num=0; 8 while($redis->rpoplpush('test-list','test-new')) 9 {10     $num+=1;11 }12 echo '執(zhí)行次數(shù)為:'.$num."<br/>";13 $end=time();14 echo "耗時(shí)為:".($end-$start).'s';15 ?>

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷(xiāo)培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線(xiàn)營(yíng)銷(xiāo)培訓(xùn)

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷(xiāo)培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線(xiàn)營(yíng)銷(xiāo)培訓(xùn)

  更改配置文件下測(cè)試  

  1、先修改配置文件

  list-max-ziplist-entries 100000  #將這個(gè)值修改大一點(diǎn),可以更好的凸顯對(duì)性能的影響

  list-max-ziplist-value 64    #此值可不做修改

  2、插入數(shù)據(jù)

  執(zhí)行test1.php

  結(jié)果為:耗時(shí)12s

  seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷(xiāo)培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線(xiàn)營(yíng)銷(xiāo)培訓(xùn)

  3、執(zhí)行相應(yīng)命令,查看耗時(shí)

  執(zhí)行test2.php

  結(jié)果為:執(zhí)行次數(shù):50000,耗時(shí)12s

結(jié)論:

在本機(jī)中執(zhí)行測(cè)試50000條數(shù)據(jù)就相差8s,若在高并發(fā)下,長(zhǎng)壓縮列表和大整數(shù)集合將起不到任何的優(yōu)化,反而使得性能降低。

 

回到頂部

3、片結(jié)構(gòu)

  分片的本質(zhì)就是基于簡(jiǎn)單的規(guī)則將數(shù)據(jù)劃分為更小的部分,然后根據(jù)數(shù)據(jù)所屬的部分來(lái)決定將數(shù)據(jù)發(fā)送到哪個(gè)位置上。很多數(shù)據(jù)庫(kù)使用這種技術(shù)來(lái)擴(kuò)展存儲(chǔ)空間,并提高自己所能處理的負(fù)載量。

  結(jié)合前面講到的,我們不難發(fā)現(xiàn)分片結(jié)構(gòu)對(duì)于redis的重要意義。因此我們需要在配置文件中關(guān)于ziplist以及intset的相關(guān)配置做出適當(dāng)?shù)恼{(diào)整。

回到頂部

  3.1、分片式散列

 

  #ShardHash.class.php

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷(xiāo)培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線(xiàn)營(yíng)銷(xiāo)培訓(xùn) View Code

  散列分片主要是根據(jù)基礎(chǔ)鍵以及散列包含的鍵計(jì)算出分片鍵ID,然后再與基礎(chǔ)鍵拼接成一個(gè)完整的分片鍵。在執(zhí)行hset與hget以及大部分hash命令時(shí),都需要先將key(field)通過(guò)shardKey方法處理,得到分片鍵才能夠進(jìn)行下一步操作。

回到頂部

  3.2、分片式集合

  如何構(gòu)造分片式集合才能夠讓它更節(jié)省內(nèi)存,性能更加強(qiáng)大呢?主要的思路就是,將集合里面的存儲(chǔ)的數(shù)據(jù)盡量在不改變其原有功能的情況下轉(zhuǎn)換成可以被解析為十進(jìn)制的數(shù)據(jù)。根據(jù)前面所講到的,當(dāng)集合中的所有成員都能夠被解析為十進(jìn)制數(shù)據(jù)時(shí),將會(huì)采用intset存儲(chǔ)方式,這不僅能夠節(jié)省內(nèi)存,而且還可以提高響應(yīng)的性能。

例子:

假若要某個(gè)大型網(wǎng)站需要存儲(chǔ)每一天的唯一用戶(hù)訪(fǎng)問(wèn)量。那么就可以使用將用戶(hù)的唯一標(biāo)識(shí)符轉(zhuǎn)化成十進(jìn)制數(shù)字,再存入分片式set中。

#ShardSet.class.php

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷(xiāo)培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線(xiàn)營(yíng)銷(xiāo)培訓(xùn) View Code

 

 

回到頂部

4、將信息打包轉(zhuǎn)換成存儲(chǔ)字節(jié)

  結(jié)合前面所講的分片技術(shù),采用string分片結(jié)構(gòu)為大量連續(xù)的ID用戶(hù)存儲(chǔ)信息。

  使用定長(zhǎng)字符串,為每一個(gè)ID分配n個(gè)字節(jié)進(jìn)行存儲(chǔ)相應(yīng)的信息。

  接下來(lái)我們將采用存儲(chǔ)用戶(hù)國(guó)家、省份的例子進(jìn)行講解:

  假若某個(gè)用戶(hù)需要存儲(chǔ)中國(guó)、廣東省這兩個(gè)信息,采用utf8字符集,那么至少需要消耗5*3=15個(gè)字節(jié)。如果網(wǎng)站的用戶(hù)量大的話(huà),這樣的做法將會(huì)占用很多資源。接下來(lái)我們采用的方法每個(gè)用戶(hù)僅僅只需要占用兩個(gè)字節(jié)就可以完成存儲(chǔ)信息。

  具體思路步驟:

  1、首先我們?yōu)閲?guó)家、以及各國(guó)家的省份信息建立相應(yīng)的’信息表格’

  2、將’信息表格’建好后,也意味著每個(gè)國(guó)家,省份都有相應(yīng)的索引號(hào)

  3、看到這里大家應(yīng)該都想到了吧,對(duì)就是使用兩個(gè)索引作為用戶(hù)存儲(chǔ)的信息,不過(guò)需要注意的是我們還需要對(duì)這兩個(gè)索引進(jìn)行相應(yīng)的處理

  4、將索引當(dāng)做ASCII碼,將其轉(zhuǎn)換為對(duì)應(yīng)ASCII(0~255)所指定的字符

  5、使用前面所講的分片技術(shù),定長(zhǎng)分片string結(jié)構(gòu),將用戶(hù)的存儲(chǔ)位置找出來(lái)(redis中一個(gè)string不能超過(guò)512M)

  6、實(shí)現(xiàn)信息的寫(xiě)入以及取出(getrange、setrange)

實(shí)現(xiàn)代碼:

#PackBytes.class.php

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷(xiāo)培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線(xiàn)營(yíng)銷(xiāo)培訓(xùn)

  1 <?php  2 #打包存儲(chǔ)字節(jié)  3 #存儲(chǔ)用戶(hù)國(guó)家、省份信息  4 class PackBytes  5 {  6     private $redis='';  #存儲(chǔ)redis對(duì)象  7     /**  8     * @desc 構(gòu)造函數(shù)  9     * 
 10     * @param $host string | redis主機(jī) 11     * @param $port int    | 端口 12     */ 13     public function __construct($host,$port=6379) 14     { 15         $this->redis=new Redis(); 16         $this->redis->connect($host,$port); 17     } 
 18  19     /** 20     * @desc  處理并緩存國(guó)家省份數(shù)據(jù) 21     * @param $countries string | 第一類(lèi)數(shù)據(jù),國(guó)家字符串 22     * @param $provinces 二維array  | 第二類(lèi)數(shù)據(jù),各國(guó)省份數(shù)組 23     * @param $cache 1/0    | 是否使用緩存,默認(rèn)0不使用 24     * 25     * @return array | 返回總數(shù)據(jù) 26     */ 27     public function dealData($countries,$provinces,$cache=0) 28     { 29         if($cache) 30         { 31             $result=$this->redis->get('cache_data'); 32             if($result) 33                 return unserialize($result); 34         } 35         $arr=explode(' ',$countries); 36         $areaArr[]=$arr; 37         $areaArr[]=$provinces; 38         $cache_data=serialize($areaArr); 39         $this->redis->set('cache_data',$cache_data); 40         return $areaArr; 41     } 42  43     /** 44     * @desc 將具體信息按表索引轉(zhuǎn)換成編碼信息 45     * 
 46     * @param $countries,$provinces,$cache| 參考dealData方法 47     * @param $country  string             | 具體信息--國(guó)家 48     * @param $province   string           | 具體信息--省份 49     * 50     * @return string | 返回轉(zhuǎn)換的編碼信息 51     */ 52     public function getCode($countries,$provinces,$country,$province,$cache=0) 53     { 54         $dataArr=$this->dealData($countries,$provinces,$cache=0); 55  56         $result=array_search($country, $dataArr[0]);  #查找數(shù)組中是否含有data1 57         if($result===false)         #判斷是否存在 58             return chr(0).chr(0);   #不存在則返回初始值 59         $code=chr($result); 60         $result=array_search($province, $dataArr[1][$country]);  #查找數(shù)組中是否含有data2 61         if($result===false) 62             return $code.chr(0); 63         return $code.chr($result);      #返回對(duì)應(yīng)ASCII(0~255)所指定的字符  64     } 65  66     /** 67     * @desc 計(jì)算用戶(hù)存儲(chǔ)編碼數(shù)據(jù)的相關(guān)位置信息 68     * 
 69     * @param $userID int | 用戶(hù)的ID 70     * 71     * @return array | 返回一個(gè)數(shù)組 包含數(shù)據(jù)存儲(chǔ)時(shí)的分片ID、以及屬于用戶(hù)的存儲(chǔ)位置(偏移量) 72     */ 73     public function savePosition($userID) 74     { 75         $shardSize=pow(2, 3);      #每個(gè)分片的大小 76         $position=$userID*2;        #user的排位 77         $arr['shardID']=floor($position/$shardSize);   #分片ID 78         $arr['offset']=$position%$shardSize;      #偏移量 79         return $arr; 80     } 81  82     /** 83     * @desc | 整合方法,將編碼信息存入redis中string相應(yīng)的位置 84     * 85     * @param $userID int           | 用戶(hù)ID 86     * @param $countries string     | 第一類(lèi)數(shù)據(jù),國(guó)家字符串 87     * @param $provinces 二維array  | 第二類(lèi)數(shù)據(jù),各國(guó)省份數(shù)組 88     * @param $country  string             | 具體信息--國(guó)家 89     * @param $province   string           | 具體信息--省份 90     * @param $cache 1/0            | 是否使用緩存,默認(rèn)0不使用 91     * 92     * @return 成功返回寫(xiě)入位置/失敗false 93     */ 94     public function saveCode($userID,$countries,$provinces,$country,$province,$cache=0) 95     { 96         $code=$this->getCode($countries,$provinces,$country,$province,$cache=0); 97         $arr=$this->savePosition($userID);  #存儲(chǔ)相關(guān)位置信息 98         return $this->redis->setrange('save_code_'.$arr['shardID'],$arr['offset'],$code); 99     }100 101     /**102     * @desc 獲取用戶(hù)的具體國(guó)家與省份信息103     *104     * @param $userID int | 用戶(hù)ID105     *106     * @return array | 返回包含國(guó)家和省份信息的數(shù)組107     */108     public function getMessage($userID)109     {110         $position=$this->savePosition($userID);111         $code=$this->redis->getrange('save_code_'.$position['shardID'],$position['offset'],$position['offset']+1);112         $arr=str_split($code);113         $areaArr=$this->dealData('', '',$cache=1);  #使用緩存數(shù)據(jù)114         $message['country']=$areaArr[0][ord($arr[0])];115         $message['province']=$areaArr[1][$message['country']][ord($arr[1])];116         return $message;117     }118 119 }120 121 header("content-type: text/html;charset=utf8;");122 $countries="無(wú) 中國(guó) 日本 越南 朝鮮 俄羅斯 巴基斯坦 美國(guó)";123 $provinces=array(124         '無(wú)'=>array('無(wú)'),125         '中國(guó)'=>array('無(wú)','廣東','湖南','湖北','廣西','云南','湖南','河北'),126         '日本'=>array('無(wú)','龜孫子區(qū)','王八區(qū)','倭國(guó)鬼區(qū)','鬼子區(qū)','蘿卜頭區(qū)'),127     );128 $obj=new PackBytes('192.168.95.11');129 /*130 #數(shù)據(jù)處理,并將其緩存到redis中131 $b=$obj->dealData($countries,$provinces);132 echo "<pre>";133 print_r($b);134 echo "</pre>";die;  
135 */136 /*137 #存儲(chǔ)用戶(hù)國(guó)家省份信息138 $country='中國(guó)';139 $province='廣東';140 $result=$obj->saveCode(0,$countries,$provinces,$country,$province);141 echo "<pre>";142 print_r($result);143 echo "</pre>";144 */145 /*146 #取出用戶(hù)國(guó)家省份信息147 $a=$obj->getMessage(15);148 echo "<pre>";149 print_r($a);150 echo "</pre>";die;151 */152 153 ?>

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷(xiāo)培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線(xiàn)營(yíng)銷(xiāo)培訓(xùn)

 

測(cè)試:

1、dealData處理后的信息,即為’信息表表格’

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷(xiāo)培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線(xiàn)營(yíng)銷(xiāo)培訓(xùn)

2、saveCode()

userID國(guó)家省份
0中國(guó)廣東
13日本龜孫子區(qū)
15日本王八區(qū)

 

、seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷(xiāo)培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線(xiàn)營(yíng)銷(xiāo)培訓(xùn)

3、getMessage()

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷(xiāo)培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線(xiàn)營(yíng)銷(xiāo)培訓(xùn)seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷(xiāo)培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線(xiàn)營(yíng)銷(xiāo)培訓(xùn)seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營(yíng)銷(xiāo)培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線(xiàn)營(yíng)銷(xiāo)培訓(xùn)

 

參考書(shū)籍:

《Redis實(shí)戰(zhàn)》 Josiah.Carlson 著

           黃健宏 譯

(以上是自己的一些見(jiàn)解,若有不足或者錯(cuò)誤的地方請(qǐng)各位指出)

 作者:那一葉隨風(fēng)

 聲明:本博客文章為原創(chuàng),只代表本人在工作學(xué)習(xí)中某一時(shí)間內(nèi)總結(jié)的觀(guān)點(diǎn)或結(jié)論。轉(zhuǎn)載時(shí)請(qǐng)?jiān)谖恼马?yè)面明顯位置給出原文鏈接

http://www.cnblogs.com/phpstudy2015-6/p/6601525.html