В этой статье представлено несколько распространенных режимов работы и использования redis в PHP. Подробности заключаются в следующем:
1. Простое кэширование строк
Например, кэшируйте некоторые данные с помощью медленного SQL – запроса и нечастого обновления.
2, Имитировать простую очередь через список
Например, нам нужно отправлять почту партиями. Мы можем поставить задачу отправки почты в очередь, а затем запустить несколько PHP-скриптов для чтения задачи из очереди на отправку почты.
Он также может быть использован для борьбы со вторым уничтожением товаров. Когда пользователи нажимают, чтобы поторопиться с покупкой, они помещают одну за другой задачи пользователя, спешащие купить, в очередь, сериализуют их, оценивают количество очередей и предотвращают возникновение перепроданности.
connect('127.0.0.1', 6379, 60);
//Loop to send 1000 mail tasks into the queue
for ($ix = 0; $ix < 1000; $ix++) {
$redis->lPush('send_email_queue', json_encode([
'id' => $ix,
'send' => '[email protected]',
'receive' => '[email protected]',
'title' => 'xxx',
'body' => 'xxx',
]));
}
sleep(3);
//Take tasks from the queue and execute them
while ($count = $redis->lLen('send_email_queue')) {
Echo "current task queue number {$count} < br >";
$task = $redis->rpop('send_email_queue');
$task = json_decode($task, true);
//Pseudo code, send mail
$mailer->send($task['send'], $task['receive'], $task['title'], $task['body']);
Echo "task {$task ['id ']} email sent successfully < br >";
}3、 Оптимистичный замок реализован с помощью watch + multi
Оптимистичная блокировка, как следует из названия, считает, что данные не будут изменены. Только после обновления данных мы можем судить о том, были ли данные изменены. Обычно он реализуется с номером версии или меткой времени.
Redis реализован через watch и multi. Часы будут отслеживать, изменился ли данный ключ. При выполнении, если отслеживаемый ключ изменился, вся транзакция завершится ошибкой.
Конечно, мы можем вызывать часы несколько раз, чтобы отслеживать несколько ключей.
connect('127.0.0.1', 6379, 60);
//Set the inventory number of goods to 100
$redis->set('goods_stock_nums', 100);
//Monitor the key
$redis->watch('goods_stock_nums');
//Open transaction
$redis->multi();
//Modify inventory
$redis->decr('goods_stock_nums');
//Commit the transaction. If other requests modify the key during this period, the transaction will fail
if ($redis->exec()) {
Echo 'successful rush purchase';
} else {
Echo 'data error, please try again';
}4、 Использование набора для реализации пессимистической блокировки
Пессимистическая блокировка, как следует из названия, пессимист считает, что данные всегда будут изменены, поэтому блокировка будет добавлена перед операцией, а затем отпустите блокировку после операции.
connect('127.0.0.1', 6379, 60);
return $redis;
}
function lock($key, $random)
{
$redis = getRedis();
return $redis->set($key, $random, ['nx', 'ex' => 3]);
}
function unlock($key, $random)
{
$redis = getRedis();
//Using Lua script to ensure atomicity
$script = 'if redis.call("get",KEYS[1]) == ARGV[1] then return redis.call("del",KEYS[1]) else return 0 end';
return $redis->eval($script, [$key, $random], 1);
}
function decrGoodsStockNums()
{
$redis = getRedis();
//Get the inventory of goods
$ret = $redis->get('goods_stock_nums');
if ($ret === false) {
return false;
}
if ($ret <= 0) {
return false;
}
$random = mt_rand();
//Get the lock first
if (lock('goods_stock_nums_lock', $random)) {
//Modify inventory
$redis->decr('goods_stock_nums');
//Release the lock
unlock('goods_stock_nums_lock', $random);
return true;
} else {
usleep(100);
decrGoodsStockNums();
}
}
decrGoodsStockNums();5. Публикуйте и подписывайтесь с помощью publish + subscribe
Код выпуска:
pconnect('127.0.0.1', 6379);
$ix = 0;
//Publishing content
while (true) {
$redis->publish('news', json_encode([
'title '= >' I'm the news headline '. $IX,
'content' = > 'I'm news content'. $IX,
'time' => date('Y-m-d H:i:s'),
]));
$ix++;
sleep(1);
}Код подписки:
pconnect('127.0.0.1', 6379);
//Subscription content
$redis->subscribe(['news'], function ($redis, $channel, $msg) {
$msg = json_decode($msg, true);
Echo "title: {$MSG ['title ']} content: {$MSG ['content']} time: {$MSG ['time ']} < br >";
});Для получения дополнительной информации о PHP читатели, интересующиеся этим сайтом, могут ознакомиться со следующими темами: краткое изложение навыков программирования баз данных PHP + redis, вводный курс объектно-ориентированного программирования PHP, вводный курс базовой грамматики PHP, навыки работы с массивами PHP, краткое описание использования строк PHP “Руководство по работе с базой данных PHP + MySQL” и “Краткое изложение общих навыков работы с базой данных PHP”.
Я надеюсь, что эта статья будет полезна для программирования на PHP.