mysql读写分离和用Redis做缓存,这两种方案有什么异同

读写分离是为了分担数据库的读压力,而使用缓存是为了减轻数据库的读压力。
如果有100个查询,并且有两个mysql从服务器,每个服务器可以共享从数据库获取的50个查询,因此mysql服务器只需要50个查询。

phpredis做mysql的缓存,怎么异步redis同步到mysql数据库

对于变化非常快的数据,仍然选择传统的静态缓存方式(Memocached、FileSystem等)来显示数据并不是很令人满意,因为访问缓存会产生很大的开销。
Redis等基于内存的NoSQL数据库非常适合作为实时数据的容器。

但是,往往对数据稳定性有要求。
使用MySQL作为数据存储可确保您不会因内存问题而丢失数据,同时还允许您利用关系数据库的性质来实现许多事情。
功能。

因此,很自然地要考虑是否可以使用MySQL作为数据存储引擎,使用Redis作为缓存。
由于目前还没有专门针对这一需求的成熟解决方案或工具,因此我们采用Gearman+PHP+MySQLUDF的组合来实现MySQL到Redis的异步数据复制。

MySQL到Redis数据复制方案

MySQL和Redis都有自己的数据同步机制。
比较常用的MySQL主从模式是在Slave端分析Master。
它是使用binlog来实现的。
这种数据复制实际上是一个异过程,但如果服务器都在同一个内网,异步延迟几乎可以忽略不计。

理论上,你也可以使用同样的方法来分析MySQLbinlog日志并将数据插入到Redis中。
不过,这需要对binlog文件和MySQL有非常深入的了解。
同时,由于binlog以State/Row/Mixedlevel等多种形式存在,因此分析binlog进行同步的工作量非常大。

因此,我们这里选择开发成本更便宜的方式。
我们借用已经比较成熟的MySQLUDF,首先将MySQL数据放入Gearman中,然后通过我们自己编写的PHPGearmanWorker将数据同步到Redis。
虽然相比binlog分析方法增加了更多的流程,但实现成本低廉且易于操作。

安装和使用Gearman

Gearman是一个支持分布式部署的工作负载部署框架。
设计简单并提供非常广泛的支持。
一个典型的Gearman应用程序包括以下部分:

GearmanJobServer:Gearman核心程序,必须作为守护进程在后台编译、安装和运行。

GearmanClient:可理解的,例如:要执行发送电子邮件的任务,您的程序可以调用GearmanClient,传递电子邮件信息,并且执行结果可以立显示给用户。
任务本身在后台缓慢运行。

GearmanWorker:任务的实际执行者通常必须自己编写某些逻辑并通过守护进程运行它。
GearmanWorker接收GearmanClient发送的工作详细信息并按顺序进行处理。

Resque是一个类似的后台任务处理项目,之前已经介绍过。
这两种设计实际上非常相似。
简单的比喻就是:

GearmanJobServer:相当于Resque的Redis部分

GearmanClient:相当于Resque的排队作业

GearmanWorker:相当于Resque的Workers和Jobs

我选择Gearman而不是Resque的原因是Gearman相对容易使用。
因为它提供了MySQLUDF并且需要更少的工作。

安装Gearman和PHPGearman扩展

下面以Ubuntu12.04为例。

apt-getinstallgearmangearman-serverlibgearman-dev

查看Gearman的工作状态:

/etc/init.d/gearman-job-serverstatus

查看Gearman的工作状态:

*gearmandisrunning

表示Gearman已安装成功。

PHP的Gearman扩展可以直接通过pecl安装。

peclinstallgearman

/etc/php5/conf。
d/gearman.ini

服务php5-fpmrestart

但是实际测试发现Ubuntu上默认安装的gearman版本太低,如果直接运行peclinstallgearman,会报错。

configure:error:libgearmanversion1.1.0以上要求

因此建议通过编译方式安装Gearman+PHP扩展。
为了简单起见,选择安装旧版本的扩展:

peclinstallgearman-1.0.3

Gearman+PHP示例

在下一篇文章中,我们将介绍为了使该过程更容易理解,我将在这里用最简单的Gearman示例进行解释。
例如,要执行文件处理任务,首先创建一个GearmanClient并将其命名为client.php。

<?php

$client=newGearmanClient();

addServer();

doBackground('writeLog','Logcontent');

echo'该文件已在后台运行。
';

运行此文件可防止用户请求网页。
模拟并完成处理就像向用户返回信息:

phpclient.php

检查Gearman的状态:

(echostatus;sleep0.1)|netcat127。
14730

可以看到如下输出

writeLog100。

Gearman中已经创建了一个名为writeLog的任务,这意味着队列中有一个任务正在等待。

上面四列表示Gearman当前的运行状态。

任务名称

等待队列中的任务

正在运行的任务

运行worker进程

实时监控您可以使用watchfor:

watch-n1"(echostatus;sleep0.1)|nc127.0.0.14730"

然后调用Worker.php你需要编写GearmanWorker。

<?php

$worker=newGearmanWorker();

addServer();

addFunction('写eLog','writeLog');while($worker->work());functionwriteLog($job){

workload();file_put_contents(__DIR__.'/gearman.log',$log."\n",FILE_APPEND|LOCK_EX);}

Worker使用while无限循环实现守护进程。

phpworker.php

您将看到Gearman状态更改为:你可以。

writeLog001

