memcache和redis

Nosql

1、NoSQL的基本說明

    NoSQL(NoSQL = Not Only SQL),意味反sql運動,是一項全新的數據庫革命性運動,早期就有人提出,發展至2009年趨勢愈加高漲。它指的是非關係型的數據庫。javascript

2、興起的緣由

    隨着互聯網web2.0網站的興起,傳統的關係數據庫在應付web2.0網站,特別是超大規模高併發的sns類型的web2.0純動態網站已經顯得力不從心,暴露了不少難以克服的問題,而非關係型的數據庫則因爲自己的特色獲得了很是迅速的發展。php

3、特色

    優勢:

        高併發讀寫的性能    大數據量的擴展(分佈式存儲)     配置簡單css

        靈活、高效的操做與數據模型     低廉的成本html

    缺點:

        沒有統一的標準     沒有正式的官方支持     各類產品還不算成熟java

4、常見的nosql產品

    新浪微博 Redis    Google Bigtable    Amazon SimpleDB    淘寶數據平臺 Tairmysql

    優酷視頻 MongoDB    飛信空間 HandlerSocket    視覺中國網站 MongoDBlinux

Memcache

1、基本概念

  1. Memcached是danga的一個項目,最先是LiveJournal 服務的,最初爲了加速 LiveJournal 訪問速度而開發的,後來被不少大型的網站採用。 官方網站: www.danga.com  和 memcached.orgweb

  2. Memcached是一個高性能的分佈式的內存對象緩存系統,目前全世界很多人使用這個緩存項目來構建本身大負載的網站,來分擔數據庫的壓力,經過在內存裏維護一個統一的巨大的hash表,它可以用來存儲各類格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等。簡單的說就是將數據調用到內存中,而後從內存中讀取,從而大大提升讀取速度。(注: 摘自百度全科)redis

     Memcached是一個高性能的分佈式的內存對象緩存系統sql

    分佈式的概念:咱們在實際的項目中可使用多臺memcache服務器,共同工做,存儲的數據是分佈式的。 

2、memcache的安裝

    一、下載軟件,並解壓,拷貝到指定的位置,通常便於管理,和服務器的環境在同一個目錄下

        

    

    二、以管理員的方式進入到cmd窗口,並進入到memcache所在的目錄

        memcache.exe  –d install  安裝:安裝完成後,經過Windows+R調出運行界面輸入services.msc查看服務以下

        

    三、安裝完成後,啓動memcache服務

        memcached.exe –d start

        啓動後,能夠經過netstat –an命令查看memcahce的端口是否監聽狀態,memcache的端口號是,11211

        

    四、安裝可能失敗的緣由: 

        a 若是你是用win7,win8系統,他對安全性要求高,所以,須要你們使用管理員的身份來安裝和啓動. 具體是 程序開始===>全部程序==》附件==》cmd(單擊右鍵,選擇以管理員的身份來執行)

        b存放memcached.exe 目錄不要有中文或者特殊字符

        c 安裝成功,可是啓動會報告一個錯誤信息,提示缺乏xx.dll ,你能夠從別的機器拷貝該dll文件,而後放入到system32下便可.

        d若是上面三個方法都不能夠,能夠直接 cmd>memcached.exe  -p  端口 【這種方式不能關閉窗口】

    五、在啓動時指定的一些基本命令

        -p 監聽的端口     -l <ip地址>綁定地址(默認:全部都容許,不管內外網或者本機ip,有安全隱患,若設置爲127.0.0.1就只能本機訪問)
        -d start 啓動memcached服務     -d restart 重起memcached服務     -d stop|shutdown 關閉正在運行的memcached服務
        -d install 安裝memcached服務     -d uninstall 卸載memcached服務    -u 以的身份運行 (僅在以root運行的時候有效)
        -m 最大內存使用,單位MB。默認64MB     -M 內存耗盡時返回錯誤,而不是刪除項     -c 最大同時鏈接數,默認是1024
        -f 塊大小增加因子,默認是1.25     -n 最小分配空間,key+value+flags默認是48     -h 顯示幫助

3、如何鏈接memcache服務器進行使用

    

