Redis的启动停止
Redis安装配置完成后,启动过程非常简单,执行命令/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf即可。停止Redis的最简单的方法是在启动实例的session中,直接使用Control-C命令。当然还可以通过客户端来停止服务,如可以用shutdown来停止Redis实例,具体命令为src/redis-cli shutdown。
下面是一个Shell脚本(供参考),用于管理Redis(启动、停止、重启)。为其赋予可执行权限,即可像其他服务一样使用。
#!/bin/sh # # redis - this script starts and stops the redis-server daemon # # chkconfig: - 85 15 # description: Redis is a persistent key-value database # processname: redis-server # config: /usr/local/redis-2.4.X/bin/redis-server # config: /usr/local/ /redis-2.4.X/etc/redis.conf # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ "$NETWORKING" = "no" ] && exit 0 redis="/usr/local/webserver/redis-2.4.X/bin/redis-server" prog=$(basename $redis) REDIS_CONF_FILE="/usr/local/webserver/redis-2.4.X/etc/redis.conf" [ -f /etc/sysconfig/redis ] && . /etc/sysconfig/redis lockfile=/var/lock/subsys/redis start() { [ -x $redis ] || exit 5 [ -f $REDIS_CONF_FILE ] || exit 6 echo -n $"Starting $prog: " daemon $redis $REDIS_CONF_FILE retval=$? echo [ $retval -eq 0 ] && touch $lockfile return $retval } stop() { echo -n $"Stopping $prog: " killproc $prog -QUIT retval=$? echo [ $retval -eq 0 ] && rm -f $lockfile return $retval } restart() { stop start } reload() { echo -n $"Reloading $prog: " killproc $redis -HUP RETVAL=$? echo } force_reload() { restart } rh_status() { status $prog } rh_status_q() { rh_status >/dev/null 2>&1 } case "$1" in start) rh_status_q && exit 0 $1 ;; stop) rh_status_q || exit 0 $1 ;; restart|configtest) $1 ;; reload) rh_status_q || exit 7 $1 ;; force-reload) force_reload ;; status) rh_status ;; condrestart|try-restart) rh_status_q || exit 0 ;; *) echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart| reload|orce-reload}" exit 2 esac
11.2.4 Redis的配置文件详解(1)
#daemonize:默认情况下,Redis不在后台运行,如果需要在后台运行Redis,需要把该项的值更改为yes。
#pidfile在后台运行的时候,Redis默认将pid文件放在/var/run/redis.pid中,也可以设置为其他地址。需要注意的是,当运行多个Redis服务时,需要指定不同的pid文件和端口。
#bind指定Redis只接收来自于该IP地址的请求,如果不进行设置,那么将处理所有请求,在生产环境中最好设置该项参数。
#portRedis监听的端口,默认为6379。
#timeout设置客户端连接时的超时时间,单位为秒。若客户端在这段时间内没有发出任何指令,那么就会关闭相应连接。
#loglevel
log等级分为4级:debug、verbose、notice和warning。生产环境中一般开启notice就足够应对大多状况。
#logfile配置log文件的地址,默认使用标准输出,即打印在命令行终端的窗口上。
#databases设置数据库的个数,可以使用SELECT命令来切换数据库。默认使用的数据库是0。
#save <seconds> <changes>
设置Redis进行数据库备份的频率。指出在某时间内进行多少次更新操作,并将数据同步到数据文件rdb。相当于条件触发抓取快照,可以多条件配合设置。
save 900 1 900秒内至少有1个key被改变
save 300 10 300秒内至少有300个key被改变
save 60 10000 60秒内至少有10000个key被改变
这里只是写了一条,如果在86400秒之内有1个keys发生变化时就进行备份。如果没有特别的设定,就是一天一备份。
#rdbcompression设置在进行镜像备份时是否进行压缩。
#dbfilename镜像备份文件的文件名。
#dir数据库镜像备份文件的放置路径。路径跟文件名要分开配置,因为Redis在进行备份时,会先将当前数据库的状态写入一个临时文件,等备份完成时,再把该临时文件替换为所指定的文件,而临时文件和所配置的备份文件都存放在指定路径当中。
#slaveof设置该数据库为其他数据库的从数据库。
#masterauth当主数据库连接需要密码验证时,用该指令指定。
#requirepass
设置客户端连接后进行任何其他指定前需要使用的密码。
需要注意的是,因为Redis速度相当快,所以在配置比较好的服务器下,外部用户可以在一秒钟内进行150000次的密码尝试,这意味着需要指定非常强大的密码来防止他人进行暴力破解。
#maxclients
11.2.4 Redis的配置文件详解(2)
限制同时连接的客户数量。当连接数超过这个值时,Redis将不再接收其他连接请求,客户端尝试连接时将收到error信息提示。
#maxmemory设置Redis能够使用的最大内存。当内存被完全占用时,再接收到set命令,Redis将先尝试剔除设置过expire信息的key,而不管该key过期与否,将按照过期时间进行删除,最先过期的key最先被删除。如果带有expire信息的key已被全部删除,那么将返回出错提示,Redis将不再接收写请求,只接收get请求。maxmemory的设置比较适合把redis当作类似memcached的缓存来使用。
#appendonly默认情况下,Redis会在后台异步把数据库镜像备份到磁盘,但是这样备份非常耗时,而且备份也不能很频繁,如果发生断电,将造成大量的数据丢失。所以Redis提供了另外一种更加高效的数据库备份及灾难恢复方式。开启append only模式之后,Redis会把所接收到的每一次写操作请求都追加到appendonly.aof文件中,当Redis重新启动时,会从该文件恢复到之前的状态。但是这样容易造成appendonly.aof文件过大,所以Redis还支持BGREWRITEAOF指令,可以对appendonly.aof文件进行重新整理。
#appendfsync设置对appendonly.aof文件进行同步的频率。always表示每次只要有写操作就进行同步;everysec表示对写操作进行累积,每秒同步一次。可根据实际业务场景自行配置。
#vm-enabled是否开启虚拟内存支持。因为Redis是一个内存数据库,而且当内存满时,无法接收新的写请求,所以Redis 2.X版本提供了虚拟内存支持功能。但是,要注意:Redis将所有的key都放在内存中,当内存不够时,只会把value值放入交换区。这样,虽然使用虚拟内存,但性能基本不受影响。同时,vm-max-memory要设置到足够大才能放下所有的key。
#vm-swap-file设置虚拟内存的交换文件路径。
#vm-max-memory设置开启虚拟内存之后,Redis将使用的最大物理内存的大小,默认为0。Redis将所有的能放到交换文件的内容都放到交换文件中,以尽量减少对物理内存的占用。在生产环境下,需要根据实际情况设置该值,最好不要使用默认的0值。
#vm-page-size设置虚拟内存的页面大小,如果要在value中放置博客、新闻之类的文章内容,就将空间设置大一些;如果要放置的都是很小的内容,则空间设置可以小一点。
#vm-pages设置交换文件的总的页数。需要注意的是,page table信息存放在物理内存中,每8个page就会占据RAM中的1个byte。总的虚拟内存大小为vm-page-size * vm-pages。
#vm-max-threads
设置VM、I/O同时使用的线程数量。因为在进行内存交换时,会进行数据编码和解码,所以尽管I/O设备本身不能支持很多的并发读写,如果环境中所保存的vlaue值比较大,那么将该值设置大一些,仍然能够提升其性能。
如果该值非零,当主线程检测到使用的内存超过最大上限,会将选中的要交换对象的信息放到一个队列中,并交由工作线程进行后台处理,主线程则继续处理客户端的 请求。
如果有客户端请求的key被换出,主线程先阻塞发出命令的客户端,然后将加载对象的信息放到队列中,让工作线程去加载。加载完毕后,工作线程通知主线程,主线程再执行客户端的命令。这种方式只阻塞请求value被换出key的客户端请求。
#glueoutputbuf把较小的输出缓存放在一起,以便能够在一个TCP packet中为客户端发送多个响应。Redis2.X版本引入了hash数据结构。当hash中包含超过指定元素个数并且最大的元素没有超过临界时,hash将以一种特殊的编码方式(大大减少内存使用)来存储,临界值设置参数如下。
#hash-max-zipmap-entries #activerehashing
开启之后,Redis将在每100毫秒时使用1毫秒的CPU时间来对Redis的hash表进行重新hash,以降低内存的使用。生产环境往往有非常严格的实时性要求,如不能够接受Redis时不时对请求有所延迟,可以把这项配置设置为no。如果没有这么严格的实时性要求,可以设置为yes,以便能够尽可能快地释放内存。
11.2.5 Redis的管理(1)
Redis配置文件一旦写好既无需更改,除非需要再次调整及优化。所以对其操作一般使用命令行的形式。接下来介绍Redis常用的命令-键值相关命令
1.ping
测试连接是否存活:
redis 127.0.0.1:6379> ping PONG执行下面命令之前,停止redis服务器
redis 127.0.0.1:6379> ping Could not connect to Redis at 127.0.0.1:6379: Connection refused执行下面命令之前,启动redis服务器
not connected> ping PONG redis 127.0.0.1:6379>
第一次ping时,说明连接正常;
第二次ping之前,因为将Redis服务器停止,那么ping是失败的;
第三次ping之前,因为将Redis服务器启动,则ping是成功的。
2.echo
在命令行打印某些内容:
redis 127.0.0.1:6379> echo test "test" redis 127.0.0.1:6379>
3.select
选择数据库。Redis数据库编号为0~15,可以选择任意一个数据库来进行数据存取。
redis 127.0.0.1:6379> select 1 OK redis 127.0.0.1:6379[1]> select 16 (error) ERR invalid DB index redis 127.0.0.1:6379[16]>
当选择16号数据库时,系统报错,说明没有编号为16的数据库。
4.quit
退出连接。
redis 127.0.0.1:6379> quit [root@localhost /]#
5.dbsize
返回当前数据库中key的数目。
redis 127.0.0.1:6379> dbsize (integer) 18 redis 127.0.0.1:6379>
结果说明此库中有18个key。
6.info
获取服务器的信息和统计。
redis 127.0.0.1:6379> info redis_version:2.4.X redis_git_sha1:00000000 redis_git_dirty:0 arch_bits:32 multiplexing_api:epoll process_id:28480 uptime_in_seconds:2515 uptime_in_days:0 redis 127.0.0.1:6379>
7.monitor
实时转储收到的请求。
redis 127.0.0.1:6379> config get dir 1) "dir" 2) "/root/4setup/redis-2.4.X" redis 127.0.0.1:6379>