<p>一,软件准备</p><p>#redis</p><p>wget http://download.redis.io/releases/redis-3.0.7.tar.gz</p><p>#phpredis 非php7使用 下载后文件名为:phpredis-develop</p><p>wget https://codeload.github.com/phpredis/phpredis/zip/develop</p><p>#phpredis PHP7专属 下载后文件名为:phpredis-php7</p><p>wget https://codeload.github.com/phpredis/phpredis/zip/php7</p><p>安装phpredis前,务必已经安装好autoconf。</p><p>附:如果你有window(必须64位)安装redis服务需求,或者wamp仅仅需要redis扩展。可以到点链接下载redis64和php_redis.dll。</p><p></p><p>二,安装配置Redis</p><p>安装方法非常简单,make后,redis直接安装在当前目录:</p><p>tar xzf redis-3.0.7.tar.gz</p><p>cd redis-3.0.7</p><p>make</p><p></p><p>开启redis前台服务测试:</p><p>src/redis-server</p><p></p><p>显示这个小盒子,前台服务即为成功开启,占用端口6379:</p><p> _._ </p><p> _.-``__ ''-._ </p><p> _.-`` `. `_. ''-._ Redis 3.0.7 (00000000/0) 64 bit</p><p> .-`` .-```. ```\/ _.,_ ''-._ </p><p>( ' , .-` | `, ) Running in standalone mode</p><p>|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379</p><p>| `-._ `._ / _.-' | PID: 23909</p><p> `-._ `-._ `-./ _.-' _.-' </p><p>|`-._`-._ `-.__.-' _.-'_.-'| </p><p>| `-._`-._ _.-'_.-' | http://redis.io </p><p> `-._ `-._`-.__.-'_.-' _.-' </p><p>|`-._`-._ `-.__.-' _.-'_.-'| </p><p>| `-._`-._ _.-'_.-' | </p><p> `-._ `-._`-.__.-'_.-' _.-' </p><p> `-._ `-.__.-' _.-' </p><p> `-._ _.-' </p><p> `-.__.-' </p><p></p><p>按Ctrl+C退出redis前台服务。</p><p></p><p>配置redis使用环境:</p><p>现在,我们新建目录 /usr/local/redis ,把./redis.conf,src/redis-server,src/redis-cli 三个文件复制到该目录下</p><p>mkdir /usr/local/redis</p><p>cp redis.conf src/redis-server src/redis-cli /usr/local/redis/</p><p>cd /usr/local/redis</p><p></p><p>这三个文件:</p><p>redis.conf redis配置文件</p><p>redis-server redis服务端</p><p>redis-cli redis客户端</p><p>vi redis.conf修改配置,使redis服务在后台运行:</p><p>#redis.conf#</p><p>daemonize yes</p><p>保存退出,./redis-server redis.conf 开启redis后台服务。</p><p></p><p>开启密码登入:</p><p>vi redis.conf修改配置</p><p>masterauth redis_password</p><p></p><p>重启redis-server后登入redis-cli客户端,输入auth redis_password 方可登入管理。</p><p></p><p>如果你修改redis.conf中的任何配置,需要关闭redis-server进程后,再./redis-server redis.conf 重新开启redis后台服务。</p><p></p><p>./redis-cli 开启redis客户端,你可以在其中输入任意redis命令。*注意,如果你在redis.conf配置文件中设置了requirepass 密码,那么登录客户端后,输入auth 密码 才可以继续操作。</p><p>#redis-cli接收参数,不填写参数默认连接127.0.0.1:6379</p><p>./redis-cli -h <host> -p <port></p><p></p><p>Redis数据库</p><p>存入redis数据前必须选择数据库,redis数据库默认16个,下标0~15,默认使用第0个,存放数据前可以使用select N选择数据库。</p><p>Redis数据库在redis.conf中配置如下:</p><p>#redis.conf#</p><p>databases 16</p><p></p><p>你可以根据实际需要更改数据库个数,但一般不建议修改。</p><p></p><p>*持久化功能</p><p>redis(nosql产品)为了内部数据的安全考虑,会把本身的数据以文件形式保存到硬盘中一份,在服务器重启之后会自动把硬盘的数据恢复到内存(redis)的里边。</p><p>数据保存到硬盘的过程就称为"持久化"效果。</p><p>Redis快照持久化(snap shotting或称RDB持久化)配置:</p><p>该持久化默认开启,一次性把redis中全部的数据保存一份存储在硬盘中,如果数据非常多(10-20G)就不适合频繁进行该持久化操作。快照持久化会根据配置条件定期生成二进制备份文件,默认文件名dump.rdb。</p><p>redis.conf 中关于快照的配置:</p><p>#快照写入文件名</p><p>dbfilename dump.rdb</p><p>#快照保存目录</p><p>dir ./</p><p>#快照写入频率</p><p>save 900 1 #900 秒内如果超过 1 个 key 被修改,则发起快照保存</p><p>save 300 10 #300秒超过10个key被修改,发起快照</p><p>save 60 10000 #60秒超过10000个key被修改,发起快照</p><p>#以上三个备份频率需要同时存在:</p><p>#数据变化非常快的时候,就快点做备份(保证数据安全)</p><p>#数据变化慢的时候,就慢点做备份(节省服务器资源)</p><p></p><p>手动发起快照持久化:</p><p>快照持久化默认开启,并定时执行,你也可以通过redis-cli客户端使用bgsave命令手动发起。</p><p>./redis-cli bgsave</p><p></p><p></p><p>Redis AOF(append only file)持久化配置:</p><p>本质:把用户执行的每个"写"指令(添加、修改、删除)都备份到文件中,还原数据的时候就是执行具体写指令而已。</p><p>AOF默认关闭,默认保存文件名append.aof,默认每秒执行一次,具体参数如下</p><p>#开启/关闭AOF</p><p>appendonly yes</p><p>#保存文件名</p><p>appendfilename "appendonly.aof"</p><p>#AOF保存频率</p><p># appendfsync always #每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用</p><p>appendfsync everysec #每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐</p><p># appendfsync no #完全依赖 os,性能最好,持久化没保证</p><p>#上面三种选项数据安全性及服务性能情况</p><p>#数据最安全 服务器性能低 </p><p>#数据较安全 服务器性能中等</p><p>#数据不安全 服务器性能高(优良)</p><p></p><p>AOF策略设置为always或者everysec时,后台处理进程(后台保存或者AOF日志重写)会执行大量的I/O操作,在某些Linux配置中会阻止过长的fsync()请求。注意现在没有任何修复,即使fsync在另外一个线程进行处理。</p><p>为了减缓这个问题,可以设置下面这个参数no-appendfsync-on-rewrite:</p><p>#redis.conf#</p><p>no-appendfsync-on-rewrite yes</p><p></p><p>为AOF备份文件做优化压缩处理:</p><p>AOF记录用户的每个操作,但是有些操作例如对某个key的多个同类型操作是可以合并为一个,从而做到压缩文件大小的效果。例如多次incr一个整型key,可以直接合并为set key N。</p><p>压缩优化(AOF重写)命令:</p><p>./redis-cli bgrewriteaof</p><p>AOF自动重写:</p><p>当AOF文件增长到一定大小的时候Redis能够调用 BGREWRITEAOF 对日志文件进行重写,它是这样工作的:Redis会记住上次进行些日志后文件的大小(如果从开机以来还没进行过重写,那日子大小在开机的时候确定)基础大小会同现在的大小进行比较。如果现在的大小比基础大小大制定的百分比,重写功能将启动,同时需要指定一个最小大小用于AOF重写,这个用于阻止即使文件很小但是增长幅度很大也去重写AOF文件的情况,设置 percentage 为0就关闭这个重写特性。</p><p>#redis.conf#</p><p>auto-aof-rewrite-percentage 100</p><p>auto-aof-rewrite-min-size 64mb</p><p></p><p></p><p>手动持久化相关指令:</p><p>save (客户端命令行内)前台备份数据(快照保存)</p><p>bgsave 异步保存数据到磁盘(快照保存)</p><p>lastsave 返回上次成功保存到磁盘的unix时间戳</p><p>shutdown 同步保存到服务器并关闭redis服务器</p><p>bgrewriteaof 当日志文件过长时优化AOF日志文件存储</p><p>redis 127.0.0.1:6379> SAVE #前台备份数据</p><p>./redis-cli bgrewriteaof</p><p>./redis-cli bgsave</p><p>./redis-cli -h 127.0.0.1 -p 6379 bgsave #手动发起快照</p><p></p><p>数据恢复</p><p>如果需要恢复数据,只需将备份文件 (dump.rdb) 移动到 redis 快照保存目录 并启动服务即可。要查看快照保存目录,可以查看redis.conf的dir配置。</p><p></p><p></p><p>*Redis主从模式</p><p>为了降低每个redis服务器的负载,可以多设置几个,并做主从模式,一个服务器负载"写"(添加、修改、删除)数据,其他服务器负载"读"数据,主服务器数据会"自动"同步给从服务器</p><p><img src="/up_pic/201812/080938325893.png" title="080938325893.png" alt="1.png"/></p><p></p><p>Redis主从复制特点</p><p>1.master可以有多个slave</p><p>2.除了多个slave连接到master外,slave也可以连接到其他slave,形成网状结构</p><p>3.可以让slave做读请求,master做写操作 </p><p> </p><p>配置主服务器:</p><p>(假定局域网IP为192.168.1.101)</p><p>#redis.conf#</p><p>#配置主服务器密码</p><p>requirepass admin123</p><p>#自定义端口</p><p>port 6379</p><p>配置从服务器:</p><p>#redis.conf#</p><p>#主服务器连接密码</p><p>masterauth admin123</p><p>#自定义端口</p><p>port 6379</p><p>#设置成为192.168.1.101的从服务器</p><p>slaveof 192.168.1.101 6379</p><p>#取消从服务器只读</p><p>slave-read-only no</p><p>开启访问端口(主从都需要开启):</p><p>#开放6379端口</p><p>firewall-cmd --zone=public --add-port=6379/tcp --permanent</p><p>#重启防火墙</p><p>firewall-cmd --reload</p><p></p><p>重新开启redis-server 服务,则从服务器设置成功。</p><p></p><p>关于redis.conf 配置文件中bind和protected-mode的配置问题:</p><p>网上很多资料关于bind配置的描述都是'指定redis只接收来自于该IP地址的请求,如果不进行设置,那么将处理所有请求,在生产环境中最好设置该项',其实是一个错误的翻译说法。如果按照这个说法去配置,百分百是connection refuse。</p><p>*这里bind指的是interface,网络接口,也就是服务器上的网卡,一个服务器可以有一或多个网卡,设置这个bind是让这台服务器某一或多个网卡来接收请求,如果让本机所有网卡都接收请求,则bind可以直接注释掉。</p><p>*Redis protected-mode 是3.2 之后加入的新特性, 是为了禁止公网访问redis cache,加强redis安全的。它启用的条件,有两个:</p><p>1) 没有bind IP</p><p>2) 没有设置访问密码</p><p>如果启用了,则只能够通过lookback(回路) ip(127.0.0.1)访问Redis cache,如果从外网访问,则会返回错误信息。</p><p>因此如果没有设置bind,则protected-mode设置为no,且开放6379访问端口。</p><p></p><p></p><p></p><p></p><p>Redis推荐部署方式:</p><p><img src="/up_pic/201812/080938476562.png" title="080938476562.png" alt="2.png"/></p><p></p><p></p><p>在一台服务器上部署多个Redis服务节点(启动多端口,运行多实例)方式:</p><p>假设你只有一台电脑,但又想实现redis的主从部署,你考虑使用诸如6380,6381...等端口创建从节点,那么问题来了,改怎么设置呢?</p><p>如果要在一台服务器上运行多个redis实例,必须满足以下3点:</p><p>使用不同的端口</p><p>分别配置每个实例(服务)的pid和log文件</p><p>RDB和AOF持久化到每个实例(服务)的rdb和aof文件中</p><p>每个实例必须对应一个配置文件,配置文件按照上面3点设置:</p><p>cp redis.conf redis_6380.conf</p><p>vi redis_6380.conf</p><p>port 6380 #设置端口</p><p>pidfile /var/run/redis/redis_6380.pid #设置pid文件</p><p>logfile /var/log/redis/redis_6380.log #设置log文件</p><p>dbfilename dump_6380.rdb #设置RDB持久化文件</p><p>appendfilename "appendonly_6380.aof" #设置aof持久化文件</p><p></p><p>其他配置文件按此修改,至于从节点配置,回上面看。</p><p>启动多个redis实例:</p><p>./redis-server redis_6380.conf</p><p>./redis-server redis_6381.conf</p><p></p><p>配置好从节点后,./redis-cli 开启客户端,auth 密码 登入,再输入info命令,可以查看redis主节点状态,其中该主节点的从节点信息如下:</p><p># Replication</p><p>role:master</p><p>connected_slaves:2</p><p>slave0:ip=127.0.0.1,port=6380,state=online,offset=1037,lag=1</p><p>slave1:ip=127.0.0.1,port=6381,state=online,offset=1037,lag=0</p><p>master_repl_offset:1037</p><p>repl_backlog_active:1</p><p>repl_backlog_size:1048576</p><p>repl_backlog_first_byte_offset:2</p><p>repl_backlog_histlen:1036</p><p></p><p></p><p></p><p>*Redis哨兵模式</p><p>Sentinel哨兵模式是在主从模式架构上,增加对redis服务的监控,如果主服务器宕机,可以将从服务器切换为主服务,提高了redis服务的可用性。</p><p>哨兵的作用:</p><p>1、监控redis进行状态,包括master和slave</p><p>2、当master 宕机机,能自动将slave切换成master</p><p><img src="/up_pic/201812/080938594033.jpg" title="080938594033.jpg" alt="3.jpg"/></p><p>单个哨兵(图片来源:http://blog.csdn.net/yingxiake/article/details/51671335)</p><p><img src="/up_pic/201812/080939104125.jpg" title="080939104125.jpg" alt="4.jpg"/></p><p>多个哨兵(图片来源:http://blog.csdn.net/yingxiake/article/details/51671335)</p><p></p><p>具体配置:(主192.168.1.109,从192.168.1.111)</p><p>1,复制redis安装包中的sentinel.conf和src/redis-sentinel文件到/usr/local/redis/下。</p><p>2,配置sentinel.conf,这里每台redis服务器都设置一个哨兵,主从哨兵都使用同样的配置</p><p>####下面2个配置要与redis.conf的配置同步,否则会出错##</p><p>#bind x.x.x.x</p><p>#protected-mode yes|no</p><p>#开启后台运行,如果开启运行,将看不到sentinel前台运行时状态实时信息</p><p>daemonize yes</p><p>#配置主服务sentinel monitor 主服务名(自定义) 服务ip 服务端口 当有n个哨兵认为主服务宕机,才能启动切换主从服务。因为我只有2台服务器,因此此处设置为1</p><p>sentinel monitor mymaster 192.168.1.109 6379 1</p><p>#主服务密码</p><p>sentinel auth-pass mymaster redis_password</p><p>#间隔多少毫秒检查主服务器宕机,这里写5秒</p><p>sentinel down-after-milliseconds mymaster 5000</p><p>#失效超时</p><p>#sentinel failover-timeout mymaster 90000</p><p></p><p>3,哨兵默认占用26379端口,需开放:</p><p>#开放26379端口</p><p>firewall-cmd --zone=public --add-port=26379/tcp --permanent</p><p>#重启防火墙</p><p>firewall-cmd --reload</p><p></p><p>4,在已开启主从服务器情况下,启用哨兵服务:</p><p>./redis-sentinel sentinel.conf --sentinel</p><p></p><p></p><p>在前台模式运行下,会显示如下:</p><p>./redis-sentinel sentinel.conf --sentinel</p><p>16123:X 24 Jun 10:53:35.288 * Increased maximum number of open files to 10032 (it was originally set to 1024).</p><p> _._ </p><p> _.-``__ ''-._ </p><p> _.-`` `. `_. ''-._ Redis 3.2.9 (00000000/0) 64 bit</p><p> .-`` .-```. ```\/ _.,_ ''-._ </p><p>( ' , .-` | `, ) Running in sentinel mode</p><p>|`-._`-...-` __...-.``-._|'` _.-'| Port: 26379</p><p>| `-._ `._ / _.-' | PID: 16123</p><p> `-._ `-._ `-./ _.-' _.-' </p><p>|`-._`-._ `-.__.-' _.-'_.-'| </p><p>| `-._`-._ _.-'_.-' | http://redis.io </p><p> `-._ `-._`-.__.-'_.-' _.-' </p><p>|`-._`-._ `-.__.-' _.-'_.-'| </p><p>| `-._`-._ _.-'_.-' | </p><p> `-._ `-._`-.__.-'_.-' _.-' </p><p> `-._ `-.__.-' _.-' </p><p> `-._ _.-' </p><p> `-.__.-' </p><p>16123:X 24 Jun 10:53:35.292 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.</p><p>16123:X 24 Jun 10:53:35.292 # Sentinel ID is 594f00cb60e77a52a47d9b3c520dd3f28c0b3d25</p><p>16123:X 24 Jun 10:53:35.292 # +monitor master mymaster 192.168.1.109 6379 quorum 1</p><p>16123:X 24 Jun 10:55:36.542 # +sdown sentinel ec86fc3abde024f5297131822d415abd09543c46 192.168.1.109 26379 @ mymaster 192.168.1.109 6379</p><p>16123:X 24 Jun 10:55:45.171 # -sdown sentinel ec86fc3abde024f5297131822d415abd09543c46 192.168.1.109 26379</p><p></p><p></p><p>kill掉主服务器,显示如下信息</p><p>16123:X 24 Jun 10:56:15.641 # +failover-state-reconf-slaves master mymaster 192.168.1.109 6379</p><p>16123:X 24 Jun 10:56:15.702 # +failover-end master mymaster 192.168.1.109 6379</p><p>16123:X 24 Jun 10:56:15.703 # +switch-master mymaster 192.168.1.109 6379 192.168.1.111 6379</p><p>16123:X 24 Jun 10:56:15.703 * +slave slave 192.168.1.109:6379 192.168.1.109 6379 @ mymaster 192.168.1.111 6379</p><p></p><p>说明主服务已经切换到从服务。</p><p></p><p></p><p></p><p>*关于Redis详细配置信息,可以参考以下博客:</p><p>1Redis配置文件详解 2Redis配置文件详解</p><p></p><p>三,安装PHP扩展</p><p>方式1. 生成redis.so:</p><p>unzip phpredis-Version</p><p>cd phpredis-Version</p><p>/usr/local/php/bin/phpize</p><p>./configure --with-php-config=/usr/local/php/bin/php-config</p><p>make && make install</p><p>将extension=redis.so加入到php.ini</p><p>重启服务器,查看phpinfo();</p><p>如果是使用php-fpm,则需要重启php-fpm:</p><p>ps aux|grep php-fpm #查看fpm进程号</p><p>kill -USR2 fpm进程号 #平滑重启php-fpm</p><p></p><p>方式2.Yum安装:</p><p>首先查看php版本信息 php -v</p><p>显示如:</p><p>PHP 7.0.32 (cli) (built: Sep 15 2018 07:54:46) ( NTS )</p><p>Copyright (c) 1997-2017 The PHP Group</p><p>Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies</p><p></p><p>则可以通过:</p><p>yum list | grep php70w*</p><p></p><p>来搜索php-redis扩展列表。</p><p>选择并安装:</p><p>yum -y install php70w-pecl-redis.x86_64</p><p></p><p>流程自动走完即可。</p><p></p><p>phpinfo():</p><p><img src="/up_pic/201812/080939269836.png" title="080939269836.png" alt="5.png"/></p><p>显示即OK。</p><p></p><p></p><p>四,测试使用</p><p>新建test_redis.php</p><p>1 <?php</p><p>2</p><p>3 //连接本地Redis服务</p><p>4 $redis=new Redis();</p><p>5 $redis->connect('localhost','6379'); //$redis->auth('admin123');//如果设置了密码,添加此行</p><p>6 //查看服务是否运行</p><p>7 $redis->ping();</p><p>8</p><p>9 //选择数据库</p><p>10 $redis->select(5);</p><p>11</p><p>12 //设置数据</p><p>13 $redis->set('school','WuRuan');</p><p>14 //设置多个数据</p><p>15 $redis->mset(array('name'=>'jack','age'=>24,'height'=>'1.78'));</p><p>16</p><p>17 //存储数据到列表中</p><p>18 $redis->lpush("tutorial-list", "Redis");</p><p>19 $redis->lpush("tutorial-list", "Mongodb");</p><p>20 $redis->lpush("tutorial-list", "Mysql");</p><p>21</p><p>22 //获取存储数据并输出</p><p>23 echo $redis->get('school');</p><p>24</p><p>25 echo '<br/>';</p><p>26</p><p>27 $gets=$redis->mget(array('name','age','height'));</p><p>28 print_r($gets);</p><p>29</p><p>30 $tl=$redis->lrange("tutorial-list", 0 ,5);</p><p>31 print_r($tl);</p><p>显示:</p><p></p><p>*语法参考文档,phpredis中文手册</p><p></p><p>五(附),Redis性能测试及常用命令</p><p>Redis性能测试</p><p>Redis还自带一个redis-benchmark性能测试工具,我们将其复制到/usr/local/redis目录下</p><p>cp /usr/local/src/redis-3.0.7/src/redis-benchmark /usr/local/redis/</p><p></p><p>redis-benchmark操作命令如下:</p><p>redis-benchmark [option] [option value]</p><p></p><p>redis 性能测试工具可选参数如下所示:</p><p>实例</p><p>1,我们同时执行10000个请求来检测redis性能:</p><p>./redis-benchmark -n 10000</p><p>====== PING_INLINE ======</p><p> 10000 requests completed in 0.31 seconds</p><p> 50 parallel clients</p><p> 3 bytes payload</p><p> keep alive: 1</p><p>74.11% <= 1 milliseconds</p><p>95.93% <= 2 milliseconds</p><p>98.82% <= 3 milliseconds</p><p>99.30% <= 6 milliseconds</p><p>99.33% <= 7 milliseconds</p><p>99.40% <= 9 milliseconds</p><p>99.45% <= 10 milliseconds</p><p>99.51% <= 13 milliseconds</p><p>99.60% <= 14 milliseconds</p><p>99.64% <= 18 milliseconds</p><p>99.82% <= 29 milliseconds</p><p>100.00% <= 29 milliseconds</p><p>31746.03 requests per secon</p><p>....更多显示参数不列举</p><p></p><p>2,使用了多个参数来测试 redis 性能:</p><p>#以下实例中主机为 127.0.0.1,端口号为 6379,执行的命令为 set,lpush,请求数为 10000,通过 -q 参数让结果只显示每秒执行的请求数。</p><p>./redis-benchmark -h 127.0.0.1 -p 6379 -t set,lpush -n 10000 -q</p><p>SET: 38314.18 requests per second</p><p>LPUSH: 36363.64 requests per second</p><p></p><p></p><p>Redis常用命令</p><p><img src="/up_pic/201812/080939414191.png" title="080939414191.png"/></p><p><img src="/up_pic/201812/080939417463.png" title="080939417463.png"/></p><p><img src="/up_pic/201812/080939413847.png" title="080939413847.png"/></p><p><img src="/up_pic/201812/080939414730.png" title="080939414730.png"/></p><p><img src="/up_pic/201812/080939412854.png" title="080939412854.png"/></p><p><img src="/up_pic/201812/080939411406.png" title="080939411406.png"/></p>