Redis is an open source, network-enabled, memory-based and persistent log, Key-Value database written in the ANSI C language, and provides multilingual API s.
This article focuses on the main scenarios for using Redis with PHP.
Simple String Cache Actual
$redis->connect('127.0.0.1', 6379); $strCacheKey = 'Test_bihu'; //SET Application $arrCacheData = [ 'name' => 'job', 'sex' => 'male', 'age' => '30' ]; $redis->set($strCacheKey, json_encode($arrCacheData)); $redis->expire($strCacheKey, 30); # Expires after 30 seconds $json_data = $redis->get($strCacheKey); $data = json_decode($json_data); print_r($data->age); //output data //HSET Application $arrWebSite = [ 'google' => [ 'google.com', 'google.com.hk' ], ]; $redis->hSet($strCacheKey, 'google', json_encode($arrWebSite['google'])); $json_data = $redis->hGet($strCacheKey, 'google'); $data = json_decode($json_data); print_r($data); //output data
Simple Queue Actual
$redis->connect('127.0.0.1', 6379); $strQueueName = 'Test_bihu_queue'; //Queue $redis->rpush($strQueueName, json_encode(['uid' => 1,'name' => 'Job'])); $redis->rpush($strQueueName, json_encode(['uid' => 2,'name' => 'Tom'])); $redis->rpush($strQueueName, json_encode(['uid' => 3,'name' => 'John'])); echo "---- Successful Queue Entry ---- <br /><br />"; //View Queue $strCount = $redis->lrange($strQueueName, 0, -1); echo "Current queue data is: <br />"; print_r($strCount); //Out of Queue $redis->lpop($strQueueName); echo "<br /><br /> ---- Queue Out Succeeded ---- <br /><br />"; //View Queue $strCount = $redis->lrange($strQueueName, 0, -1); echo "Current queue data is: <br />"; print_r($strCount);
Simple Publish Subscription Actual
//The following is run under the content cli of the pub.php file ini_set('default_socket_timeout', -1); $redis->connect('127.0.0.1', 6379); $strChannel = 'Test_bihu_channel'; //Release $redis->publish($strChannel, "Come from{$strChannel}Channel Push"); echo "---- {$strChannel} ---- Channel message successfully pushed~ <br/>"; $redis->close(); //The following is run under the sub.php file content cli ini_set('default_socket_timeout', -1); $redis->connect('127.0.0.1', 6379); $strChannel = 'Test_bihu_channel'; //Subscribe echo "---- Subscribe{$strChannel}This channel, waiting for messages to be pushed...---- <br/><br/>"; $redis->subscribe([$strChannel], 'callBackFun'); function callBackFun($redis, $channel, $msg) { print_r([ 'redis' => $redis, 'channel' => $channel, 'msg' => $msg ]); }
Simple Counter Actual
$redis->connect('127.0.0.1', 6379); $strKey = 'Test_bihu_comments'; //Set Initial Value $redis->set($strKey, 0); $redis->INCR($strKey); //+1 $redis->INCR($strKey); //+1 $redis->INCR($strKey); //+1 $strNowCount = $redis->get($strKey); echo "---- The current quantity is{$strNowCount}. ---- ";
Chart Actual
$redis->connect('127.0.0.1', 6379); $strKey = 'Test_bihu_score'; //Store data $redis->zadd($strKey, '50', json_encode(['name' => 'Tom'])); $redis->zadd($strKey, '70', json_encode(['name' => 'John'])); $redis->zadd($strKey, '90', json_encode(['name' => 'Jerry'])); $redis->zadd($strKey, '30', json_encode(['name' => 'Job'])); $redis->zadd($strKey, '100', json_encode(['name' => 'LiMing'])); $dataOne = $redis->ZREVRANGE($strKey, 0, -1, true); echo "---- {$strKey}Sort from large to small ---- <br /><br />"; print_r($dataOne); $dataTwo = $redis->ZRANGE($strKey, 0, -1, true); echo "<br /><br />---- {$strKey}Sort from small to large ---- <br /><br />"; print_r($dataTwo);
Simple String Pessimistic Lock Actual
Interpretation: Pessimistic Lock, as its name implies, is pessimistic.
Every time you go to get data, you think someone else will modify it, so every time you get data, you lock it.
Scenario: If a cache is used in the project and a timeout is set for the cache.
When concurrency is high, if there is no lock mechanism, then the cache will expire at the moment.
A large number of concurrent requests will directly query the database through the cache, causing an avalanche effect.
/** * Acquire locks * @param String $key Lock identification * @param Int $expire Lock expiration time * @return Boolean */ public function lock($key = '', $expire = 5) { $is_lock = $this->_redis->setnx($key, time()+$expire); //Unable to acquire lock if(!$is_lock){ //Determine if the lock is out of date $lock_time = $this->_redis->get($key); //Lock expired, delete lock, reacquire if (time() > $lock_time) { unlock($key); $is_lock = $this->_redis->setnx($key, time() + $expire); } } return $is_lock? true : false; } /** * Release lock * @param String $key Lock identification * @return Boolean */ public function unlock($key = ''){ return $this->_redis->del($key); } // Define Lock Identification $key = 'Test_bihu_lock'; // Acquire locks $is_lock = lock($key, 10); if ($is_lock) { echo 'get lock success<br>'; echo 'do sth..<br>'; sleep(5); echo 'success<br>'; unlock($key); } else { //Failed to acquire lock echo 'request too frequently<br>'; }
Optimistic Lock for Simple Transactions
Interpretation: Optimistic Lock, as its name implies, is optimistic.
Every time you go to get the data, you assume that no one else will modify it, so you won't lock it.
The watch command monitors a given key, and when exec is exec, if the monitored key has changed since watch was called, the entire transaction will fail.
You can also call watch to monitor multiple keys multiple times.This locks the specified key optimally.
Note that the watch key is valid for the entire connection, as is the transaction.
If the connection is disconnected, monitoring and transactions are automatically cleared.
Of course, the exec, discard, unwatch commands clear all monitoring in the connection.
$strKey = 'Test_bihu_age'; $redis->set($strKey,10); $age = $redis->get($strKey); echo "---- Current Age:{$age} ---- <br/><br/>"; $redis->watch($strKey); // Open Transaction $redis->multi(); //At this point a new session is opened to execute $redis->set($strKey,30); //new session echo "---- Current Age:{$age} ---- <br/><br/>"; //30 $redis->set($strKey,20); $redis->exec(); $age = $redis->get($strKey); echo "---- Current Age:{$age} ---- <br/><br/>"; //30 //When exec, if the key monitored has changed since watch was called, the entire transaction will fail
For more information, visit: