您的位置:首页 > 数据库 > Redis

redis作为mysql的缓存服务器(读写分离)

2016-08-04 17:24 423 查看
一、redis简介
Redis是一个key-value存储系统。和Memcached类似,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++( hiredis ),C#,PHP,JavaScript,Perl,Object-C,Python,Ruby等客户端,使用很方便。 

二、架构图 


  
大致结构就是读写分离,将mysql中的数据通过触发器同步到redis中 

三、安装LNMP环境(这里为了省事,就是用yum来安装) 

1、修改yum源

[root@redis ~]# vim /etc/yum.repos.d/epel.repo    #添加这个文件
[epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
failovermethod=priority
enabled=1
gpgcheck=0

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=1

[root@redis ~]# vim /etc/nginx/nginx.conf
server {
listen       80;
#定义使用www.xx.com访问
server_name  www.xx.com;

#设定本虚拟主机的访问日志
access_log  /logs/www.xx.com.access.log  main;

#默认请求
location / {
root   /www/;      #定义服务器的默认网站根目录位置
index index.php index.html index.htm;   #定义首页索引文件的名称
}
location ~ \.php$ {
root /www/;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /www/$fastcgi_script_name;
include fastcgi_params;
}
}

[root@redis ~]# mysql
mysql> grant all privileges on *.* to root@localhost identified by '123456';

mysql> flush privileges;

6、测试

[root@redis ~]# vim /www/index.php
<?php
phpinfo();
?>

[root@redis ~]# wget -c -t 0 https://github.com/owlient/phpredis/archive/master.zip [root@redis ~]# unzip master.zip

[root@redis ~]# cd phpredis-master/
[root@redis phpredis-master]# phpize
[root@redis phpredis-master]# ./configure --with-php-config=/usr/bin/php-config
[root@redis phpredis-master]# make && make install

#修改php的配置文件,如果没有“extension=redis.so”,就加上这一行
[root@redis ~]# vim /etc/php.ini
extension=redis.so

[root@redis ~]# /etc/init.d/php-fpm restart
停止 php-fpm:                                             [确定]
正在启动 php-fpm:                                         [确定]

[root@redis ~]# vim /www/redis_worker.php
<?php
$worker = new GearmanWorker();
$worker->addServer();
$worker->addFunction('syncToRedis', 'syncToRedis');

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

while($worker->work());
function syncToRedis($job)
{
global $redis;
$workString = $job->workload();
$work = json_decode($workString);
if(!isset($work->id)){
return false;
}
$redis->set($work->id, $work->name);
}
?>

#后台运行
[root@redis www]# nohup php redis_worker.php &

"$redis->set($work->id, $work->name)] 

8、更新mysql中的数据

mysql> set @RECV = 1;
mysql> select @RECV;
+------+
| @RECV|
+------+
|    1 |
+------+
mysql> update test set name = 'ssss' where id = 1;
mysql> select @RECV;
+------+
| @RECV|
+------+
| NULL |
+------+


从返回值可以看到,触发器是触发成功的(这里的@RECV是上面mysql TIGGER的返回值)。我们在redis中查看数据: 
1

2

3
[root@redis redis]# ./redis-cli 

127.0.0.1:6379> get 1

"sven"

这里的数据居然没有变化,这是我们就要排错了。

[root@redis ~]# vim /var/log/audit/audit.log
type=AVC msg=audit(1427807674.425:107): avc:  denied  { name_connect } for  pid=12453 comm="mysqld" dest=4730 scontext=unconfined_u:system_r:mysqld_t:s0 tcontext=system_u:o
bject_r:port_t:s0 tclass=tcp_socket
#看到这样一条日志,就知道是selinux阻止了同步

#现在将selinux的模式调成Permissive
[root@redis ~]# getenforce
Enforcing
[root@redis ~]# setenforce 0
[root@redis ~]# getenforce
Permissive

设置完成以后,再次执行update,进入redis进行查看

127.0.0.1:6379> get 1
"ssss"

刷新一下刚刚的php界面 


  
到这里就基本算是大功告成了, 只要application将数据写到mysql中,mysql触发器检测到更新,就会通过Gearman将数据同步到redis中。然后读取的话,就直接从redis中进行读取。当然这只是个实验环境,实际上还有很多细节要调整。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  redis