redis+mysql框架搭建
redis是一个key-value存储系统。和memcached类似,不过redis支持的value类型更多,主要有:string(字符串)、list(链表)、set(集合)、zset(有序集合)和hash(哈希类型)。redis和memcached一样,为了保证效率,都是把数据缓存在内存中。区别是redis会周期性的把更新的数据写入磁盘或者把修改的操作写入追加的记录文件,并且在此基础上实现master-slave主从同步。
简单的比较redis和memcached的区别,主要就是以下几点: 1、redis不仅支持简单的键值类型的数据,同时提供string、set、zset、hash等数据结构的存储。 2、redis支持数据的备份,即 master-slave模式的数据备份。 3、redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
接下来介绍redis+mysql架构的搭建: 环境:红帽6.5、虚拟主机VM1 ip=172.25.10.8
一:在虚拟主机上的安装redis:
ste no1 1234 ;将键no1添加键值1234; get no1 ;获得no1的键值;
二、介绍redis作mysql的缓存服务器。 1、安装lnmp环境,安装以下软件包:
<?php
Phpinfo()
?>
创建php 测试页面;
<?php $redis = new Redis(); $redis->connect(‘127.0.0.1‘,6379) or die ("could net connect redis server"); $query = "select * from test limit 9"; for ($key = 1; $key < 10; $key++) { if (!$redis->get($key)) { $connect = mysqlconnect(‘127.0.0.1‘,‘redis‘,‘westos‘); mysqlselectdb(test); $result = mysqlquery($query); //如果没有找到$key,就将该查询sql 的结果缓存到redis while ($row = mysqlfetchassoc($result)) { $redis->set($row[‘id‘],$row[‘name‘]); } $ myserver = ‘ mysql‘; break; } else { $myserver = "redis"; $data[$key] = $redis->get($key); } } echo $myserver; echo "
"; for ($key = 1; $key < 10; $key++) { echo "number is $key"; echo "
"; echo "name is $data[$key]"; echo "
"; } ?>
安装php的redis扩展; 材料:phpredis-master.zip
extension=redis.so
在数据库中添加测试用test.sql.
select * from test; update test set name="westos" where id=1;
在FIREFOX中输入master的ip进入页面,查看测试结果变化;进行验证数据从哪里读到,第一应该是从数据库中读到,刷新一次数据缓存在redis中,所以数据应该是从redis中读到;但是如果在数据库中更新了相关的数据,而redis中缓存的数据却无法及时更新,因为redis中任然有对应的KEY,数据就不会更新,这是一个缺陷,接下来就要通过mysql触发器将改变的数据同步到redis中。
三、数据库与redis数据同步: 配置gearman实现数据同步:Gearman 是一个支持分布式的任务分发框架, Gearman Job Server:Gearman 核心程序,需要编译安装并以守护进程形式运行在后台。 Gearman Client:可以理解为任务的请求者。 Gearman Worker:任务的真正执行者,一般需要自己编写具体逻辑并通过守护进程方式 运行,Gearman Worker 接收到Gearman Client 传递的任务内容后,会按顺序处理。 大致流程:下面要编写的mysql 触发器,就相当于Gearman 的客户端。修改表,插入表就相当于直接 下发任务。然后通过libmysqludfjson UDF库函数将关系数据映射为JSON 格式,然后 在通过gearman-mysql-udf插件将任务加入到Gearman的任务队列中,最后通过 redis_worker.php,也就是Gearman 的worker 端来完成redis 数据库的更新。
extension=gearman.so
安装libmysqludfjson: libmysqludfjson UDF库函数将关系数据映射为JSON格式。而通常将数据映射为JSON格式是通过程序来转换的。
show global variables like ‘plugin_dir‘;
>CREATE FUNCTION json_object RETURNS STRING SONAME ‘lib_mysqludf_json.so‘;
>select * from mysql.func; ;查看注册的函数;
安装gearman-mysql-udf,这个插件是用来管理调用Gearman 的分布式的队列。
> create function gman_do_background returns string soname ‘libgearman_mysql_udf.so‘; ;注册UDF函数;
> create function gman_servers_set returns string soname ‘libgearman_mysql_udf.so‘;
> select * from mysql.func; ;查看函数
> show triggers from test;
>select gman_servers_set(‘127.0.0.1:4730‘); ;指定gearman的服务信息,
编写mysql 触发器(根据实际情况编写)
use test; DELIMITER $$ CREATE TRIGGER datatoredis AFTER UPDATE ON test FOR EACH ROW BEGIN SET @RECV=gmandobackground(‘syncToRedis‘, json_object(NEW.id as id
, NEW.name as name
)); END$$ DELIMITER ;
mysql > SHOW TRIGGERS FROM test; ;查看触发器;
编写gearman的worker端:
vim 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); #这条语句就是将id 作KEY 和 name 作VALUE 分开存储,需要和前面写的php 测试代码的存取一致。 } ?>
更新mysql中的数据,mysql 更新数据库内容,redis就会立即更新缓存的数据。可以直接验证。
本文出自 “Foreverlinux” 博客,请务必保留此出处http://linuxmin0712.blog.51cto.com/11702588/1794755
原文地址:http://linuxmin0712.blog.51cto.com/11702588/1794755