Home » Code » redis基本的安装使用

redis基本的安装使用

首先,下载服务端程序,到官网redis.io会在首页显著位置显示当前最新的稳定版本,获得下载地址下载即可。接着进行解压,进入解压后的文件夹,执行make install即完成,非常简单。

cd redis-3.2.0
make PREFIX=/usr/local/redis install #安装到指定目录中

进入安装目录,可以看到只有一个bin文件夹,进入bin文件夹,有以下文件:

redis-bin

回到上一层,把源码目录下的redis.conf复制到此。执行./bin/redis-server redis.conf即使用该配置文件启动了redis的服务端程序。这样启动不是守护进程,会占用终端,修改一下配置文件中的daemonize no改为yes即可。

要连接redis进行命令操作,运行./bin/redis-cli,回车即可。

redis-keys

默认redis有16个数据库且选中0号数据库,操作都是在0号数据库来进行操作的。要切换数据库使用select命令,如select 1切换到1号数据库,这时客户端连接中会多了个[1](:6379[1])。

ttl命令可以查询一个key的有效时间,对于没有设置生命周期的key,返回-1,不存在的key,返回-2,否则返回剩余生存时间。更多命令可以到http://redisdoc.com/查看(或者这里查看:http://www.redis.net.cn/order/)。

以上只是安装了服务器端程序,要使用PHP进行操作还得安装redis的PHP扩展,用得最多的官方推荐的这个(点击查看)。下载解压后,常规步骤添加扩展即可。

cd php-redis-2.2.7
phpize
./configure --with-php-config=/usr/local/bin/php-config
make && make install

将扩展添加到php.ini,重启httpd服务即可使用。

rdb快照持久化

redis支持数据持久化,也就是保存到硬盘当中。其中一个保存方式是将快照保存到硬盘中,称为rdb。什么时候进行一次保存,依据配置文件中的设置进行。

save 900 1
save 300 10
save 60 10000

以上三行决定了什么时候进行一个dump到硬盘的保存工作。由下往上看,如果60秒内进行了10000次操作,进行一次保存。如果达不到这个频率,300秒内进行了10次操作,也进行一次保存。如果还达不到,900秒内进行了一次一操作,就进行一次保存。除了保存时机可以配置,以下项目可以。

stop-write-on-bgsave-error yes #保存出错是否停止保存
rdbcompression yes #保存是否压缩
rdbchecksum yes #检查数据是否完整,如启动时候从硬盘导入内存
dbfilename dump.rdb #导出文件的名称
dir ./ #导出文件的目录

可以简单测试如下:将保存触发时间调小,运行bin/redis-benchmark,默认会执行10000个命令操作,触发dump保存。接着设置一个新值如set addr beijing,然后pkill -9 redis关掉,再重启redis,重新连接。这时,运行benchmark之前设置的值还能获取到,addr这个之后设置的值没为nil取不到了,原因是没有保存到硬盘。

AOF日志持久化

相对于rdb每60秒保存一次快照,间隔还是太长,60秒内的数据有可能就是海量的了。如果把间隔缩小呢,保存快照是全部的都保存,效率不够高。因此在1.1版本之后又增加了AOF(Append-only File)通过将命令日志记录到文件的方式来保存数据。对于AOF的相关配置有以下:

appendonly yes #是否打开aof日志功能

appendfilename "appendonly.aof" #aof日志名称

#appendfsync always #每个命令操作都写到aof日志中,慢,最安全
appendfsync everysec #每秒写一次,妥协折中方案。默认采用这个方案
#appendfsync no #写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到aof,同步统率低,速度快

no-appendfsync-on-rewrite no #正在导出rdb快照的过程中,要不要停止同步aof。默认no

来具体看一下aof是如何工作的,在配置文件中打开aof后重启,就会生成一个appendonly.aof日志文件,内容为空。我们来执行几个命令:

aof-1

这时候打开appendonly.aof内容是这样的:

[root@iZ28d5z8z40Z rdb]# more appendonly.aof 
*2
$6
SELECT
$1
0
*3
$3
set
$4
site
$13
xiaomlove.com
*3
$3
set
$4
name
$8
xiaoming
*3
$3
set
$4
name
$8
xiaodong
*3
$6
rename
$4
name
$5
name1
*3
$3
set
$3
age
$1
1
*2
$4
incr
$3
age
*2
$4
incr
$3
age

可以看到,每个命令都记录了下来,对同一个key执行的多次操作都一一记录在案。但实际上每一个key最终只有一个值,记录这么多会导致日志文件过大,恢复时间过长,其实只记录最终值就可以了,redis的aof-rewrite功能就是做这个事的,对aof日志进行重写,只记录同一个key的最终值,配置选项如下:

auto-aof-rewrite-percentage 100 #aof文件大小比上次重写时大小增加了100%时进行重写
auto-aof-rewrite-min-size 64M #aof文件大小增长至少超过64M时进行重写

具体来看一下aof重写的效果,使用redis-benchmark来执行10000个命令,appendonly.aof大小才5.6M,达不到默认的62M进行一次重写的下限,可以在redis-cli连接终端来执行bgwriteaof命令来手动重写,结果变成93K,大大缩小了aof日志体积。

redis-bgrewriteaof

下面是对于rdb和aof两种持久化方式的一些常见问题。

问:在配置文件中设置dump rdb时停止aof,最终aof是不是不完整?
答:不会不完整,所有操作会缓存在内存队列里,dump rdb完成后会统一恢复aof记录。

问:rdb和aof文件同时存在,优先使用谁来恢复数据?
答:aof。

问:恢复时rdb和aof哪个速度快?
答:rdb快。因内其是数据的内存映射,直接截入到内存中,而aof是命令,需要逐条执行。

更多不同点可以参考这里

redis主从复制

redis的主从复制配置起来比较简单。首先在主服务器的配置中把自己的IP给bind上,默认是bind 127.0.0.1,约摸在配置文件的61行,如果注释掉这句,启动都起不来,报错Creating Server TCP listening socket *:6379: unable to bind socket。把机器的IP写上,这样从服务器才能连接上。

bind 127.0.0.1 115.xxx...xxx

然后就是在从服务器上配置的事了,关键的一个配置是“slaveof 主服务器地址 端口”,一般从服务器都是只读。我测试在主服务器启动一个主和一个从,在另外一处地方的机器再启动一个从。配置如下:

115.xxx...xxx:6379(master)
rdb yes
aof yes
readonly no

115.xxx...xxx:6380(slave)
rdb no
aof no
readonly yes
slaveof localhost 6379

120.xxx...xxx:6379(slave)
rdb yes
aof no
readonly yes
slaveof 115.xxx...xxx 6379

首先是启动主服务器115.xxx….xxx:6379,然后再启动两台从服务器115.xxx…xxx:6380和120.xxx…xxx:6379。各种日志如下:

115.xxx…xxx:6379(master):

master-synchronization

115.xxx…xxx:6380(slave):

slave-sync1

120.xxx…xxx:6379(slave):

slave-sync2

设置成功后,在主服务器写入数据就会即时同步到从服务器,在主服务器进行写操作,在从服务器来进读操作,读写分离也就简单的实现了。基本的同步原理是:从服务器启动向主服务器发起同步请求,主服务器会马上进行一次rdb快照保存同时进行aof记录,将rdb快照传递给从服务器后再将aof记录也同步过去,达到时同步后会保留一个进程专门维护二者的同步。因此,在启动多台从服务器时,不要同时启动,否则容易引起主服务器压力剧增。

Leave a Reply

Your email address will not be published. Required fields are marked *

*

Time limit is exhausted. Please reload CAPTCHA.