当前位置:首页 > PHP教程 > php高级应用 > 列表

PHP使用Redis常见7种使用场景

发布:smiling 来源: PHP粉丝网  添加日期:2022-06-14 07:52:56 浏览: 评论:0 

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

本篇文章,主要介绍利用PHP使用Redis,主要的应用场景。

简单字符串缓存实战

  1. $redis->connect('127.0.0.1', 6379); 
  2.  
  3. $strCacheKey  = 'Test_bihu'
  4.  
  5. //SET 应用 
  6.  
  7. $arrCacheData = [ 
  8.  
  9.     'name' => 'job'
  10.  
  11.     'sex'  => '男'
  12.  
  13.     'age'  => '30' 
  14.  
  15. ]; 
  16.  
  17. $redis->set($strCacheKey, json_encode($arrCacheData)); 
  18.  
  19. $redis->expire($strCacheKey, 30);  # 设置30秒后过期 
  20.  
  21. $json_data = $redis->get($strCacheKey); 
  22.  
  23. $data = json_decode($json_data); 
  24.  
  25. print_r($data->age); //输出数据 
  26.  
  27. //HSET 应用 
  28.  
  29. $arrWebSite = [ 
  30.  
  31.     'google' => [ 
  32.  
  33.         'google.com'
  34.  
  35.         'google.com.hk' 
  36.  
  37.     ], 
  38.  
  39. ]; 
  40.  
  41. $redis->hSet($strCacheKey'google', json_encode($arrWebSite['google'])); 
  42.  
  43. $json_data = $redis->hGet($strCacheKey'google'); 
  44.  
  45. $data = json_decode($json_data); 
  46.  
  47. print_r($data); //输出数据 

简单队列实战

  1. $redis->connect('127.0.0.1', 6379); 
  2.  
  3. $strQueueName  = 'Test_bihu_queue'
  4.  
  5. //进队列 
  6.  
  7. $redis->rpush($strQueueName, json_encode(['uid' => 1,'name' => 'Job'])); 
  8.  
  9. $redis->rpush($strQueueName, json_encode(['uid' => 2,'name' => 'Tom'])); 
  10.  
  11. $redis->rpush($strQueueName, json_encode(['uid' => 3,'name' => 'John'])); 
  12.  
  13. echo "---- 进队列成功 ---- <br /><br />"
  14.  
  15. //查看队列 
  16.  
  17. $strCount = $redis->lrange($strQueueName, 0, -1); 
  18.  
  19. echo "当前队列数据为: <br />"
  20.  
  21. print_r($strCount); 
  22.  
  23. //出队列 
  24.  
  25. $redis->lpop($strQueueName); 
  26.  
  27. echo "<br /><br /> ---- 出队列成功 ---- <br /><br />"
  28.  
  29. //查看队列 
  30.  
  31. $strCount = $redis->lrange($strQueueName, 0, -1); 
  32.  
  33. echo "当前队列数据为: <br />"
  34.  
  35. print_r($strCount); 

