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 Allocator的基本原理是按照預先規定的大小,將分配的記憶體分割成特定長度的塊,以完全解決記憶體碎片問題。Slab Allocation的原理相當簡單。 將分配的記憶體分割成各種尺寸的塊(chunk),並把尺寸相同的塊分成組(chunk的集合)
memcache分散式操作:分到各個伺服器,減少伺服器壓力(在這裡不贅述,在我的《高效能的伺服器的架設------硬體》有寫)
操作:
-
連線
$m=new Memcached();$m->addServer("127.0.0.1",11211);
-
其他的一些api(add,get等等)
http://php.net/manual/zh/book.memcached.php
-
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 ...
-
面向物件的方式來操作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 新浪微博 搜狐 知乎 美團 騰訊 …
- 適用場景:
以下為安裝過程
- wget http://labfile.oss.aliyuncs.com/files0422/redis-2.8.9.tar.gz
- tar -zxvf redis-2.8.9.tar.gz
- cd redis-2.8.9 開始make和 make install命令安裝
- 之後在src資料夾中會生成6個檔案
redis-server(啟動服務端)、redis-cli(呼叫客戶端)、redis-benchmark、redis-check-aof、redis-check-dump、redis-sentinel
- 建立redis配置目錄
mkdir /etc/redis
mkdir /var/redis
mkdir /var/redis/log
mkdir /var/redis/run
mkdir /var/redis/6379
- 複製配置模板檔案
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
- 開啟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
- 如果通過命令列來操作redis的話 再開啟一個redis的客戶端
進入redis的安裝目錄 cd /root/redis-stable/src/,
執行 redis-cli 即可
2。然後就可以操作redis了