php 连接主从redis,Redis主从复制实现session共享

Redis采用的是基于内存的采用的是单进程单线程模型的KV数据库,由C语言编写。官方提供的数据是可以达到100000+的qps。这个数据不比采用单进程多线程的同样基于内存的KV数据库Memcached差。

Redis快的主要原因是:完全基于内存

数据结构简单,对数据操作也简单

使用多路 I/O 复用模型

第一、二点不细讲,主要围绕第三点采用多路 I/O 复用技术来展开。

多路 I/O 复用模型是利用select、poll、epoll可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有I/O事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗),且Redis在内存中操作数据的速度非常快(内存内的操作不会成为这里的性能瓶颈),主要以上两点造就了Redis具有很高的吞吐量。

3587411016.png

和Memcached不同,Redis并没有直接使用Libevent,而是自己完成了一个非常轻量级的对select、epoll、evport、kqueue这些通用的接口的实现。在不同的系统调用选用适合的接口,linux下默认是epoll。因为Libevent比较重更通用代码量也就很庞大,拥有很多Redis用不上的功能,Redis为了追求“轻巧”并且去除依赖,就选择自己去封装了一套。

单进程单线程好处代码更清晰,处理逻辑更简单

不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗

不存在多进程或者多线程导致的切换而消耗CPU

单进程单线程弊端无法发挥多核CPU性能,不过可以通过在单机开多个Redis实例来完善;

一、Redis安装

1. 下载安装扩展源及源码包yum install -y epel-release jemalloc-devel

wget https://codeload.github.com/antirez/redis/tar.gz/2.8.21

tar -zxvf 2.8.21

make;make PREFIX=/usr/local/redis install

mkdir -p /usr/local/redis/etc

9563644cb550fa36527f9ac22af4891a.png

解决办法:

cd deps/

make hiredis lua jemalloc

2. 编辑redis配置文件vim /usr/local/redis/etc/redis.conf

内容:daemonize yes

pidfile /usr/local/redis/var/redis.pid

port 6379

timeout 300

loglevel debug

logfile /usr/local/redis/var/redis.log

databases 16

save 900 1

save 300 10

save 60 10000

rdbcompression yes

dbfilename dump.rdb

dir /usr/local/redis/var/

appendonly no

appendfsync always

#下面是redis.conf的主要配置参数的意义:

#daemonize:是否以后台daemon方式运行

#pidfile:pid文件位置

#port:监听的端口号

#timeout:请求超时时间

#loglevel:log信息级别

#logfile:log文件位置

#databases:开启数据库的数量

#save * *:保存快照的频率,第一个*表示多长时间,第三个*表示执行多少次写操作。在一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件。

#rdbcompression:是否使用压缩

#dbfilename:数据快照文件名(只是文件名,不包括目录)

#dir:数据快照的保存目录(这个是目录)

#appendonly:是否开启appendonlylog,开启的话每次写操作会记一条log,这会提高数据抗风险能力,但影响效率。

#appendfsync:appendonlylog如何同步到磁盘(三个选项,分别是每次写都强制调用fsync、每秒启用一次fsync、不调用fsync等待系统自己同步)

3. 编辑redis启动脚本vim /etc/init.d/redis

内容:#!/bin/sh

#

# redis        init file for starting up the redis daemon

#

# chkconfig:   - 20 80

# description: Starts and stops the redis daemon.

# Source function library.

. /etc/rc.d/init.d/functions

name="redis-server"

basedir="/usr/local/redis"

exec="$basedir/bin/$name"

pidfile="$basedir/var/redis.pid"

REDIS_CONFIG="$basedir/etc/redis.conf"

[ -e /etc/sysconfig/redis ] && . /etc/sysconfig/redis

lockfile=/var/lock/subsys/redis

