memcache官方定義 php
Free & open source, high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web applications by alleviating database load. html
redis官方定義
Redis is an open source, BSD licensed, advanced key-value store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets. java
版權相同 nginx
它們都是使用的bsd協議,使用它的項目能夠用於商業用戶,沒必要發佈二次修改的代碼,能夠修改源代碼。 git
數據類型 github
redis數據類型豐富,支持set liset等類型
memcache支持簡單數據類型,須要客戶端本身處理複雜對象 web
持久性 redis
redis支持數據落地持久化存儲
memcache不支持數據持久存儲 數據庫
分佈式存儲 vim
redis支持master-slave複製模式
memcache可使用一致性hash作分佈式
value大小不一樣
memcache是一個內存緩存,key的長度小於250字符,單個item存儲要小於1M,不適合虛擬機使用
數據一致性不一樣
redis使用的是單線程模型,保證了數據按順序提交。
memcache須要使用cas保證數據一致性。CAS(Check and Set)是一個確保併發一致性的機制,屬於「樂觀鎖」範疇;原理很簡單:拿版本號,操做,對比版本號,若是一致就操做,不一致就放棄任何操做
cpu利用
redis單線程模型只能使用一個cpu,能夠開啓多個redis進程
參考
http://www.cnblogs.com/qunshu/p/3196972.html
http://www.blogjava.net/chhbjh/archive/2012/02/21/370472.html
http://maoyidao.iteye.com/blog/1846089
redis是一個內存數據庫,比memcache支持更豐富的value類型,新浪微博就使用redis來作緩存。
redis的源碼安裝
wget http://download.redis.io/redis-stable.tar.gz tar -zxvf redis-stable.tar.gz cd redis-stable make make test make install
1.make時可能會報以下錯誤:
zmalloc.o: In function `zmalloc_used_memory': /root/redis-stable/src/zmalloc.c:223: undefined reference to `__sync_add_and_fetch_4' collect2: ld returned 1 exit status make[1]: *** [redis-server] Error 1 make[1]: Leaving directory `/root/redis-stable/src' make: *** [all] Error 2
解決辦法:
編輯src/.make-settings裏的OPT,改成OPT=-O2 -march=i686。
2.make test報錯:
You need tcl 8.5 or newer in order to run the Redis test make: *** [test] Error 1
解決辦法安裝tcl
wget http://downloads.sourceforge.net/tcl/tcl8.6.0-src.tar.gz cd tcl8.6.0/ cd unix && ./configure --prefix=/usr \ --mandir=/usr/share/man \ --without-tzdata \ $([ $(uname -m) = x86_64 ] && echo --enable-64bit) && make && sed -e "s@^\(TCL_SRC_DIR='\).*@\1/usr/include'@" \ -e "/TCL_B/s@='\(-L\)\?.*unix@='\1/usr/lib@" \ -i tclConfig.sh make install && make install-private-headers && ln -v -sf tclsh8.6 /usr/bin/tclsh && chmod -v 755 /usr/lib/libtcl8.6.so
redis命令介紹
Redis 由四個可執行文件:redis-benchmark、redis-cli、redis-server、redis-stat 這四個文件,加上一個redis.conf就構成了整個redis的最終可用包。它們的做用以下:
redis-server:Redis服務器的daemon啓動程序
redis-cli:Redis命令行操做工具。固然,你也能夠用telnet根據其純文本協議來操做
redis-benchmark:Redis性能測試工具,測試Redis在你的系統及你的配置下的讀寫性能
redis-stat:Redis狀態檢測工具,能夠檢測Redis當前狀態參數及延遲情況
如今就能夠啓動redis了,redis只有一個啓動參數,就是他的配置文件路徑。
啓動redis
複製源碼包裏的redis.conf到/etc
# cd redis-stable
# cp redis.conf /etc/redis.conf
編輯/etc/redis.conf ,修改
daemaon no 爲daemaon yes ,以守護進程方式啓動進程。
# redis-server /etc/redis.conf
關閉redis
# redis-cli shutdown //關閉全部
關閉某個端口上的redis
# redis-cli -p 6397 shutdown //關閉6397端口的redis
說明:關閉之後緩存數據會自動dump到硬盤上,硬盤地址見redis.conf中的dbfilename dump.rdb
redis配置
注意,默認複製過去的redis.conf文件的daemonize參數爲no,因此redis不會在後臺運行,這時要測試,咱們須要從新開一個終端。修改成yes則爲後臺運行redis。另外配置文件中規定了pid文件,log文件和數據文件的地址,若是有須要先修改,默認log信息定向到stdout.
下面是redis.conf的主要配置參數的意義:
daemonize:是否之後臺daemon方式運行
pidfile:pid文件位置
port:監聽的端口號
timeout:請求超時時間
loglevel:log信息級別
logfile:log文件位置
databases:開啓數據庫的數量
save * *:保存快照的頻率,第一個*表示多長時間,第三個*表示執行多少次寫操做。在必定時間內執行必定數量的寫操做時,自動保存快照。可設置多個條件。
rdbcompression:是否使用壓縮
dbfilename:數據快照文件名(只是文件名,不包括目錄)
dir:數據快照的保存目錄(這個是目錄)
appendonly:是否開啓appendonlylog,開啓的話每次寫操做會記一條log,這會提升數據抗風險能力,但影響效率。
appendfsync:appendonlylog如何同步到磁盤(三個選項,分別是每次寫都強制調用fsync、每秒啓用一次fsync、不調用fsync等待系統本身同步)
這時你能夠打開一個終端進行測試了,配置文件中默認的監聽端口是6379
redis開機自動啓動
用這個腳本管理以前,須要先配置下面的內核參數,不然Redis腳本在重啓或中止redis時,將會報錯,而且不能自動在中止服務前同步數據到磁盤上:
# vi /etc/sysctl.conf
vm.overcommit_memory = 1
而後應用生效:
# sysctl –p
創建redis啓動腳本:
# vim /etc/init.d/redis
#!/bin/bash # # Init file for redis # # chkconfig: - 80 12 # description: redis daemon # # processname: redis # config: /etc/redis.conf # pidfile: /var/run/redis.pid source /etc/init.d/functions #BIN="/usr/local/bin" BIN="/usr/local/bin" CONFIG="/etc/redis.conf" PIDFILE="/var/run/redis.pid" ### Read configuration [ -r "$SYSCONFIG" ] && source "$SYSCONFIG" RETVAL=0 prog="redis-server" desc="Redis Server" start() { if [ -e $PIDFILE ];then echo "$desc already running...." exit 1 fi echo -n $"Starting $desc: " daemon $BIN/$prog $CONFIG RETVAL=$? echo [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog return $RETVAL } stop() { echo -n $"Stop $desc: " killproc $prog RETVAL=$? echo [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog $PIDFILE return $RETVAL } restart() { stop start } case "$1" in start) start ;; stop) stop ;; restart) restart ;; condrestart) [ -e /var/lock/subsys/$prog ] && restart RETVAL=$? ;; status) status $prog RETVAL=$? ;; *) echo $"Usage: $0 {start|stop|restart|condrestart|status}" RETVAL=1 esac exit $RETVAL
而後增長服務並開機自啓動:
# chmod 755 /etc/init.d/redis # chkconfig --add redis # chkconfig --level 345 redis on # chkconfig --list redis
redis php擴展安裝
wget https://github.com/nicolasff/phpredis/zipball/master -O php-redis.zip
unzip php-redis.zip
cd nicolasff-phpredis-2d0f29b/
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install
完成後redis.so被安裝到
/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/
vi /usr/local/php/lib/php.ini
添加
extension=redis.so
重啓php-fpm便可。
configure時可能會遇到,添加--with-php-config參數能夠解決。
configure: error: Cannot find php-config. Please use --with-php-config=PATH
./configure --with-php-config=/usr/local/php/bin/php-config