redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。问题是这个项目还很新,可能还不足够稳定,而且没有在实际的一些大型系统应用的实例。此外,缺乏mc中批量get也是比较大的问题,始终批量获取跟多次获取的网络开销是不一样的。
性能测试结果:
SET操作每秒钟 110000 次,GET操作每秒钟 81000 次,服务器配置如下:
Linux 2.6, Xeon X3320 2.5Ghz.安装过程:
Redis是一种高级key-value数据库。它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。有字符串,链表,集 合和有序集合。支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能。所以Redis也可以被看成是一个数据结构服务器。
Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”);也可以把每一次数据变化都写入到一个append only file(aof)里面(这称为“全持久化模式”)。
一、下载最新版
[root@rekfan /]# wget http://download.redis.io/releases/redis-2.8.3.tar.gz
二、解压缩
[root@rekfan /]# tar zxvf redis-2.8.3.tar.gz
三、安装C/C++的编译组件(非必须)
[root@rekfan /]# yum install build-essential
四、编译
[root@rekfan /]# cd redis-2.8.3
[root@rekfan redis-2.8.3]# makemake命令执行完成后,会在当前src目录下生成本个可执行文件,分别是redis-server、redis-cli、redis-benchmark、redis-stat,它们的作用如下:
redis-server:Redis服务器的daemon启动程序redis-cli:Redis命令行操作工具。当然,你也可以用telnet根据其纯文本协议来操作redis-benchmark:Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能redis-stat:Redis状态检测工具,可以检测Redis当前状态参数及延迟状况
[root@rekfan redis-2.8.3]# mv ../redis-2.8.3 /usr/local/redis
五、修改配置文件
/etc/sysctl.conf添加vm.overcommit_memory=1刷新配置使之生效sysctl vm.overcommit_memory=1补充介绍:
**如果内存情况比较紧张的话,需要设定内核参数:[root@rekfan /]# echo 1 > /proc/sys/vm/overcommit_memory内核参数说明如下:
overcommit_memory文件指定了内核针对内存分配的策略,其值可以是0、1、2。
0,表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。2, 表示内核允许分配超过所有物理内存和交换空间总和的内存[root@rekfan /]# cd /usr/local/redis/[root@rekfan redis]# mkdir etc[root@rekfan redis]# cp redis.conf ./etc/redis.conf**编辑redis.conf配置文件(/usr/local/redis/etc/redis.conf),按需求做出适当调整,比如:daemonize yes #转为守护进程,否则启动时会每隔5秒输出一行监控信息save 60 1000 #减小改变次数,其实这个可以根据情况进行指定maxmemory 256000000 #分配256M内存在我们成功安装Redis后,我们直接执行redis-server即可运行Redis,此时它是按照默认配置来运行的(默认配置甚至不是后台运 行)。我们希望Redis按我们的要求运行,则我们需要修改配置文件,Redis的配置文件就是我们上面第二个cp操作的redis.conf文件,目前 它被我们拷贝到了/usr/local/redis/etc/目录下。修改它就可以配置我们的server了。如何修改?下面是redis.conf的主 要配置参数的意义:
中文说明:
1,是否以后台进程运行,默认为nodaemonize no
2,如以后台进程运行,则需指定一个pid,默认为/var/run/redis.pidpidfile /var/run/redis.pid
3,监听端口,默认为6379port 6379
4,绑定主机IP,默认值为127.0.0.1(注释)bind 127.0.0.1
5,超时时间,默认为300(秒)timeout 300
6,日志记录等级,有4个可选值,debug,verbose(默认值),notice,warningloglevel verbose
7,日志记录方式,默认值为stdoutlogfile stdout
8,可用数据库数,默认值为16,默认数据库为0databases 16
9,指出在多长时间内,有多少次更新操作,就将数据同步到数据文件。这个可以多个条件配合,比如默认配置文件中的设置,就设置了三个条件。
900秒(15分钟)内至少有1个key被改变save 900 1300秒(5分钟)内至少有10个key被改变save 300 10
10,存储至本地数据库时是否压缩数据,默认为yesrdbcompression yes
11,本地数据库文件名,默认值为dump.rdbdbfilename /root/redis_db/dump.rdb
12,本地数据库存放路径,默认值为 ./dir /root/redis_db/
13,当本机为从服务时,设置主服务的IP及端口(注释)slaveof <masterip> <masterport>
14,当本机为从服务时,设置主服务的连接密码(注释)masterauth <master-password>
15,连接密码(注释)requirepass foobared
16,最大客户端连接数,默认不限制(注释)maxclients 128
17,设置最大内存,达到最大内存设置后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理后,任到达最大内存设置,将无法再进行写入操作。(注释)maxmemory <bytes>
18,是否在每次更新操作后进行日志记录,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认值为noappendonly yes
19,更新日志文件名,默认值为appendonly.aof(注释)appendfilename /root/redis_db/appendonly.aof
20,更新日志条件,共有3个可选值。no表示等操作系统进行数据缓存同步到磁盘,always表示每次更新操作后手动调用fsync()将数据写到磁盘,everysec表示每秒同步一次(默认值)。appendfsync everysec
21,是否使用虚拟内存,默认值为novm-enabled yes
22,虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享vm-swap-file /tmp/redis.swap
23,将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的 (Redis的索引数据就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0。vm-max-memory 0
24,虚拟内存文件以块存储,每块32bytesvm-page-size 32
25,虚拟内在文件的最大数vm-pages 134217728
26,可以设置访问swap文件的线程数,设置最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的.可能会造成比较长时间的延迟,但是对数据完整性有很好的保证.vm-max-threads 4
27,把小的输出缓存放在一起,以便能够在一个TCP packet中为客户端发送多个响应,具体原理和真实效果我不是很清楚。所以根据注释,你不是很确定的时候就设置成yesglueoutputbuf yes
28,在redis 2.0中引入了hash数据结构。当hash中包含超过指定元素个数并且最大的元素没有超过临界时,hash将以一种特殊的编码方式(大大减少内存使用)来存储,这里可以设置这两个临界值hash-max-zipmap-entries 64
29,hash中一个元素的最大值hash-max-zipmap-value 512
30,开启之后,redis将在每100毫秒时使用1毫秒的CPU时间来对redis的hash表进行重新hash,可以降低内存的使用。当你的使 用场景中,有非常严格的实时性需要,不能够接受Redis时不时的对请求有2毫秒的延迟的话,把这项配置为no。如果没有这么严格的实时性要求,可以设置 为yes,以便能够尽可能快的释放内存activerehashing yes
下面是一个略做修改后的配置文件内容:
daemonize yes
pidfile /usr/local/redis/var/redis.pidport 6379timeout 300loglevel debuglogfile /usr/local/redis/var/redis.logdatabases 16save 900 1save 300 10save 60 10000rdbcompression yesdbfilename dump.rdbdir /usr/local/redis/var/appendonly noappendfsync alwaysglueoutputbuf yesshareobjects noshareobjectspoolsize 1024将上面内容写为redis.conf并保存到/usr/local/redis/etc/目录下然后在命令行执行:
[root@rekfan /]# /usr/local/redis/src/redis-server /usr/local/redis/etc/redis.conf
即可在后台启动redis服务,这时你通过
telnet 127.0.0.1 6379
即可连接到你的redis服务。
安装PHP的Redis扩展http://pecl.php.net/package/redis
[root@rekfan /]# wget http://pecl.php.net/get/redis-2.2.4.tgz
[root@rekfan /]# tar -zxvf redis-2.2.4.tgz[root@rekfan /]# cd redis-2.2.4[root@rekfan redis-2.2.4]# /usr/local/php/bin/phpize[root@rekfan redis-2.2.4]# ./configure --with-php-config=/usr/local/php/bin/php-config[root@rekfan redis-2.2.4]# make && make install配置php.ini
vi /usr/local/php/etc/php.ini(加入:extension=redis.so)六、启动服务并验证
启动服务器
[root@rekfan src]# ./redis-server或[root@rekfan src]# ./redis-server ./etc/redis.conf 查看是否成功启动$ ps -ef | grep redis 或[root@rekfan src]#./redis-cli pingPONG附:启动脚本
# ###########################################################
# chkconfig: 2345 90 10
# description: Redis is a persistent key-value database
PATH=
/usr/local/bin
:
/sbin
:
/usr/bin
:
/bin
REDISPORT=6379
EXEC=
/usr/local/redis/src/redis-server
REDIS_CLI=
/usr/local/redis/src/redis-cli
PIDFILE=
/var/run/redis
.pid
CONF=
"/usr/local/redis/etc/redis.conf"
case
"$1"
in
start)
if
[ -f $PIDFILE ]
then
echo
"$PIDFILE exists, process is already running or crashed"
else
echo
"Starting Redis server..."
$EXEC $CONF
fi
if
[
"$?"
=
"0"
]
then
echo
"Redis is running..."
fi
;;
stop)
if
[ ! -f $PIDFILE ]
then
echo
"$PIDFILE does not exist, process is not running"
else
PID=$(
cat
$PIDFILE)
echo
"Stopping ..."
$REDIS_CLI -p $REDISPORT SHUTDOWN
while
[ -x ${PIDFILE} ]
do
echo
"Waiting for Redis to shutdown ..."
sleep
1
done
echo
"Redis stopped"
fi
;;
restart|force-reload)
${0} stop
${0} start
;;
*)
echo
"Usage: /etc/init.d/redis {start|stop|restart|force-reload}"
>&2
exit
1
esac
# ###########################################################
[root@rekfan ]# chmod +x /etc/init.d/redis
其实做成服务启动,也是调用redis-server,如果想让它在后台作为daemon运行,那么
需要修改redis.conf,将 daemonize no 改为 daemonize yes设定开机启动服务
[root@rekfan src]# chkconfig redis on启动,停止redis
启动:service redis start #或者 /etc/init.d/redis start停止:service redis stop #或者 /etc/init.d/redis stop七、启动命令行客户端赋值取值
[root@rekfan src]# redis-cli set mykey somevalue[root@rekfan src]# ./redis-cli get mykey八、关闭服务
[root@rekfan src]# redis-cli shutdown #关闭指定端口的redis-server [root@rekfan src]# redis-cli -p 6380 shutdown九、客户端也可以使用telnet形式连接。
[root@dbcache conf]# telnet 127.0.0.1 6379Trying 127.0.0.1...Connected to dbcache (127.0.0.1).Escape character is '^]'.set foo 3bar+OKget foo$3bar^]telnet> quitConnection closed.