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