我在数据库中有大量数据,有时服务器在执行结果超过服务器响应时间时没有响应。那么,有没有办法减少使用redis的mysql服务器的负载以及如何以正确的方式实现它。
答案 0 :(得分:19)
Redis支持一系列数据类型,您可能想知道NOSQL键值存储与数据类型有什么关系?嗯,这些数据类型可以帮助开发人员以有意义的方式存储数据,并可以更快地进行数据检索。
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中,最重要的命令是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命令,它们是:
如下所述的例子
$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数据库作为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数据库中。
//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小时。
确切的步骤:
这会将大量的查询从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中保存的查询之前要考虑的一些要点是:
希望它会有所帮助。