一、redis简介
Redis是一个key-value存储系统。和Memcached类似,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。在部分场合可以对关系触发器同步到redis中
三、安装LNMP环境(这里为了省事,就是用yum来安装)
1、修改yum源
| 1 2 3 4 5 6 7 8 9 10 11 12 13 |
[iyunv@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 |
2、yum安装
| 1 | [iyunv@redis ~]# yum -y install nginx mysql php-pdo php-devel php-xmlrpc php-xml php-bcmath php-dba php-enchant mysql mysql-server |
3、简单配置一下nginx
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
[iyunv@redis ~]# vim /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; } } |
4、启动服务
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
[iyunv@redis ~]# sed -i 's/apache/nginx/g' /etc/php-fpm.d/www.conf [iyunv@redis ~]# /etc/init.d/php-fpm start 正在启动 servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2101/nginx tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 7544/php-fpm tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1871/mysqld |
5、给mysql授权
| 1 2 3 4 |
[iyunv@redis ~]# mysql mysql> grant all privileges on *.* to root@localhost identified by '123456'; mysql> flush privileges; |
6、测试
| 1 2 3 4 |
[iyunv@redis ~]# vim /www/index.php <?php phpinfo(); ?> |
然后访问页面看到php的相关信息,基础环境就算搭建完成了。
四、安装redis
1、安装redis
| 1 2 3 4 5 6 7 8 9 10 11 12 |
[iyunv@redis ~]# wget -c -t 0 http://download.redis.io/releases/redis-2.8.19.tar.gz [iyunv@redis ~]# mkdir /usr/local/redis [iyunv@redis ~]# tar xvf redis-2.8.19.tar.gz #安装很简单、直接make就可以了 [iyunv@redis ~]# cd redis-2.8.19 [iyunv@redis redis-2.8.19]# make #编译完成后,将src中的可执行文件拷贝到刚刚创建的目录中 [iyunv@redis src]# cp redis-benchmark redis-check-aof redis-check-dump redis-cli redis-sentinel redis-server /usr/local/redis/ [iyunv@redis redis-2.8.19]# cp redis.conf sentinel.conf /usr/local/redis/ |
Redis-benchmark 压力测试工具
Redis-check-aof 检查redis持久化命令文件的完整性
Redis-check-dump 检查redis持久化数据文件的完整性
Redis-cli redis在linux上的客户端
Redis-sentinel redis-sentinel是集群管理工具,主要负责主从切换。
Redis-server Redis服务器的daemon启动程序
2、安装php的redis扩展
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[iyunv@redis ~]# wget -c -t 0 https://github.com/owlient/phpredis/archive/master.zip [iyunv@redis ~]# unzip master.zip [iyunv@redis ~]# cd phpredis-master/ [iyunv@redis php-fpm: [确定] |
3、是否安装成功
还是访问phpinfo的那个界面
<ignore_js_op>数据库里执行update来模拟写操作。
1、在mysql中插入一些测试数据
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[iyunv@redis ~]# mysql -u root -p123456 mysql> create database mytest; mysql> CREATE TABLE `test` (`id` int(7) NOT NULL AUTO_INCREMENT, `name` char(8) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8; mysql> INSERT INTO `test` VALUES (1,'sven'),(2,'jim'),(3,'zhu'),(4,'wang'),(5,'ftd'),(6,'test'),(7,'test01'),(8,'test02'),(9,'test03'); mysql> select * from mytest.test; +----+--------+ | id | name | +----+--------+ | 1 | sven | | 2 | jim | | 3 | zhu | | 4 | wang | | 5 | ftd | | 6 | test | | 7 | test01 | | 8 | test02 | | 9 | test03 | +----+--------+ |
2、编写php的测试代码
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
<? } ?> |
第一次访问,redis中没有对应的KEY时
<ignore_js_op>数据同步到redis中。
六、通过gearman实现同步
1、介绍
Gearman是一个支持分布式的任务分发框架:
Gearman Job Server:Gearman核心程序,需要编译安装并以守护进程形式运行在后台。
Gearman Client:可以理解为任务的请求者。
Gearman Worker:任务的真正执行者,一般需要自己编写具体逻辑并通过守护进程方式运行,Gearman Worker接收到Gearman Client传递的任务内容后,会按顺序处理。
大致流程:
下面要编写的mysql触发器,就相当于Gearman的客户端。修改表,插入表就相当于直接下发任务。然后通过lib_mysqludf_json UDF库函数将关系数据映射为JSON格式,然后在通过gearman-mysql-udf插件将任务加入到Gearman的任务队列中,最后通过redis_worker.php,也就是Gearman的worker端来完成redis数据库的更新。
2、安装启动
| 1 2 3 4 5 |
[iyunv@redis ~]# yum -y install gearmand libgearman-devel [iyunv@redis ~]# /etc/init.d/gearmand start 正在启动 gearmand: [确定] [iyunv@redis ~]# /etc/init.d/gearmand status gearmand (pid 7702) 正在运行... |
3、安装php的gearman扩展
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[iyunv@redis ~]# wget -c -t 0 https://pecl.php.net/get/gearman-1.1.1.tgz [iyunv@redis ~]# tar xvf gearman-1.1.1.tgz [iyunv@redis ~]# cd gearman-1.1.1 [iyunv@redis gearman-1.1.1]# phpize [iyunv@redis gearman-1.1.1]# ./configure --with-php-config=/usr/bin/php-fpm: [确定] |
<ignore_js_op>
这样就是安装成功了
4、安装lib_mysqludf_json
lib_mysqludf_json UDF库函数将关系数据映射为JSON格式。通常,数据库中的数据映射为JSON格式,是通过程序来转换的。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
[iyunv@redis ~]# wget -c -t 0 https://github.com/mysqludf/lib_mysqludf_json/archive/master.zip [iyunv@redis ~]# unzip master.zip [iyunv@redis ~]# cd lib_mysqludf_json-master/ [iyunv@redis lib_mysqludf_json-master]# gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysql/plugin | +---------------+-------------------------+ #将模块拷贝到插件目录下 [iyunv@redis lib_mysqludf_json-master]# cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/ #注册UDF函数 mysql> CREATE FUNCTION json_object RETURNS STRING SONAME 'lib_mysqludf_json.so'; |
5、安装gearman-mysql-udf
这个插件是用来管理调用 Gearman 的分布式的队列。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[iyunv@redis ~]# wget -c -t 0 https://launchpad.net/gearman-my ... ysql-udf-0.6.tar.gz [iyunv@redis ~]# tar xvf gearman-mysql-udf-0.6.tar.gz [iyunv@redis ~]# cd gearman-mysql-udf-0.6 [iyunv@redis gearman-mysql-udf-0.6]# ./configure --with-mysql=/usr/bin/mysql_config --libdir=/usr/lib64/servers_set('127.0.0.1:4730'); |
6、编写mysql触发器(根据实际情况编写)
| 1 2 3 4 5 |
DELIMITER $$ CREATE TRIGGER datatoredis AFTER UPDATE ON test FOR EACH ROW BEGIN SET @RECV=gman_do_background('syncToRedis', json_object(NEW.id as `id`, NEW.name as `name`)); END$$ DELIMITER ; |
7、编写gearman的worker端
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[iyunv@redis ~]# vim /www/redis_worker.php <?php redis_worker.php & |
"$redis->set($work->id, $work->name);"这条语句就是将id作KEY和name作VALUE分开存储,需要和前面写的php测试代码的存取一致。
8、更新mysql中的数据
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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 |
[iyunv@redis redis]# ./redis-cli 127.0.0.1:6379> get 1 "sven" |
这里的数据居然没有变化,这是我们就要排错了。
| 1 2 3 4 5 6 7 8 9 10 11 |
[iyunv@redis ~]# vim /var/log/audit/audit.log type=AVC msg=audit(1427807674.425:107): avc: denied { name_connect } for pid=12453 comm="bject_r:port_t:s0 tclass=tcp_socket #看到这样一条日志,就知道是selinux阻止了同步 #现在将selinux的模式调成Permissive [iyunv@redis ~]# getenforce Enforcing [iyunv@redis ~]# setenforce 0 [iyunv@redis ~]# getenforce Permissive |
设置完成以后,再次执行update,进入redis进行查看
| 1 2 |
127.0.0.1:6379> get 1 "ssss" |
http://avnpc.com/pages/mysql-replication-to-redis-by-gearman
http://www.cnblogs.com/hellowzd/p/5163782.html