简单发布订阅实战

  1. //以下是 pub.php 文件的内容 cli下运行 
  2.  
  3. ini_set('default_socket_timeout', -1); 
  4.  
  5. $redis->connect('127.0.0.1', 6379); 
  6.  
  7. $strChannel = 'Test_bihu_channel'
  8.  
  9. //发布 
  10.  
  11. $redis->publish($strChannel"来自{$strChannel}频道的推送"); 
  12.  
  13. echo "---- {$strChannel} ---- 频道消息推送成功~ <br/>"
  14.  
  15. $redis->close(); 
  16.  
  17. //以下是 sub.php 文件内容 cli下运行 
  18.  
  19. ini_set('default_socket_timeout', -1); 
  20.  
  21. $redis->connect('127.0.0.1', 6379); 
  22.  
  23. $strChannel = 'Test_bihu_channel'
  24.  
  25. //订阅 
  26.  
  27. echo "---- 订阅{$strChannel}这个频道,等待消息推送...----  <br/><br/>"
  28.  
  29. $redis->subscribe([$strChannel], 'callBackFun'); 
  30.  
  31. function callBackFun($redis$channel$msg
  32.  
  33.  
  34.     print_r([ 
  35.  
  36.         'redis'   => $redis
  37.  
  38.         'channel' => $channel
  39.  
  40.         'msg'     => $msg 
  41.  
  42.     ]); 
  43.  

简单计数器实战

  1. $redis->connect('127.0.0.1', 6379); 
  2.  
  3. $strKey = 'Test_bihu_comments'
  4.  
  5. //设置初始值 
  6.  
  7. $redis->set($strKey, 0); 
  8.  
  9. $redis->INCR($strKey);  //+1 
  10.  
  11. $redis->INCR($strKey);  //+1 
  12.  
  13. $redis->INCR($strKey);  //+1 
  14.  
  15. $strNowCount = $redis->get($strKey); 
  16.  
  17. echo "---- 当前数量为{$strNowCount}。 ---- "

排行榜实战

  1. $redis->connect('127.0.0.1', 6379); 
  2.  
  3. $strKey = 'Test_bihu_score'
  4.  
  5. //存储数据 
  6.  
  7. $redis->zadd($strKey'50', json_encode(['name' => 'Tom'])); 
  8.  
  9. $redis->zadd($strKey'70', json_encode(['name' => 'John'])); 
  10.  
  11. $redis->zadd($strKey'90', json_encode(['name' => 'Jerry'])); 
  12.  
  13. $redis->zadd($strKey'30', json_encode(['name' => 'Job'])); 
  14.  
  15. $redis->zadd($strKey'100', json_encode(['name' => 'LiMing'])); 
  16.  
  17. $dataOne = $redis->ZREVRANGE($strKey, 0, -1, true); 
  18.  
  19. echo "---- {$strKey}由大到小的排序 ---- <br /><br />"
  20.  
  21. print_r($dataOne); 
  22.  
  23. $dataTwo = $redis->ZRANGE($strKey, 0, -1, true); 
  24.  
  25. echo "<br /><br />---- {$strKey}由小到大的排序 ---- <br /><br />"
  26.  
  27. print_r($dataTwo); 

简单字符串悲观锁实战

解释:悲观锁(Pessimistic Lock), 顾名思义,就是很悲观。

每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁。

场景:如果项目中使用了缓存且对缓存设置了超时时间。

当并发量比较大的时候,如果没有锁机制,那么缓存过期的瞬间,

大量并发请求会穿透缓存直接查询数据库,造成雪崩效应。

  1. /** 
  2.  
  3.  * 获取锁 
  4.  
  5.  * @param  String  $key    锁标识 
  6.  
  7.  * @param  Int     $expire 锁过期时间 
  8.  
  9.  * @return Boolean 
  10.  
  11.  */ 
  12.  
  13. public function lock($key = ''$expire = 5) { 
  14.  
  15.     $is_lock = $this->_redis->setnx($key, time()+$expire); 
  16.  
  17.     //不能获取锁 
  18.  
  19.     if(!$is_lock){ 
  20.  
  21.         //判断锁是否过期 
  22.  
  23.         $lock_time = $this->_redis->get($key); 
  24.  
  25.         //锁已过期,删除锁,重新获取 
  26.  
  27.         if (time() > $lock_time) { 
  28.  
  29.             unlock($key); 
  30.  
  31.             $is_lock = $this->_redis->setnx($key, time() + $expire); 
  32.  
  33.         } 
  34.  
  35.     } 
  36.  
  37.     return $is_lock? true : false; 
  38.  
  39.  
  40. /** 
  41.  
  42.  * 释放锁 
  43.  
  44.  * @param  String  $key 锁标识 
  45.  
  46.  * @return Boolean 
  47.  
  48.  */ 
  49.  
  50. public function unlock($key = ''){ 
  51.  
  52.     return $this->_redis->del($key); 
  53.  
  54.  
  55. // 定义锁标识 
  56.  
  57. $key = 'Test_bihu_lock'
  58.  
  59. // 获取锁 
  60.  
  61. $is_lock = lock($key, 10); 
  62.  
  63. if ($is_lock) { 
  64.  
  65.     echo 'get lock success<br>'
  66.  
  67.     echo 'do sth..<br>'
  68.  
  69.     sleep(5); 
  70.  
  71.     echo 'success<br>'
  72.  
  73.     unlock($key); 
  74.  
  75. else { //获取锁失败 
  76.  
  77.     echo 'request too frequently<br>'
  78.  

简单事务的乐观锁实战

解释:乐观锁(Optimistic Lock), 顾名思义,就是很乐观。

每次去拿数据的时候都认为别人不会修改,所以不会上锁。

watch命令会监视给定的key,当exec时候如果监视的key从调用watch后发生过变化,则整个事务会失败。

也可以调用watch多次监视多个key。这样就可以对指定的key加乐观锁了。

注意watch的key是对整个连接有效的,事务也一样。

如果连接断开,监视和事务都会被自动清除。

当然了exec,discard,unwatch命令都会清除连接中的所有监视。

  1. $strKey = 'Test_bihu_age'
  2.  
  3. $redis->set($strKey,10); 
  4.  
  5. $age = $redis->get($strKey); 
  6.  
  7. echo "---- Current Age:{$age} ---- <br/><br/>"
  8.  
  9. $redis->watch($strKey); 
  10.  
  11. // 开启事务 
  12.  
  13. $redis->multi(); 
  14.  
  15. //在这个时候新开了一个新会话执行 
  16.  
  17. $redis->set($strKey,30);  //新会话 
  18.  
  19. echo "---- Current Age:{$age} ---- <br/><br/>"//30 
  20.  
  21. $redis->set($strKey,20); 
  22.  
  23. $redis->exec(); 
  24.  
  25. $age = $redis->get($strKey); 
  26.  
  27. echo "---- Current Age:{$age} ---- <br/><br/>"//30 
  28.  
  29. //当exec时候如果监视的key从调用watch后发生过变化,则整个事务会失败

Tags: Redis

分享到: