1. 程式人生 > >nosql--------memcache與redis

nosql--------memcache與redis

本文有三部分:1、兩者不同    2、memcache   3、redis

一、不同點對比:

①從資料儲存位置上來分,memcache的資料存在記憶體中,而redis既可以儲存在記憶體中,也可以儲存的到磁碟中,達到持久化儲存的功能,memcache一旦斷電,資料全部丟失,redis可以利用快照和AOF把資料存到磁碟中,當恢復時又從磁碟中讀取到記憶體中,當實體記憶體使用完畢後,可以把資料寫入到磁碟中。

            ②從儲存資料的型別上來分,memcache和redis儲存的方式都是鍵值對,只不過redis值的型別比較豐富,有string(字串),hash(雜湊),list(列表),set(集合)zset(有序集合),而memcache主要儲存的是字串。

③從架構層次來分,Redis支援master-slave(主—從)模式應用,memcache支援分散式。

④另外從儲存資料的大小上來分,Redis單個value的最大限制是1GB,memcached只能儲存1MB的資料。但是Memcache在儲存100K以上的資料,效能稍微好一點。

⑤另外redis只支援單核,memcache可以支援多核,當然關於redis取代memcache的說法,在一般情況下,兩者效能都很高,在大多的業務場景選擇上,redis的選擇可能更加具有優勢,但也不能說可以完全取代,最終還是取決於你的應用場景。  

二、memcache

 原理:memcached 用 slab allocator

(slab分配器) 機制來管理記憶體 

Slab Allocator的基本原理是按照預先規定的大小,將分配的記憶體分割成特定長度的塊,以完全解決記憶體碎片問題。Slab Allocation的原理相當簡單。 將分配的記憶體分割成各種尺寸的塊(chunk),並把尺寸相同的塊分成組(chunk的集合)

memcache分散式操作:分到各個伺服器,減少伺服器壓力(在這裡不贅述,在我的《高效能的伺服器的架設------硬體》有寫)

操作:

  1. 連線

$m=new Memcached();$m->addServer("127.0.0.1",11211);

  1. 其他的一些api(add,get等等)

http://php.net/manual/zh/book.memcached.php

  1. Set 設定引數   get 讀取引數的值   delete  刪除

$m->set("name","ljp2");  //設定echo $m->get("name");   //讀取$m->delete("name");     //刪除

//如果鍵num不存在就set  如果存在就每次重新整理頁面數值加1或者減1if(!$m->get("num")){     $m->set("num",1,0);}$m->increment("num",10);$m->decrement("num",1);   //每次重新整理頁面減少1

echo $m->get("num");   //讀取

//同時儲存多條資料$arr=array(     "name"=>"張三",     "sex"=>"男");$m->setMulti($arr,0);//一次性可以讀取多條資料$getdata=$m->getMulti(array("name","sex"));print_r($getdata);

//一次性刪除多條資料$m->deleteMulti(array("name","sex"));

//可以獲取上一步操作的結果  有兩個方法echo $m->getResultCode();  //這個返回數字 不同的數字代表的意思不同  o--成功  1-失敗  還有其他的數字 ...echo $m->getResultMessage();  //這個返回的是文字說明  success   ...

    

  1. 面向物件的方式來操作memcache  封裝類來單獨進行操作

<?php/** * Created by PhpStorm. * User: HP */class MyMemcached{     private $m;     function __construct()    {         $this->m=new Memcached();         $this->m->addServer("127.0.0.1",11211);    }     public function setData($key,$value,$time=0){         $this->m->set($key,$value,$time);         if($this->m->getResultCode() !=0){             $this->$this->getError();        }    }     public function getData($key){         $data= $this->m->get($key);         if($this->m->getResultCode() !=0){             $this->getError();        }else{             return $data;        }    }     public function deleteData($key){         $this->m->delete($key);         if($this->m->getResultCode() !=0){             $this->$this->getError();        }    }     public function getError(){         echo $this->m->getResultMessage();    }}

三、redis

  • Redis的簡介:Redis是一個開源的使用ANSI C語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API
  • 使用redis 的公司:GitHub   twitter   stackoverflow   新浪微博   搜狐  知乎 美團 騰訊 …
  • 適用場景:

以下為安裝過程

  1. wget http://labfile.oss.aliyuncs.com/files0422/redis-2.8.9.tar.gz  
  2. tar -zxvf redis-2.8.9.tar.gz
  3. cd redis-2.8.9   開始make和 make install命令安裝
  4. 之後在src資料夾中會生成6個檔案

redis-server(啟動服務端)、redis-cli(呼叫客戶端)、redis-benchmark、redis-check-aof、redis-check-dump、redis-sentinel

  1. 建立redis配置目錄

 mkdir /etc/redis

mkdir /var/redis

mkdir /var/redis/log

mkdir /var/redis/run

mkdir /var/redis/6379

  1. 複製配置模板檔案

 cp redis.conf /etc/redis/6379.conf

修改6379.conf配置項    daemonize(守護程序,可以在後臺執行,配置redis作為守護程序執行 # 預設情況下 redis 不是作為守護程序執行的,如果你想讓它在後臺執行,你就把配置檔案裡 daemonize改成 yes。# 當redis作為守護程序執行的時候,它會寫一個 pid  /var/run/redis.pid 檔案裡面。)

daemonize yes            

pidfile /var/redis/run/redis_6379.pid

logfile /var/redis/log/redis_6379.log

  1. 開啟redis服務

進入  /etc/redis/

執行 redis-server 6379.conf

.啟動redis server後,SecureCRT進入redis-cli,輸入不斷在後面追加IP:Port顯示設定當前的Session Options-->Terminal-->Emulation-->Terminal為Linux

cat /var/redis/log/redis_6379.log

  1. 如果通過命令列來操作redis的話 再開啟一個redis的客戶端

進入redis的安裝目錄  cd /root/redis-stable/src/,

執行 redis-cli  即可

    2。然後就可以操作redis了