4、使用telnet鏈接到memcache服務器(相似於黑窗口)

    鏈接方式:telnet ip地址  端口號    telnet localhost 11211

    數據存儲格式:相似於關聯數組

    第一列                               第二列

    鍵名(通常是字符串)       具體的數據內容(除了資源)

    增刪改查操做

    一、添加數據

        add 鍵的名稱  0  緩存的時間  數據的長度  (回車後添加內容)  0表示不壓縮:

        好比:add color 0 100 3   表示向memcache裏面添加的數據鍵爲color,緩存的週期是100秒,數據的長度是3

        

    二、獲取數據

        get 鍵名    get color

    三、修改數據 

        replace 要求鍵名必須存在,若是不存在,則提示一個錯誤。

        set set 指令也能夠替換數據,若是鍵存在則替換,若是不存在,則等於添加。

        

    四、刪除數據

        基本語法:delete  鍵名稱 

        flush_all 清空全部的數據

    五、其餘的一些命令

        

    六、獲取memcache查詢的成功率

        memcache查詢效率 = get_hits / cmd_get

        

5、經過php來鏈接memcache服務器

    一、從網上下載memcache php的擴展,該擴展要和php的版本一致。要下載php版本對應的memcache的擴展。

    二、把對應的memcache擴展拷貝到php安裝目錄的ext下面。

    三、修改php配置文件php.ini打開擴展支持    extension=php_memcache.dll

    四、重啓apache,經過運行phpinfo()函數來進行測試。

    五、簡單使用,能夠存儲字符串、整數、小數、對象、數組,其中存儲數組時只能是一維數組,存儲時以序列化方式存儲        

<?php
$mem=new Memcache();
$mem->connect("localhost",11211);
//先完成數據的取出
//若是把取出的data數據給緩存到memcache裏面
//取出的數據是由sql語句決定的。鍵由sql語句字符串,值就是取出的數據
$sql = "select title from dede_archives limit 5";
$key = md5($sql);
echo $key;
//先從memcache裏面取出數據
$data = $mem->get($key);//根據鍵名稱從memcache裏面取出數據
//判斷是否取出數據,若是數據爲空,則從數據庫裏面獲取數據。
if(!$data){
    $conn = mysql_connect("localhost",'root','root');
    mysql_query("use itdede");
    //mysql_select_db();
    mysql_query("set names utf8");
    $res = mysql_query($sql,$conn);
    $data = array();
    while($row=mysql_fetch_assoc($res)){
        $data[]=$row;
    }
    //從數據庫裏面獲取的數據,添加到memcache裏面。
    $mem->add($key,$data,MEMCACHE_COMPRESSED,100);  
}
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN">
<head>
<title>新建網頁</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="description" content="" />
<meta name="keywords" content="" />
<script type="text/javascript"></script>
<style type="text/css"></style>
</head>
    <body>
    <?php foreach($data as $v){?>
    <li><?php echo $v['title']?></li>
    <?php }?>
    </body>
</html>

6、經過使用memcahe客戶端源碼鏈接操做memcache服務器

    使用範圍:在沒有php操做memcache擴展的前提下使用,推薦使用php,memcache的擴展。

    測試前:要關閉擴展。具體的使用步驟:

    一、把源碼文件拷貝到項目的指定位置。

    二、引入源碼文件

7、把session文件存儲到memcache

    方法一:在php.ini文件中配置

        一、設置存儲方式:    session.save_handler=memcache

        二、設置存儲位置:session.save_path="tcp://localhost:11211,tpc://192.168.1.89:11211"

        session文件存儲到memcache是經過sessionid做鍵的;把session文件存儲到memcache後,不影響session的任何操做。

    方法二:直接在文件中設置,其實這樣更好,由於不會影響到別人的使用session的方式  

        ini_set("session.save_handler","memcache");

        ini_set("session.save_path","tcp://localhost:11211");

8、memcache的分佈式存儲

    原理以下圖:                                                                    具體代碼以下圖:

        

    若是隻有一臺電腦,無需虛擬機也能夠模擬兩臺memcache 服務器。能夠經過memcached.exe –p 11210來開啓。

    具體代碼如圖:

