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

ast*_*tha 12 mysql redis

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

Har*_*dja 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());
}
Run Code Online (Sandbox Code Playgroud)

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

Redis的数据类型

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

  • 字符串:类似于PHP中的字符串.
  • 列表:类似于PHP中的单维数组.您可以按下,弹出,移位和取消移位按顺序放置的元素或插入FIFO(先进先出).
  • 哈希:字符串字段和字符串值之间的映射.它们是表示对象的完美数据类型(例如:具有多个字段的用户,如姓名,姓氏等).
  • 设置:与列表类似,不同之处在于它没有顺序,每个元素只能出现一次.
  • 排序集:与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";
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

使用列表

有一些用于处理列表的基本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]
Run Code Online (Sandbox Code Playgroud)

如何将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);
  }
}
Run Code Online (Sandbox Code Playgroud)

如何在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);
}
Run Code Online (Sandbox Code Playgroud)


Nis*_*ant 16

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

一个示例用例是:

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

确切的步骤:

  1. 来自Redis的第一次GET
  2. 如果发现回来.如果在redis中找不到,那么执行MYSQL查询并在返回之前将响应保存在redis缓存中以供下次使用.

这将把大量的查询从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
}
Run Code Online (Sandbox Code Playgroud)

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

  1. 只应选择静态查询,即那些数据不是用户特定的查询.
  2. 选择慢速静态查询以进一步提高MYSQL性能.

希望它会有所帮助.