Redis安装配置.docx
《Redis安装配置.docx》由会员分享,可在线阅读,更多相关《Redis安装配置.docx(16页珍藏版)》请在冰豆网上搜索。
Redis安装配置
“纸上得来终觉浅,绝知此事要躬行。
”
——陆游《冬夜读书示子聿》
学习Redis最好的办法就是动手尝试它。
在介绍Redis最核心的内容之前,本章先来介绍一下如何安装和运行Redis,以及Redis的基础知识,使读者可以在之后的章节中一边学习一边实践。
1、安装Redis
安装Redis是开始Redis学习之旅的第一步。
在安装Redis前需要了解Redis的版本规则以选择最适合自己的版本,Redis约定次版本号(即第一个小数点后的数字)为偶数的版本是稳定版(如2.4版、2.6版),奇数版本是非稳定版(如2.5版、2.7版),推荐使用稳定版本进行开发和在生产环境使用。
1)在POSIX系统中安装
Redis兼容大部分POSIX系统,包括Linux、OSX和BSD等,在这些系统中推荐直接下载Redis源代码编译安装以获得最新的稳定版本。
Redis最新稳定版本的源代码可以从地址http:
//download.redis.io/redis-stable.tar.gz下载。
下载安装包后解压即可使用make命令完成编译,完整的命令如下:
wgethttp:
//download.redis.io/redis-stable.tar.gz
tarxzfredis-stable.tar.gz
cdredis-stable
make
Redis没有其他外部依赖,安装过程很简单。
编译后在Redis源代码目录的src文件夹中可以找到若干个可执行程序,最好在编译后直接执行makeinstall命令来将这些可执行程序复制到/usr/local/bin目录中以便以后执行程序时可以不用输入完整的路径。
在实际运行Redis前推荐使用maketest命令测试Redis是否编译正确,尤其是在编译一个不稳定版本的Redis时。
提示:
除了手工编译外,还可以使用操作系统中的软件包管理器来安装Redis,但目前
大多数软件包管理器中的Redis的版本都较古老。
考虑到Redis的每次升级都提供了对以往
版本的问题修复和性能提升,使用最新版本的Redis往往可以提供更加稳定的体验。
如果
希望享受包管理器带来的便利,在安装前请确认您使用的软件包管理器中Redis的版本并
了解该版本与最新版之间的差异。
http:
//redis.io/topics/problems中列举了一些在以往版本
中存在的已知问题。
2)在OSX系统中安装
OSX下的软件包管理工具Homebrew和MacPorts均提供了较新版本的Redis包,所以我们可以直接使用它们来安装Redis,省去了像其他POSIX系统那样需要手动编译的麻烦。
下面以使用Homwbrew安装Redis为例。
1.安装Homebrew
在终端下输入ruby-e"(curl-fsSkL
Homebrew。
如果之前安装过Homebrew,请执行brewupdate来更新Homebrew,以便安装较新版的
Redis。
2.通过Homebrew安装Redis
使用brewinstall软件包名可以安装相应的包,此处执行brewinstallredis来安装Redis:
$brewinstallredis
==>Downloading
Alreadydownloaded:
/Library/Caches/Homebrew/redis-2.6.9.tar.gz
==>make-C/private/tmp/redis-OV9u/redis-2.6.9/srcCC=cc
==>Caveats
Tohavelaunchdstartredisatlogin:
ln-sfv/usr/local/opt/redis/*.plist~/Library/LaunchAgents
Thentoloadredisnow:
launchctlload~/Library/LaunchAgents/homebrew.mxcl.redis.plist
Or,ifyoudon'twant/needlaunchctl,youcanjustrun:
redis-server/usr/local/etc/redis.conf
/usr/local/Cellar/redis/2.6.9:
9files,740K,builtin6seconds
OSX系统从Tiger版本开始引入了launchd工具来管理后台程序,如果想让Redis随系统自
动运行可以通过以下命令配置launchd:
ln-sfv/usr/local/opt/redis/*.plist~/Library/LaunchAgents
launchctlload~/Library/LaunchAgents/homebrew.mxcl.redis.plist
通过launchd运行的Redis会加载位于/usr/local/etc/redis.conf的配置文件。
3)在Windows中安装
Redis官方不支持Windows。
2011年微软①向Redis提交了一个补丁,以使Redis可以在Windows下编译运行,但被SalvatoreSanfilippo拒绝了,原因是在服务器领域上Linux已经得到了广泛的使用,让Redis能在Windows下运行相比而言显得不那么重要。
并且Redis使用了如写时复制等很多操作系统相关的特性,兼容Windows会耗费太大的精力而影响Redis其他功能的开发。
尽管如此微软还是发布了一个可以在Windows运行的Redis分支②,但是考虑到其版本更新速度比较慢(截至本书交稿,其最新的版本是基于Redis2.4进行开发的),并不建议使用。
注释:
①微软开放技术有限公司(MicrosoftOpenTechnologiesInc.),专注于参与开源项
目、开放标准工作组以及提出倡议。
注释:
②见SOpenTech/Redis。
如果想使用Windows学习或测试Redis可以通过Cygwin软件或虚拟机(如VirtualBox)来完成。
Cygwin能够在Windows中模拟Linux系统环境。
Cygwin实现了一个LinuxAPI接口,使得大部分Linux下的软件可以重新编译后在Windows下运行。
Cygwin还提供了自己的软件包管理工具,让用户能够方便地安装和升级几千个软件包。
借助Cygwin,我们可以在Windows上通过源代码编译安装最新版的Redis。
1.安装Cygwin
从Cygwin官方网站()下载setup.exe程序,setup.exe既是Cygwin的安装包,又是Cygwin的软件包管理器。
运行setup.exe后进入安装向导。
前几步会要求选择下载源、安装路径、代理和下载镜像等,可以根据具体需求选择,一般来说一路单击“Next”即可。
之后会出现软件包管理界面,如下图所示。
编译安装Redis需要用到的包有gcc和make,二者都可以在“Devel”分类中找到。
在“New”字段中标记为“Skip”的包表示不安装,单击“Skip”切换成需要安装的版本号即可令Cygwin在稍后安装该版本的包。
图中所示gcc包的状态为“Keep”是因为作者之前已经安装过该包了,同样如果读者在退出安装向导后还想安装其他软件包,只需要重新运行setup.exe程序再次进入此界面即可。
为了方便使用,我们还可以安装wget(用于下载Redis源代码,也可以手动下载并使用Windows资源管理器将其复制到Cygwin对应的目录中,见下文介绍)和vim(用于修改Redis的源代码使之可以在Cygwin下正常编译)。
之后单击下一步,安装向导就会自动完成下载和安装工作了。
安装成功后打开CygwinTerminal程序即可进入Cygwin环境,Cygwin会将Windows中的目录映射到Cygwin中。
如果安装时没有更改安装目录,Cygwin环境中的根目录对应的Windows中的目录是C:
\cygwin。
2.修改Redis源代码
下载和解压Redis的过程和1)节中介绍的一样,不过在make之前还需要修改Redis的源
代码以使其可以在Cygwin下正常编译。
首先编辑src目录下的redis.h文件,在头部加入:
#ifndefSA_ONSTACK
#defineSA_ONSTACK0
#endif
而后编辑src目录下的object.c文件,在头部加入:
#definestrtold(a,b)((longdouble)strtod((a),(b)))
3.编译Redis
同1)节一样,执行make命令即可完成编译。
注意Cygwin环境无法完全模拟Linux系统,比如Cygwin的fork不支持写时复制;另
外,Redis官方也并不提供对Cygwin的支持,Cygwin环境只能用于学习Redis,运行Redis的最佳系统是Linux和OSX,官方推荐的生产系统是Linux。
2、启动和停止Redis
安装完Redis后的下一步就是启动它,本节将分别介绍在开发环境和生产环境中运行
Redis的方法以及正确停止Redis的步骤。
在这之前首先需要了解Redis包含的可执行文件都有哪些,下表中列出了这些程序的名
称以及对应的说明。
如果在编译后执行了makeinstall命令,这些程序会被复制到/usr/local/bin
目录内,所以在命令行中直接输入程序名称即可执行。
我们最常使用的两个程序是redis-server和redis-cli,其中redis-server是Redis的服务器,启
动Redis即运行redis-server;而redis-cli是Redis自带的Redis命令行客户端,是学习Redis的重要工具。
1)启动Redis
启动Redis有直接启动和通过初始化脚本启动两种方式,分别适用于开发环境和生产环
境。
1.直接启动
直接运行redis-server即可启动Redis,十分简单:
$redis-server
[5101]14Dec20:
58:
59.944#Warning:
noconfigfilespecified,usingthedefault
config.Inordertospecifyaconfigfileuseredis-server/path/to/redis.conf
[5101]14Dec20:
58:
59.948*Maxnumberofopenfilessetto10032
...
[5101]14Dec20:
58:
59.949#Serverstarted,Redisversion2.6.9
[5101]14Dec20:
58:
59.949*Theserverisnowreadytoacceptconnectionsonport6379
Redis服务器默认会使用6379端口①,通过--port参数可以自定义端口号:
注释:
①6379是手机键盘上MERZ对应的数字,MERZ是一名意大利歌女的名字。
$redis-server--port6380
2.通过初始化脚本启动Redis
在Linux系统中可以通过初始化脚本启动Redis,使得Redis能随系统自动运行,在生产环境中推荐使用此方法运行Redis,这里以Ubuntu和Debian发行版为例进行介绍。
在Redis源代码目录的utils文件夹中有一个名为redis_init_script的初始化脚本文件,内容如下:
#!
/bin/sh
##
SimpleRedisinit.dscriptconceivedtoworkonLinuxsystems
#asitdoesuseofthe/procfilesystem.
REDISPORT=6379
EXEC=/usr/local/bin/redis-server
CLIEXEC=/usr/local/bin/redis-cli
PIDFILE=/var/run/redis_{REDISPORT}.pid
CONF="/etc/redis/{REDISPORT}.conf"
case"1"in
start)
if[-fPIDFILE]
then
echo"PIDFILEexists,processisalreadyrunningorcrashed"
else
echo"StartingRedisserver..."
EXECCONF&
fi
;;
stop)
if[!
-fPIDFILE]
then
echo"PIDFILEdoesnotexist,processisnotrunning"
else
PID=(catPIDFILE)
echo"Stopping..."
CLIEXEC-pREDISPORTshutdown
while[-x/proc/{PID}]
do
echo"WaitingforRedistoshutdown..."
sleep1
done
echo"Redisstopped"
fi
;;
*)
echo"Pleaseusestartorstopasfirstargument"
;;
esac
我们需要配置Redis的运行方式和持久化文件、日志文件的存储位置等,具体步骤如下。
(1)配置初始化脚本。
首先将初始化脚本复制到/etc/init.d目录中,文件名为redis_端口号,
其中端口号表示要让Redis监听的端口号,客户端通过该端口连接Redis。
然后修改脚本第6行的REDISPORT变量的值为同样的端口号。
(2)建立需要的文件夹。
建立表中列出的目录。
(3)修改配置文件。
首先将配置文件模板复制到/etc/redis目录中,以端口号命名(如“6379.conf”),然后按照下表对其中的部分参数进行编辑。
下表需要修改的配置及说明
现在就可以使用/etc/init.d/redis_端口号start来启动Redis了,而后需要执行下面的命令使
Redis随系统自动启动:
Debian(Ubuntu)系统:
sudoupdate-rc.dredis_端口号defaults
Redhat(Centos,Oracle)系统
在初始化脚本文件(redis_init_script)是第2行添加如下内容,
#chkconfig:
23458090
然后执行,
chkconfig --add redis_端口号
2)停止Redis
考虑到Redis有可能正在将内存中的数据同步到硬盘中,强行终止Redis进程可能会导致
数据丢失。
正确停止Redis的方式应该是向Redis发送SHUTDOWN命令,方法为:
redis-cli>>SHUTDOWN
当Redis收到SHUTDOWN命令后,会先断开所有客户端连接,然后根据配置执行持久化,
最后完成退出。
Redis可以妥善处理SIGTERM信号,所以使用“killRedis进程的PID”也可以正常结束
Redis,效果与发送SHUTDOWN命令一样。
3、Redis集群
1)创建Redis实例
参见第二章,创建至少六个Redis实例,比如:
10.10.10.123:
6379
10.10.10.123:
7379
10.10.10.123:
6479
10.10.10.123:
7479
10.10.10.123:
6579
10.10.10.123:
7579
Redis配置参照下面的样例:
#GENERAL
daemonizeno
tcp-backlog511
timeout0
tcp-keepalive0
loglevelnotice
databases16
dir/opt/redis/data
slave-serve-stale-datayes
#slave只读
slave-read-onlyyes
#notusedefault
repl-disable-tcp-nodelayyes
slave-priority100
#打开aof持久化
appendonlyyes
#每秒一次aof写
appendfsynceverysec
#关闭在aofrewrite的时候对新的写操作进行fsync
no-appendfsync-on-rewriteyes
auto-aof-rewrite-min-size64mb
lua-time-limit5000
#打开redis集群
cluster-enabledyes
#节点互连超时的阀值
cluster-node-timeout15000
cluster-migration-barrier1
slowlog-log-slower-than10000
slowlog-max-len128
notify-keyspace-events""
hash-max-ziplist-entries512
hash-max-ziplist-value64
list-max-ziplist-entries512
list-max-ziplist-value64
set-max-intset-entries512
zset-max-ziplist-entries128
zset-max-ziplist-value64
activerehashingyes
client-output-buffer-limitnormal000
client-output-buffer-limitslave256mb64mb60
client-output-buffer-limitpubsub32mb8mb60
hz10
aof-rewrite-incremental-fsyncyes
2)配置集群和主从
在终端命令中键入:
redis-cli-h10.10.10.123-p6379,
然后在当前环境下键入:
CLUSTERMEET10.10.10.1237379,
以此类推,把六个redis实例加入集群中。
把10.10.10.123:
7379设置为10.10.10.123:
6379的从库,
在终端命令中键入:
redis-cli-h10.10.10.123-p7379,
然后在当前环境键入:
CLUSTERREPLICATE<6379的node_id>(可以通过CLUSTERNODES命令查看各个实例的node_id),
以此类推,把10.10.10.123:
7479设置为10.10.10.123:
6479的从库,把10.10.10.123:
7579设置为10.10.10.123:
6579的从库。
3)分配Slots(槽)
可以通过“CLUSTERADDSLOTS[slot...]将一个或多个槽(slot)指派(assign)给当前节点。
”命令给Redis实例分配Slots。
可以通过init_redis_slots.sh脚本批量分配Slots,脚本如下:
#!
/bin/bash
#AuthorWangWei
host=$1
port=$2
begin=$3
end=$4
if[!
${host}]
then
echo"pleaseinputhostip!
"
readhost
fi
if[!
${port}]
then
echo"pleaseinputhostport!
"
readport
fi
if[!
${begin}]
then
echo"pleaseinputredisslotsbeginposition!
"
readbegin
fi
if[!
${end}]
then
echo"pleaseinputredisslotsendposition!
"
readend
fi
slots=""
while[${begin}-le${end}]
do
if[${#slots}-gt0]
then
slots=${slots}''${begin}
else
slots=${begin}
fi
begin=`expr${begin}+1`
done
#executeredis-cli
echo`redis-cli-h${host}-p${port}CLUSTERADDSLOTS${slots}`
在终端依次键入:
./init_redis_slots.sh10.10.10.123637905000
./init_redis_slots.sh10.10.10.1236479500110000
./init_redis_slots.sh10.10.10.12365791000116383
可以通过CLUSTERNODES查看Slots的分配情况
注:
slots共有16384个,slots只能分配给主库
4、常用集群命令
CLUSTERINFO打印集群的信息
CLUSTERNODES列出集群当前已知的所有节点(node),以及这些节点的相关信息。
节点
CLUSTERMEET将ip和port所指定的节点添加到集群当中,让它成为集群的一份子。
CLUSTERFORGET从集群中移除node_id指定的节点。
CLUSTERREPLICATE将当前节点设置为node_id指定的节点的从节点。
CLUSTERSAVECONFIG将节点的配置文件保存到硬盘里面。
槽(slot)
CLUSTERADDSLOTS[slot...]将一个或多个槽(slot)指派(assign)给当前节点。
CLUSTERDELSLOTS[slot...]移除一个或多个槽对当前节点的指派。
CLUSTERFLUSHSLOTS移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
CLUSTERSETSLOTNODE将槽slot指派给node_id指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
CLUSTERSETSLOTMIGRATING将本节点的槽slot迁移到node_id指定的节点中。
CLUSTERSETSLOTIMPORTING从node_id指定的节点中导入槽slot到本节点。
CLUS