9、memcache的細節討論

    一、生命週期的問題

        ①秒數,可是有限制,不能超過 2592000秒(30天)。

        ②時間戳,好比咱們要設置超過1個月,則以下設置

            $mem->add('name1','yangguang',MEMCACHE_COMPRESSED,time()+3600*24*31);若是設置爲0,則表示永不過時。

            存儲到memcache裏面的數據,什麼狀況下會丟失:

            (1)生命週期到了(2)關閉memcache服務(3)關機,重啓。

    二、memcache中善於存儲哪些數據

        ①更新比較頻繁的數據(用戶的在線狀態),查詢比較頻繁,數據量不是很大。

        ②安全性不是很高。

        若是沒有memcache這個產品,能夠經過mysql的memory存儲引擎。

    三、memcache的安全性

        

        ①內網(兩塊網卡,memcache在啓動時指定那臺訪問) 

            memcached –d –u root –l 192.168.1.100 –p 11211.指定只有192.168.1.100服務器才能訪問。 

        ②防火牆 

            在linux中,設置命令:iptables -a input -p 協議 -s 能夠訪問ip -dport 端口 -j ACCEPT

            例如: 

                iptables –a input –p tcp –s 192.168.1.1 –dport 11211 –j ACCEPT

                iptables –a input –p tcp –s 192.168.1.1 –dport 11211 –j ACCEPT

    四、Memcached機制深刻了解

        ①基於c/s架構,協議簡單  

        ②基於libevent的事件處理

        ③內置內存存儲方式

        ④基於客戶端的分佈式

Redis

1、基本介紹

    redis是一個開源的,先進的key-value存儲。它一般被稱爲數據結構服務器,由於鍵能夠包含字符串哈希鏈表集合有序集合

    (1)架構方式:c/s   客戶端和服務器

    (2)redis不只能夠存儲到內存中,並且能夠把數據同步到硬盤中,達到數據的存儲持久化。

    (3)redis數據存儲是鍵值對,存儲的值的類型有五種:string(字符串),hash(哈希),list(鏈表),set(無序集合),zset(有序集合),這些數據類型都支持push/pop、add/remove及取交集和並集及更豐富的操做、Redis支持各類不一樣方式的排序。

    (4)提供的API語言包括:C C++ C# Clojure Common Lisp Erlang Haskell Java Javascript Lua Objective-C Perl PHP Python Ruby Scala Go Tcl

2、redis的安裝

    一、下載安裝包

        http://redis.googlecode.com/files/redis-2.4.17.tar.gz

    二、編譯程序

        tar zxvf redis-2.4.17.tar.gz

        cd redis-2.4.17

        make

        cd src &&  make install

    三、爲了便於管理,新建redis的管理目錄

        mkdir -p /usr/local/redis/bin

        mkdir -p /usr/local/redis/etc

    四、把配置文件移動到新建的etc目錄下面(配置文件在redis解壓目錄中)

        mv redis.conf /usr/local/redis/etc

    五、把解壓目錄下面的src目錄下面的一些文件移動到新建的bin目錄下

        mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server /usr/local/redis/bin

    六、啓動服務,經過bin目錄下面的redis-server

        啓動格式:redis-server  指定的配置文件

        /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

    七、啓動後會佔用當前的會話窗口,咱們應該讓他在後臺啓動,所以要修改配置文件

        打開配置文件/etc/redis.conf,若是須要在後臺運行,把daemonize項改成yes

    八、關閉redis的服務從新啓動

        pkill redis-server

        

    九、客戶端鏈接

        

3、redis的數據類型

    string(字符串):相似於memcache裏面的數據存儲方式    key values

    

    hash(哈希):相似於關係型數據庫裏面的行,也是鍵值對,值裏面又有鍵值對

    

    list(鏈表):能夠模擬隊列和棧。數據存儲是有順序的。

        隊列:先進先出。棧:先進後出。

    set(集合) 集合的示意圖:

    

    zset(有序集合) 集合裏面的內容是有序的

    