同时检查同一目录中的gearman.log。
Content必须是客户端传递过来的Logcontent值。

通过MySQLUDF+Trigger同步数据到Gearman

MySQL与外部程序通信的最佳方式是使用MySQLUDF(MySQL用户定义函数)。
了使MySQL能够将数据传递给Gearman,使用了lib_mysqludf_json和gearman-mysql-udf的组合。

安装lib_mysqludf_json

之所以使用lib_mysqludf_json是因为Gearman只接受字符串作为输入参数,而lib_mysqludf_json可以用来转换来自MySQL的数据。
编码为JSON字符串

apt-getinstalllibmysqlclient-dev

wgethttps://github.com/mysqludf/lib_mysqludf_json/archive/master.zip

unzipmaster.zip

cdlib_mysqludf_json-master/

rmlib_mysqludf_json.so

gcc$(mysql_config--cflags)-shared-fPIC-olib_mysqludf_json.so

重新编译可以看到lib_mysqludf_j已经创建了。
查看son.so文件,此时需要检查MySQL插件安装路径:

mysql-uroot-pPASSWORD--execute="showvariableslike'%plugin%';"+-------------+----------------+|变量名|值|+---------------+------------+|plugin_dir|/usr/lib/mysql/plugin/|+----------------+----------------+

然后lib_mysqludf_json.so将文件复制到其位置:

cplib_mysqludf_json.so/usr/lib/mysql/plugin/

最后登录MySQL,输入语句注册UDF功能。
运行:

CREATEFUNCTIONjson_objectRETURNSSTRINGSONAME'lib_mysqludf_json.so';

安装gearman-mysql-udf

方法几乎一样:

apt-getinstalllibgearman-dev

wgethttps://launchpad.net/gearman-mysql-udf/trunk/0.6/+download/gearman-mysql-udf-0.6.tar.gz

tar-xzfgearman-mysql-udf-0.6.tar.gz

cdgearman-mysql-udf-0.6./configure--with-mysql=/usr/bin/mysql_configg

-libdir=/usr/lib/mysql/plugin/

make&&makeinstall

登录MySQL,执行语句注册UDF函数

创建函数gman_do_BackgroundRETURNSSTRINGSONAME<'libgearman_mysql_udf.so';

CREATEFUNCTIONgman_servers_setRETURNSSTRINGSONAME<'libgearman_mysql_udf.so';

最后输入Gearman服务器信息指定:

SELECTgman_servers_set('127.0.0.1:4730');

通过MySQL触发器同步数据

最终会同步哪些数据,同步的条件还是需要根据实际情况确定。
数据表中的数据与每次更新同步,您创建触发器如下:

DELIMITER$$

CREATETRIGGERdatatoredisAFTERUPDATEONData

FOREACHROWBEGIN

SET@ret=gman_do_Background('syncToRedis',json_object(NEW.idas`id`,NEW.volumeas`volume`));END$$

DELIMITER;

尝试更新数据检查Gearman在数据库中是否有效。

GearmanPHPWorker将MySQL数据异步复制到Redis。

Redis是流行的NoSQL缓存解决方案,无需介绍,安装和使用非常简单。

>

apt-getinstallredis-server

peclinstallredis

/etc/php5/conf.d/redis.ini

然后写入GearmanWorker:redis_worker.php

#!/usr/bin/envphp<?

$worker=newGearmanWorker();

addServer();

addFunction('syncToRedis','syncToRedis');

$redis=newRedis();

connect('127.0.0.1',6379);while($worker->work());函数ion:syncToRedis($job){global$redis;

workload();

id)){returnfalse;}

set($work->id,$workString);}

最后,我们需要在后台运行Worker。

nohupphpredis_worker.php&

这样将MySQL数据复制到Redis时,单个Worker基本就完成了。
很快。

redis+mysql有几种用法?

Redis与MySQL配合使用,常用于数据缓存场景。
MySQL作为业务数据存储,Redis缓存经常访问的数据,提高系统响应能力。
数据一致性很重要。
读操作的流程如下:读取数据时,首先从Redis中获取数据。
如果数据不存在则查询MySQL。
更新操作过程需要注意保证数据的一致性。
直接删除Redis中的对应项或者更新Redis,必须考虑并发访问的复杂度。
在并发场景下,先更新MySQL,再删除Redis,会导致数据不一致。
因此,我们建议每次MySQL更新后立即清除Redis,以保证数据的一致性。
高并发场景下,使用Redis进行缓存,减少数据库负载。
读取数据时,先访问Redis,响应速度快。
然而,更新数据需要解决缓存和数据库之间的一致性问题。
解决方案包括:延迟双删除策略:在写入数据库之前和之后删除Redis缓存并设置适当的超时时间以保证数据的一致性。
该方法需要您评估业务逻辑时间和数据库主从同步时间来确定合适的睡眠时间。
设置缓存过期日期。
所有写操作均受数据库影响,缓存过期后自动刷新,保证最终一致性。
然而,这种方法可能会导致暂时的数据不一致。
异步更新缓存:MySQL通过订阅binlog将增量数据更新到Redis,提供数据的实时同步。
该解决方案结合了Redis缓存和MySQL数据库来提供高可用性。
总结:Redis与MySQL结合用时,必须合理设计缓存策略和数据更新流程,以保证系统数据的一致性和高性能。
上述方法可以有效解决同时访问时的数据一致性问题,提高系统整体性能。