Redis作为Mysql数据库缓存的简单配置

2021-02-02  本文已影响0人  刘小白DOER

        在上一篇文章-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,有库没有装好,失败了,待心情恢复后再来吧!

上一篇 下一篇

猜你喜欢

热点阅读