4、redis的數據類型相關命令

    一、string類型

        String是最簡單的類型,一個 key對應一個Value,String類型是二進制安全的。Redis的 string能夠包含任何數據,好比jpg圖片或者序列化的對象。

        (1)set設置鍵值

                語法:set  鍵名稱  值。set name zhangsan,從新設置則直接覆蓋

        (2)get獲取key對應的string值,若是key不存在返回nil

                語法:get 鍵值。get name

        (3)setnx設置鍵時,先判斷否存在,若是已經存在則設置不成功,返回0,nx是not exist。

                setnx name zhangsan

        (4)setex設置key對應string類型的value,並指定鍵的有效期。

                語法:setex 名稱 有效期   值。setex color 10 red

        (5)setrange替換字符串中字符。

                語法:setrange 鍵名稱 開始替換序號 替換的內容。setrange email 7 qq.com

        (6)mset一次設置多個key的值,成功返回ok表示全部的值都設置了,失敗返回0表示沒有任何值被設置

                語法: mset 名稱1   值1   名稱2    值2        mset name lisi age 18 height 168

        (7)msetnx一次設置多個key,成功返回ok表示全部值都設置了,失敗返回0表示沒有任何值被設置,不覆蓋已存在key

                msetnx name lisi age 18 height 168

        (8)getset設置key的值,並返回key的舊值。

                getset name wangwu

        (9)getrange獲取key的value值的範圍內的子字符串

                getrange name 0 5

        (10)mget一次獲取多個key的值,若是對應key不存在則對應返回nil。

                mget name age height

        (11)incr對key值作加加操做並返回新值。incrby同incr相似,加指定值,key不存在會設置key,並認爲原來value是0

                incr age        incrby age 45

        (12)decr對key值作減減操做。decrby同decr相似,減指定值

                decr age        decrby age 45

        (13)append給指定key的字符串追加value,返回新字符串值的長度

                append name is man

        (14)strlen取指定key的value值的長度

                strlen name

    二、hashes類型

        Redis hash是一個string類型的field和value的映射表。它的添加、刪除操做都是0(1)(平均)。hash特別適合用於存儲對象。相較於將對象的每一個字段存成單個string類型。將一個對象存儲在hash類型中會佔用更少的內存,而且能夠更方便的存取整個對象。

        (1)hset設置hash field爲指定值,若是 key不存在,則先建立。

                語法: hset  哈希名稱  字段名稱   值    hset myhash name xiaowang

        (2)hget取出hash field的值。

                語法:hget 哈希名稱  字段名稱    hget myhash name

        (3)hsetnx設置hash field爲指定值,若是key不存在,則先建立,若是存在則返回0。

                hsetnx myhash name lisi

        (4)hmset同時設置hash的多個field

                語法:hmset 哈希名稱  field1  value1 field2 value2    hmset hash2 name yuguo age 77

        (5)hmget獲取所有指定的hash field

                語法:hmget 哈希名稱 field1 field2    hmset hash2 name age

        (6)hincrby指定的 hash  field加上給定的值

                hincrby hash2 age 20

        (7)hexists測試指定的 field是否存在

                hexists hash2 age

        (8)hlen返回指定hash的field數量

                hlen hash2

        (9)hdel刪除指定hash的field

                語法:hdel 哈希名 field    hdel hash2 age

        (10)hkeys返回hash的全部field

                hkeys hash2

        (11)hvals返回hash的全部 value

                hvals hash2

        (12)hgetall獲取某個hash中所有的field及value

                hgetall hash2

    三、lists類型及操做

        list是一個鏈表結構,主要功能是push、pop、獲取一個範圍的全部值等等,操做中key 理解爲鏈表的名字。redis的list類型其實就是一個每一個子元素都是string 類型的雙向鏈表。咱們能夠經過push、pop操做從鏈表的頭部或者尾部添加刪除元素,這樣list既能夠做爲棧,又能夠做爲隊列。

        (1)lpush在key對應list的頭部添加字符串元素。

                語法:lpush 鏈表名稱  值內容

        (2)lrange獲取鏈表裏面的值

                語法:lrange 鏈表名稱  0 -1,注意0 和 -1 表示取值範圍,從頭部到尾部。

                

        (3)rpush在key對應list的尾部添加字符串元素。

                語法:rpush 鏈表名稱  值內容

                

        (4)linsert在key對應list的特定位置前或後添加字符串

                

        (5)lset設置list中指定下標的元素值。注:下標從0開始計算

                

        (6)lrem從key對應list中刪除n個和value相同的元素。(n<0從尾刪除,n=0所有刪除)

                

        (7)ltrim保留指定key的值範圍內的數據

                

        (8)lpop從list的頭部刪除元素,並返回刪除元素

                

        (9)rpop從 list的尾部刪除元素,並返回刪除元素

                

        (10)rpoplpush從第一個list的尾部移除元素並添加到第二個list的頭部

                

        (11)lindex返回名稱爲key的list中 index位置的元素

                

        (12)llen返回key對應list的長度

                

    四、sets類型及操做

        set是集合,它是string類型的無序集合。set是經過hash table實現的、添加、刪除和查找的複雜度都是0(1)。對集合咱們能夠取並集、交集、差集。經過這些操做咱們能夠實現sns中的好友推薦和blog的tag功能。

        (1)sadd向名稱爲key 的set中添加元素

                語法:sadd 集合名   元素

        (2)smembers 獲取集合中內容,語法:smembers 集合名稱

                

        (3)srem刪除名稱爲key的set中的元素

                

        (4)spop隨機返回並刪除名稱爲key的set中一個元素

                

        (5)sdiff返回全部給定key與第一個key的差集

                

        (6)sdiffstore返回全部給定key與第一個key的差集,並將結果存爲另外一個key。

                語法:sdiffstore 新的集合  集合1   集合2

                

        (7)sinter返回全部給定key的交集

                

        (8)sinterstore返回全部給定key的交集,並將結果存爲另外一個key

                

        (9)sunion返回全部給定key的並集

                

        (10)sunionstore返回全部給定key的並集

                

        (11)smove從第一個key對應的set中移除member並添加到第二個對應的set中

                

        (12)scard返回名稱爲key的set的元素個數

                

        (13)sismember測試member是不是名稱爲 key的set的元素

                

        (14)srandmember隨機返回名稱爲key的set的一個元素,但不刪除元素

                

    五、sorted sets類型及操做

        sorted set是set的一個升級版本,他在set的基礎上增長了一個順序屬性,這一屬性在添加修改元素的時候能夠指定,每次指定後,zset會自動從新按新的值調整順序。能夠理解爲有兩列的mysql表,一列存value,一列存順序。操做中的key理解爲zset的名字。

        (1)zadd向名稱爲key的zset中添加元素。若是該元素存在,則更新其順序。

                語法:zadd 集合名  序號  內容

                

        (2)zrange獲取有序集合中的內容

                

        (3)zrem刪除名稱爲key的zset中的元素member

                

        (4)zincrby若是在名稱爲key的zset中已存在元素member,則該元素的score增長increment不然向該集合中添加該元素,其score的值爲increment

                

        (5)zrank返回名稱爲key的zset中member元素的排名(按score從小到大排序)即下標

                

        (6)zrevrank返回名稱爲key的zset中member元素的排名(按score從大到小排序)即下標

                

        (7)zrevrange返回名稱爲key的zset(按score從大到小順序)中的index從start到end的全部元素

                

        (8)zrangebyscore返回集合中score在給定區間的元素

                

        (9)zcount返回集合中score在給定區間的數量

                

        (10)zcard返回集合中元素的個數

                

        (11)zremrangebyrank刪除集合中排名在給定區間的元素

                

        (12)zremrangebyscore刪除集合中score在給定區間的元素

                