start() {

[ -f $REDIS_CONFIG ] || exit 6

[ -x $exec ] || exit 5

echo -n $"Starting $name: "

daemon --user ${REDIS_USER-redis} "$exec $REDIS_CONFIG"

retval=$?

echo

[ $retval -eq 0 ] && touch $lockfile

return $retval

}

stop() {

echo -n $"Stopping $name: "

killproc -p $pidfile $name

retval=$?

echo

[ $retval -eq 0 ] && rm -f $lockfile

return $retval

}

restart() {

stop

start

}

reload() {

false

}

rh_status() {

status -p $pidfile $name

}

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)

$1

;;

reload)

rh_status_q || exit 7

$1

;;

force-reload)

force_reload

;;

status)

rh_status

;;

condrestart|try-restart)

rh_status_q || exit 0

restart

;;

*)

echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart}"

exit 2

esac

exit $?

4. 创建用户,目录,修改权限,设置开机自启useradd -s /sbin/nologin redis

mkdir /usr/local/redis/var

chmod 777 /usr/local/redis/var

chmod 755 /etc/init.d/redis

chkconfig --add redis

chkconfig redis on

service redis start

8ab219cebd9e5a680ec94ed0755cabdf.png

二、Redis安装配置主从

说明:和mysql很相似(也可以一主多从)

1. 主从配置

1)环境

master  172.16.111.195

slave 172.16.115.100

2)主从上分别安装redis,编辑启动脚本和配置文件(如上)

master 配置文件不修改

slave 配置文件上加 :slaveof  1172.16.111.195 6379

masterauth  password  #如果主上设置了密码,要加这行

主配置文件上,设置了密码:

ad318c62b1dc67304e5058273c3db16c.png

spacer.gif

所以从上也要设置密码:

spacer.gif 5cf635668ae1ef625087cb0cf3c3d80f.png

3)重启看日志显示已经同步(关闭防火墙)

4b1a9e52f7d875a33d14357be3369fb4.png

spacer.gif

2. 测试redis主从

master上:

2a5e8ba7874878ba83770c09d073e109.png

spacer.gif

slave上:

spacer.gif 479381eb992237797cc156ff236e2547.png

三、php使用Redis存储

大部分情况,redis是和开发软件一起使用的,而不是单独使用命令行来操作

1. 下载安装redis扩展模块phpredis-developwget https://codeload.github.com/phpredis/phpredis/zip/develop

unzip develop

./configure --with-php-config=/usr/local/php/bin/php-config

make;make install

e183d62fe0d3cba39e8dcca48f0f7757.png

2. 编辑php的配置文件vim /usr/local/php/etc/php.ini,加载扩展模块

c6fa5ec987cd191800c4073eeab96184.png

4077d3846d256ecf4d626ad854ee5fcc.png

3. Redis实现session共享三种方式

A)/usr/local/php/etc/php.ini文件中添加

session.save_handler = "redis"

session.save_path = "tcp://127.0.0.1:6379"

B)httpd.conf(apahce)虚拟主机配置文件添加

php_value session.save_hander "redis"

php_value session.save_path "tcp://127.0.0.1:11211"

C)php-fpm.conf(nginx)对应的pool中添加

php_value[session.save_handler]=redis

php_value[session.save_path]="tcp:127.0.0.1:6379"

1) 采用A方式,编辑php的配置文件vim /usr/local/php/etc/php.ini

3a40a8adf441678ab39b173fd6192f6a.png

2) 编辑脚本:vim /data/www/session.php

内容:<?php

session_start();

if (!isset($_SESSION[ 'TEST' ])) {

$_SESSION[ 'TEST' ] = time();

}

$_SESSION[ 'TEST3' ] = time();

print $_SESSION[ 'TEST' ];

print "
";

print $_SESSION[ 'TEST3' ];

print "
";

print session_id();

?>

3) curl工具测试

redis主:

630f74a6f8c7ef5e15cbcb44c4a031b7.png

redis从:

fb33351669f38d68140daa4fe709c62f.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值