为什么我们使用Redis以及在PHP中使用MySql实现Redis的正确方法是什么?

时间:2016-09-01 07:53:56

标签: mysql redis

我在数据库中有大量数据,有时服务器在执行结果超过服务器响应时间时没有响应。那么,有没有办法减少使用redis的mysql服务器的负载以及如何以正确的方式实现它。

2 个答案:

答案 0 :(得分:19)

Redis支持一系列数据类型,您可能想知道NOSQL键值存储与数据类型有什么关系?嗯,这些数据类型可以帮助开发人员以有意义的方式存储数据,并可以更快地进行数据检索。

使用PHP连接Redis

1)从github

下载或删除 predis

2)我们将要求Redis Autoloader并注册它。然后我们将客户端包装在try catch块中。在本地服务器上连接到Redis的连接设置与连接到远程服务器不同。

require "predis/autoload.php";
PredisAutoloader::register();

try {
    $redis = new PredisClient();

    // This connection is for a remote server
    /*
        $redis = new PredisClient(array(
            "scheme" => "tcp",
            "host" => "153.202.124.2",
            "port" => 6379
        ));
    */
}
catch (Exception $e) {
    die($e->getMessage());
}

现在我们已成功连接到Redis服务器,让我们开始使用Redis。

Redis的数据类型

以下是Redis支持的一些数据类型:

  • 字符串:与PHP中的字符串类似。
  • 列表:类似于PHP中的单维数组。您可以按下,弹出,移位和取消移位按顺序放置的元素或插入FIFO(先进先出)。
  • 哈希:字符串字段和字符串值之间的映射。它们是表示对象的完美数据类型(例如:具有多个字段的用户,如姓名,姓氏等)。
  • 设置:与list类似,但它没有订单,每个元素只能出现一次。
  • 排序集:与Redis集类似,具有存储在集中的值的唯一功能。区别在于排序集的每个成员与得分相关联,用于从最小得分到最大得分对该集合进行排序。 其他的是位图和超级日志,但本文不讨论它们,因为它们非常密集。

PHP Redis中的Getter和Setter(Predis)

在Redis中,最重要的命令是SET,GET和EXISTS。这些命令用于存储,检查和检索Redis服务器中的数据。与命令一样,Predis类可用于通过与命令同名的方法执行Redis操作。例如:

// sets message to contian "Hello world"
$redis->set('message', 'Hello world');
// gets the value of message
$value = $redis->get('message');
// Hello world
print($value); 
echo ($redis->exists('message')) ? "Oui" : "please populate the message key";

INCR和DECR是用于减少或增加值的命令。

$redis->set("counter", 0);
$redis->incr("counter"); // 1
$redis->incr("counter"); // 2
$redis->decr("counter"); // 1


$redis->set("counter", 0);
$redis->incrby("counter", 15); // 15
$redis->incrby("counter", 5);  // 20
$redis->decrby("counter", 10); // 10

使用列表

有一些用于处理列表的基本Redis命令,它们是:

  • LPUSH:在列表的开头添加一个元素
  • RPUSH:在列表末尾添加元素
  • LPOP:从列表中删除第一个元素并将其返回
  • RPOP:从列表中删除最后一个元素并将其返回
  • LLEN:获取列表的长度
  • LRANGE:从列表中获取一系列元素

如下所述的例子

$redis->rpush("languages", "french"); // [french]
$redis->rpush("languages", "arabic"); // [french, arabic]
$redis->lpush("languages", "english"); // [english, french, arabic]
$redis->lpush("languages", "swedish"); // [swedish, english, french, arabic]
$redis->lpop("languages"); // [english, french, arabic]
$redis->rpop("languages"); // [english, french]
$redis->llen("languages"); // 2
$redis->lrange("languages", 0, -1); // returns all elements
$redis->lrange("languages", 0, 1); // [english, french]

如何将数据从Redis传输到MySQL

你需要将Redis数据库作为主数据库,Mysql数据库作为slave,这意味着你必须首先从Redis获取数据,如果没有找到/重新获取数据,那么你必须从Mysql获取数据,如果找到数据然后更新Redis数据,那么下次你可以从redis中检索数据。基本快照如下所述。

//Connect with Redis database
$data=get_data_redis($query_param);
if(empty($data))
{
  //connect with mysql
  $data=get_data_mysql($query_param);
  if(!empty($data))
  {
     // update data into redis for that data
    update_data_redis($data,$query_param);
  }
}

如何在MySQL和Redis中管理数据

如果将数据管理到数据库中,则必须先将数据更新到mysql数据库中,然后将其更新到Redis数据库中。

//insert data in mysql
$inserted= insert_data_mysql($data);
if($inserted)
{
    insert_data_redis($data);
}

//update data in mysql
$updated= update_data_mysql($data,$query);
if($updated)
{
    insert_data_redis($data,$query);
}

//delete data in mysql
$deleted= delete_data_mysql($query);
if($deleted)
{
    delete_data_redis($query);
}

答案 1 :(得分:16)

Redis可以用作MYSQL查询的缓存层。 Redis是一个内存数据库,这意味着它将数据保存在内存中,与查询MYSQL中的数据相比,它可以更快地访问。

一个示例用例是:

假设您正在创建一个游戏列表网站,并且您有多个游戏类别,如汽车游戏,自行车游戏,儿童游戏等,并找到每个类别的游戏映射,您必须查询SQL数据库以获取列表您的游戏列表页面的游戏。在这种情况下,您可以将Redis用作缓存层,并在memcahce / Radis中缓存SQL响应X小时。

确切的步骤:

  1. Redis的第一次GET
  2. 如果发现返回。 如果没有在redis中找到,那么执行MYSQL查询并在返回之前将响应保存在redis缓存中以供下次使用。
  3. 这会将大量的查询从MYSQL卸载到内存中的redis db。

    if(data in redis){
        step 1: return data;
    }else{
        step 1: query MYSQL
        step 2: Save in redis
        step 3: return data
    }
    

    在选择要在redis中保存的查询之前要考虑的一些要点是:

    1. 只应选择静态查询,即那些数据不是用户特定的查询。
    2. 选择慢速静态查询以进一步提高MYSQL性能。
    3. 希望它会有所帮助。