5、redis經常使用命令

    redis提供了豐富的命令對數據庫和各類數據庫類型進行操做,這些命令能夠在linux終端使用。

    一、鍵值相關的命令

        (1)keys返回知足給定參數的全部key。用表達式*,表明取出全部的key

                

        (2)exists確認一個key是否存在

                

        (3)expire設置一個key的過時時間

                

        (4)move將當前數據庫中的key轉移到其它數據庫中

                

        (5)persist移除給定key的過時時間

                

        (6)randomkey隨機返回key空間的一個key

                

        (7)rename重命名key

                

        (8)type:返回值的類型

                

    二、服務器相關命令

        (1)select選擇數據庫。redis數據庫編號從0-15,咱們能夠選擇任一個進行數據的存取,若不在編號內會報錯

                

        (2)quit退出鏈接

                

        (3)dbsize返回當前數據庫中key的數目

                

        (4)info獲取服務器的信息和統計

                

        (5)config get獲取參數的配置。

                本例中咱們獲取了dir這個參數配置的值,若是想獲取所有參數的配置只須要執行」config get *」便可將所有的值都顯示出來

                

        (6)flushdb刪除當前選擇數據庫中的全部key

                

        (7)flushall刪除全部數據庫中的全部的 key

                

6、redis的安全性

    設置客戶端鏈接後進行任何其餘操做前須要使用密碼。注意:由於 redis速度至關快,因此在一臺比較好的服務器下,一個外部的用戶能夠在一秒鐘進行150k次的密碼嘗試,這意味着你須要指定很是很是強大的密碼來防止暴力破解。

    一、設置密碼的方式,打開redis的配置文件

        #requirepass 設置的密碼        設置完密碼後,redis服務要重啓

        好比:requirepass guangzhou

    二、設置完成密碼後,客戶端登陸方式

        第一種方式:登陸後,執行auth 設置的密碼  後才能操做,不然不能任何操做

        

        第二種方式:在登陸時,輸入密碼    /usr/local/redis/bin/redis-cli  –a  設置的密碼

        

