在上一篇文章-Redis数据库在树莓派中的简单使用 中完成了Redis数据库的安装使用,这一次更上一层楼,将Redis配置成Mysql数据库缓存,实现读写分离,热点数据直接读取Redis内存数据库,提供快速响应服务。
简而言之,将insert/update/delete交给MySQL,而select交给redis完成,减轻MySQL压力并提供高并发服务。
1、mysql/mariadb自带缓存功能,我们先来探索一下。
运行命令 show variables like '%query_cache%'; 来查看缓存的配置。
have_query_cache:支持缓存。
query_cache_size:配置缓存大小,下图为16777216B(字节),16M。
Query_cache_type:可以是0,1,2,0代表不使用缓存,1代表使用缓存,2代表根据需要使用。
query_cache_type:缓存开关。
运行命令 show variables like '%query_cache%'; 来查看缓存的状态。
Qcache_free_memory:在query_cache_size设置的缓存中的空闲的内存。
Qcache_hits:缓存的命中次数。
Qcache_inserts:查询缓存区此前总共缓存过多少条查询命令的结果。
Qcache_lowmem_prunes:查询缓存区已满而从其中溢出和删除的查询结果的个数。
Qcache_queries_in_cache: 当前缓存中缓存的SQL数量。
但是查询缓存会生成碎片,可以通过下面命令来整理碎片, flush query cache。想清理内存中的碎片, reset query cache。
2、业务逻辑层来做简单的缓存
下面的php代码就是查询redis数据库中key的值(如果没有安装相应的可以搜索笔者以前的文章,php操作mysql和php操作redis),如果没有数据则访问mysql,同时将查询到的数据插入redis中,待下次访问查询时可以查询redis后可以得到缓存的数据。
这个只是演示做简单的数据缓存,当mysql数据库需要更新或者更新频繁时,这个方法就不合适了。需要将数据更改直接触发写入redis中,这样业务端就可以直接访问redis,不必那么麻烦。
<?php
$servername = "localhost";
$username = "phpmyadmin";
$password = "phpmyadmin";
$dbname = "testdb";
$key = 6;
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
//echo "Connection to server successfully";
if (!$redis->get($key))
{
$conn = mysqli_connect($servername, $username, $password, $dbname);
if (!$conn) {
die("连接失败: " . mysqli_connect_error());
}
$sql = "SELECT card_id, card_number FROM card where card_id = 6";
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0) {
// 输出数据
while($row = mysqli_fetch_assoc($result)) {
$redis->set($row['card_id'],$row['card_number']);
echo "id: " . $row["card_id"]. " - number: " . $row["card_number"]."<br>";
}
}
else {
echo "0 结果";
}
$myserver = 'mysql';
mysqli_close($conn);
}
else
{
$myserver = "redis";
$data = $redis->get($key);
}
echo $myserver;
echo "<br>";
echo "id 6,card_number:".$data;
?>
第二次运行结果3、自动将 MySQL数据同步到Redis
实现方法就很多了,总结下来有这几种:1、基于mysql的自定义函数(user-defined function UDF)来操作redis的接口,通过mysql触发器Trigger调动UDF来同步数据到Redis;2、第三方插件读取分析mysql的binlog二进制日志,将改变同步到Redis;3、mysql触发器Trigger调用Gearman任务分发,完成redis数据库的更新。
查看MySQL UDF放置的位置:
最后笔者就需要借助github了,搜索“redis mysql”,上面有很多同步的开源代码,原理基本都是基于上面三种方法。笔者实验了项目mysql2redis,有库没有装好,失败了,待心情恢复后再来吧!
网友评论