1. redis简介
Redis是个高性能的key-value数据库,它的key具有丰富的数据结构:string,hash,list set和sorted set。作为NOSQL,比起memcache之类,不仅仅key数据结构丰富,而且具有持久化的功能,并且能够支持主从复制,很方便构建集群。redis高性能很大程度上源于它是个内存型数据库,它的高性能表现在:set操作11w/s,get操作8.1w/s,与其他类型数据库性能差异,可以而参考:http://timyang.net/data/mcdb-tt-redis/ 。为了进一步加深对redis的理解总结,我打算写个redis系列的博客。这里主要谈谈redis安装部署及运维维护。
2. 下载安装
1. [root@xsf003 tool]# wget -c http://redis.googlecode.com/files/redis-2.4.17.tar.gz #下载
2. [root@xsf003 tool]# tar -zxvf redis-2.4.17.tar.gz #解压
3. [root@xsf003 tool]# cd redis-2.4.17
4. [root@xsf003 redis-2.4.17]# make #编译
5. [root@xsf003 redis-2.4.17]# make install #安装
说明:其实 make install 就是:
cp -p redis-server/usr/local/bin
cp -p redis-benchmark/usr/local/bin
cp -p redis-cli /usr/local/bin
cp -p redis-check-dump/usr/local/bin
cp -p redis-check-aof/usr/local/bin
这样,redis就安装成功了。
接下来就是启动Redis了, 上面编译后生成的那些可执行文件拷贝到了/usr/local/bin目录下面, 他们的作用分别是:
redis-server:Redis服务器的daemon启动程序
redis-cli:Redis命令行操作工具。当然,你也可以用telnet根据其纯文本协议来操作
redis-benchmark:Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能
安装完毕,常用工具会自动拷贝到/user/loca/bin目录下。做为服务器,我们常常还需要把redis设置成开机自启动,源码包中有个很好用的脚本,执行脚步根据提示输入即可。
1. [root@xsf003 redis-2.4.17]# cd utils/
2. [root@xsf003 utils]# ./install_server.sh
3. Welcome to the redis service installer
4. This script will help you easily set up a running redis server
5.
6.
7. Please select the redis port for this instance: [6379]
8. Selecting default: 6379
9. Please select the redis config file name [/etc/redis/6379.conf]
10. Selected default - /etc/redis/6379.conf
11. Please select the redis log file name [/var/log/redis_6379.log]
12. Selected default - /var/log/redis_6379.log
13. Please select the data directory for this instance [/var/lib/redis/6379]
14. Selected default - /var/lib/redis/6379
15. Please select the redis executable path [/usr/local/bin/redis-server]
16. Copied /tmp/6379.conf => /etc/init.d/redis_6379
17. Installing service...
18. Successfully added to chkconfig!
19. Successfully added to runlevels 345!
20. Starting Redis server...
21. Installation successful!
3. 开关服务
1. [root@xsf003 utils]# /etc/init.d/redis_6379 stop #关闭
2. [root@xsf003 utils]# /etc/init.d/redis_6379 start #启动
也可以用下面类似的命令直接启动关闭redis服务:
1. /usr/local/bin/redis-server /etc/redis/redis.conf #指定配置文件 启动
2. /usr/local/bin/redis-cli -p 6379 shutdown # 关闭,如果默认端口6379 可以直接 /usr/local/bin/redis-cli shutdown
启动 redis 会出现的问题
Warning: 32 bit instancedetected but no memory limit set. Setting 3 GB maxmemory limit with'noeviction' policy now.
解决方法:修改配置文件 redis.conf 将 maxmemory设置为 maxmemory1024000000 #分配256M内存
WARNING overcommit_memory isset to 0! Background save may fail under low memory condition. To fix thisissue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or runthe command 'sysctl vm.overcommit_memory=1' for this to take effect.
解决方法:警告:过量使用内存设置为0!在低内存环境下,后台保存可能失败。为了修正这个问题,请在/etc/sysctl.conf添加一项 'vm.overcommit_memory = 1' ,然后重启(或者运行命令'sysctl vm.overcommit_memory=1')使其生效。
当启动的时候没有任何信息,表明启动成功。也可以使用 "netstat -tnl"查看6379端口是否启动。
4. 通过客户端命令行工具连接redis服务查看redis相关信息
1) 连接
1. [root@xsf003 utils]# redis-cli
2. redis 127.0.0.1:6379>
2) 其他指令
1. redis 127.0.0.1:6379> info #查看server版本内存使用连接等信息
2. redis 127.0.0.1:6379> client list #获取客户连接列表
3. redis 127.0.0.1:6379> client kill 127.0.0.1:33441 #终止某个客户端连接
4. redis 127.0.0.1:6379> dbsize #当前保存key的数量
5. redis 127.0.0.1:6379> save #立即保存数据到硬盘
6. redis 127.0.0.1:6379> bgsave #异步保存数据到硬盘
7. redis 127.0.0.1:6379> flushdb #当前库中移除所有key
8. redis 127.0.0.1:6379> flushall #移除所有key从所有库中
9. redis 127.0.0.1:6379> lastsave #获取上次成功保存到硬盘的unix时间戳
10. redis 127.0.0.1:6379> monitor #实时监测服务器接收到的请求
11. redis 127.0.0.1:6379> slowlog len #查询慢查询日志条数
12. (integer) 3
13. redis 127.0.0.1:6379> slowlog get #返回所有的慢查询日志,最大值取决于slowlog-max-len配置
14. redis 127.0.0.1:6379> slowlog get 2 #打印两条慢查询日志
15. redis 127.0.0.1:6379> slowlog reset #清空慢查询日志信息
5. 编译 phpredis
unzip phpredis-master.zip
cd phpredis-master
/usr/local/php/bin/phpize
./configure –with-php-config=/usr/local/php/bin/php-config
make && make install
修改 php.ini文件。加载 redis.so模块,重启 Apache!
6. Redis.conf配置说明
1) 其实redis.conf文件中,对每一个配置项都有非常详细的注释,本文只是将其进行翻译,同时加了点小料。本文档所对应的redis版本为2.0.4。
当配置中需要配置内存大小时,可以使用 1k, 5GB, 4M 等类似的格式,其转换方式如下(不区分大小写):
1 | 1k => 1000 bytes |
2 | 1kb => 1024 bytes |
3 | 1m => 1000000 bytes |
4 | 1mb => 1024*1024 bytes |
2) daemonizeno默认情况下,redis不是在后台运行的,如果需要在后台运行,把该项的值更改为yes
3) pidfile/var/run/redis.pid当redis在后台运行的时候,Redis默认会把pid文件放在/var/run/redis.pid,你可以配置到其他地址。当运行多个redis服务时,需要指定不同的pid文件和端口
4) port6379指定redis运行的端口
5) bind127.0.0.1指定redis只接收来自于该IP地址的请求,如果不进行设置,那么将处理所有请求,在生产环境中最好设置该项
6) timeout300设置客户端连接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,那么关闭该连接
7) logleveldebuglog等级分为4级,debug, verbose, notice, 和warning。生产环境下一般开启notice
8) logfilestdout配置log文件地址,默认使用标准输出,即打印在命令行终端的窗口上
9) databases16设置数据库的个数,可以使用SELECT命令来切换数据库。默认使用的数据库是 DB 0
10) save9001 设置Redis进行数据库镜像的频率。
# after 900 sec (15 min) if at least 1 key changed |
# after 300 sec (5 min) if at least 10 keys changed |
# after 60 sec if at least 10000 keys changed |
在给定的例子中,我们可以倒过来理解:
if(在60秒之内有10000个keys发生变化时){ |
进行镜像备份 |
}else if(在300秒之内有10个keys发生了变化){ |
进行镜像备份 |
}else if(在900秒之内有1个keys发生了变化){ |
进行镜像备份 |
} |
所以,按照这里的配置,每隔60秒,redis会检查现在发生了多少变化,是不是应该进行镜像备份了。但是当数据库比较大时,在我的测试中,镜像备份的速度非常慢,并由此导致redis内存暴涨直至crash。
11) rdbcompressionyes在进行镜像备份时,是否进行压缩
12) dbfilenamedump.rdb镜像备份文件的文件名
13) dir/opt/local/var/db/redis/ 数据库镜像备份的文件放置的路径。这里的路径跟文件名要分开配置是因为redis在进行备份时,先会将当前数据库的状态写入到一个临时文件中,等备份完成时,再把该该临时文件替换为上面所指定的文件,而这里的临时文件和上面所配置的备份文件都会放在这个指定的路径当中。
14) slaveof 设置该数据库为其他数据库的从数据库
15) masterauth 当主数据库连接需要密码验证时,在这里指定
16) requirepassfoobared设置客户端连接后进行任何其他指定前需要使用的密码。警告:因为redis速度相当快,所以在一台比较好的服务器下,一个外部的用户可以在一秒钟进行150K次的密码尝试,这意味着你需要指定非常非常强大的密码来防止暴力破解。
17) maxclients128限制同时连接的客户数量。当连接数超过这个值时,redis将不再接收其他连接请求,客户端尝试连接时将收到error信息。
18) maxmemory 设置redis能够使用的最大内存。当内存满了的时候,如果还接收到set命令,redis将先尝试剔除设置过expire信息的key,而不管该key的过期时间还没有到达。在删除时,将按照过期时间进行删除,最早将要被过期的key将最先被删除。如果带有expire信息的key都删光了,那么将返回错误。这样,redis将不再接收写请求,只接收get请求。maxmemory的设置比较适合于把redis当作于类似memcached的缓存来使用。
19) appendonlyno默认情况下,redis会在后台异步的把数据库镜像备份到磁盘,但是该备份是非常耗时的,而且备份也不能很频繁,如果发生诸如拉闸限电、拔插头等状况,那么将造成比较大范围的数据丢失。所以redis提供了另外一种更加高效的数据库备份及灾难恢复方式。开启appendonly模式之后,redis会把所接收到的每一次写操作请求都追加到appendonly.aof文件中,当redis重新启动时,会从该文件恢复出之前的状态。但是这样会造成appendonly.aof文件过大,所以redis还支持了BGREWRITEAOF指令,对appendonly.aof进行重新整理。所以我认为推荐生产环境下的做法为关闭镜像,开启appendonly.aof,同时可以选择在访问较少的时间每天对appendonly.aof进行重写一次。
20) appendfsynceverysec设置对appendonly.aof文件进行同步的频率。always表示每次有写操作都进行同步,everysec表示对写操作进行累积,每秒同步一次。这个需要根据实际业务场景进行配置
21) vm-enabledno是否开启虚拟内存支持。因为redis是一个内存数据库,而且当内存满的时候,无法接收新的写请求,所以在redis 2.0中,提供了虚拟内存的支持。但是需要注意的是,redis中,所有的key都会放在内存中,在内存不够时,只会把value值放入交换区。这样保证了虽然使用虚拟内存,但性能基本不受影响,同时,你需要注意的是你要把vm-max-memory设置到足够来放下你的所有的key
22) vm-swap-file/tmp/redis.swap 设置虚拟内存的交换文件路径
23) vm-max-memory0 这里设置开启虚拟内存之后,redis将使用的最大物理内存的大小。默认为0,redis将把他所有的能放到交换文件的都放到交换文件中,以尽量少的使用物理内存。在生产环境下,需要根据实际情况设置该值,最好不要使用默认的0
24) vm-page-size32 设置虚拟内存的页大小,如果你的value值比较大,比如说你要在value中放置博客、新闻之类的所有文章内容,就设大一点,如果要放置的都是很小的内容,那就设小一点。
25) vm-pages 134217728设置交换文件的总的page数量,需要注意的是,page table信息会放在物理内存中,每8个page就会占据RAM中的1个byte。总的虚拟内存大小 = vm-page-size * vm-pages
26) vm-max-threads4 设置VMIO同时使用的线程数量。因为在进行内存交换时,对数据有编码和解码的过程,所以尽管IO设备在硬件上本上不能支持很多的并发读写,但是还是如果你所保存的vlaue值比较大,将该值设大一些,还是能够提升性能的
27) glueoutputbufyes把小的输出缓存放在一起,以便能够在一个TCPpacket中为客户端发送多个响应,具体原理和真实效果我不是很清楚。所以根据注释,你不是很确定的时候就设置成yes
28) hash-max-zipmap-entries在redis 2.0中引入了hash数据结构。当hash中包含超过指定元素个数并且最大的元素没有超过临界时,hash将以一种特殊的编码方式(大大减少内存使用)来存储,这里可以设置这两个临界值
29) activerehashingyes开启之后,redis将在每100毫秒时使用1毫秒的CPU时间来对redis的hash表进行重新hash,可以降低内存的使用。当你的使用场景中,有非常严格的实时性需要,不能够接受Redis时不时的对请求有2毫秒的延迟的话,把这项配置为no。如果没有这么严格的实时性要求,可以设置为yes,以便能够尽可能快的释放内存
来源:http://www.360doc.com/content/14/0513/14/16202355_377235994.shtml