7、持久化機制

    redis是一個支持持久化的內存數據庫,也就是說redis須要常常將內存中的數據同步到硬盤來保證持久化。

    redis支持兩種持久化方式:

    一、snapshotting(快照)默認方式

        快照是默認的持久化方式。這種方式是將內存中數據以快照的方式寫入到二進制文件中,默認的文件名爲dump.rdb。能夠經過配置設置自動作快照持久化的方式。咱們能夠配置redis在n秒內若是超過mkey修改就自動作快照。

        

        快照方式的缺點:因爲快照方式是在必定間隔作一次的,因此若是redis意外down掉的話,就會丟失最後一次快照後的全部修改。

    二、append-only file( 縮寫aof)的方式

        aof比快照方式有更好的持久化性,是因爲在使用aof時,redis會將每個收到的寫命令都經過write函數追加到文件中,當redis重啓時會經過從新執行文件中保存的寫命令來在內存中重建整個數據庫的內容。

        固然因爲os會在內核中緩存write作的修改,因此可能不是當即寫到磁盤上。這樣aof方式的持久化也仍是有可能會丟失部分修改。能夠經過配置文件告訴reids咱們想要經過fsync函數強制os寫入到磁盤的時機。

        

8、redis配置文件經常使用的項

    daemonize若是須要在後臺運行,把該項改成yes            pidfile:配置多個pid的地址 默認在/var/run/redis.pid

    bind:綁定ip,設置後只接受來自該ip的請求                     port:監聽端口,默認爲6379

    timeout:設置客戶端鏈接時的超時時間,單位爲秒。      logfile:配置log文件的地址。

    databases:設置數據庫的個數,默認使用的數據庫爲0    sava:設置redis進行數據庫鏡像的頻率。

    rdbcompression:在進行鏡像備份時,是否進行壓縮。     Dbfilename:鏡像備份文件的文件名。

    Dir:數據庫鏡像備份的文件放置路徑。                              Slaveof:設置數據庫爲其餘數據庫的從數據庫。

    Masterauth:主數據庫鏈接須要的密碼驗證。                 Requirepass:設置登陸時須要使用的密碼。

    Maxclients:限制同時鏈接的客戶數量                               Maxmemory:設置redis可以使用的最大內存。

    Appendonly:開啓append only模式。

9、php支持redis

    一、下載擴展,在下載擴展時要注意,和php的版本要兼容

    二、把對應的擴展拷貝到,php的安裝目錄ext目錄下面

            

    三、打開php.ini文件,引入擴展

            

    四、重啓apache進行測試,寫一個文件,運行phpinfo()函數測試

            

    五、基本使用

            

相關文章
相關標籤/搜索