首頁  >  文章  >  後端開發  >  PHP專案中需要用到Redis的場景

PHP專案中需要用到Redis的場景

*文
*文原創
2018-01-02 10:00:442683瀏覽

Redis是一個開源的使用ANSI C語言編寫、支援網路、可基於記憶體亦可持久化的日誌類型、Key-Value資料庫,並提供多種語言的API。今天我們來看看php結合redis的一些應用場景,希望對大家有幫助。

前言

一些案例中有的同學說為什麼不可以用string類型,string類型完全可以實現嗎

我建議你看下我的專欄文章《Redis高級用法》,裡面介紹了用hash類型的好處

#商品維度計數

對商品喜歡數,評論數,鑑定數,瀏覽數進行計數
說起電商,肯定離不開商品,而附帶商品有各種計數(喜歡數,評論數,鑑定數,瀏覽數,etc)
Redis的命令都是原子性的,你可以輕鬆地利用INCR,DECR等命令來計數。

採用Redis 的類型: Hash. 如果你對redis資料型態不太熟悉,可以參考
http://redis.io/topics/data-types-intro

為product定義個key product:,為每個數值定義hashkey, 譬如喜歡數like_num

$redis->hSet('product:123', 'like_num ', 5); // 添加 id为123的商品 like_num 为5
 
$redis->hIncrBy('product:123', 'like_num ', 1); // 添加 id为123的商品like_num +1

$redis->hGetAll('product:123'); // 获取id为123的商品相关信息
                  array('like_num '=> 1)

使用者維度計數

對使用者動態數、關注數、粉絲數、喜歡商品數、發文數等計數
用戶維度計數同商品維度計數都採用Hash. 為User定義個key 為user:
為每個數值定義hashkey, 譬如關注數follow


$redis->hSet('user:100000', 'follow ', 5); // 添加uid为10000的用户follow 为5
 
$redis->hIncrBy('user:100000', 'follow ', 1); // 更新uid为10000的用户follow +1

$redis->hGetAll('user:100000'); // 获取uid为10000的用户
                  array('like_num '=> 1)

                             在一個sorted set中,score可以是timestamp
預設集合按照score遞增排序這樣求兩個人的共同好友的操作,可能就只需要用求交集指令即可


#

$redis->zAdd('user:1000:follow', 1463557212, '1001'); 

                #uid为1000用户关注uid为1001 , score值设定时间戳1463557212

$redis->zAdd('user:1000:follow', 1463557333, '1002'); 

$redis->zAdd('user:2000:follow', 1463577568, '1001'); 

$redis->zAdd('user:2000:follow', 1463896964, '1003');
 
                #uid为2000用户关注1001和1003用户 , score值设定时间戳

$redis->zInter('com_fllow:1000:2000', array('user:1000:follow', 'user:2000:follow')); 

    #对集合'user:1000:follow'和'user:2000:follow'取交集'com_fllow:1000:2000'
    #获得共同关注的uid 

$redis->zRange('com_fllow:1000:2000',0,-1); // 获取全部集合元素
    #array('10001','10002')


用作緩存代替memcached


#應用於商品列表,評論列表,@提示列表

相對memcached 簡單的key-value儲存來說,redis眾多的資料結構(list,set,sorted set,hash,etc)

可以更方便cache各種業務數據,效能也不亞於memcached。

NOTE: RPUSH pagewviews.user: EXPIRE pagewviews.user: 60 //注意要update timeout


反spam系統



應用系統性評論、發布商品、論壇發佈的spam控制

作為一個電商網站被各種spam攻擊是少不免(垃圾評論、發布垃圾商品、廣告、刷自家商品排名等)
針對這些spam制定一系列anti-spam規則,其中有些規則可以利用redis做即時分析

譬如:1分鐘評論不得超過2次、5分鐘評論少於5次等(更多機制/規則需要結合drools )

常規sorted set將最近一天用戶操作記錄起來

(為什麼不全部記錄?節省memory,全部操作會記錄到log,後續利用hadoop進行更全面分析統計)

#获取5秒内操作记录
$res = $redis->zRangeByScore('user:1000:comment', time() - 5, time());
#判断5秒内不能评论
if (!$res) {
  $redis->zAdd('user:1000:comment', time(), '评论内容');
} else {
  echo '5秒之内不能评论';
}

#5秒内评论不得超过2次
if($redis->zRangeByScore('user:1000:comment',time()-5 ,time())==1)
echo '5秒之内不能评论2次';

#5秒内评论不得少于2次

if(count($redis->zRangeByScore(&#39;user:1000:comment&#39;,time()-5 ,time()))<2)
echo &#39;5秒之内不能评论2次&#39;;

用戶Timeline/Feeds



應用於關注的人、主題、品牌及專欄

redis在這邊主要當作cache使用

$redis->zAdd(&#39;user:2000:feed:topic&#39;, time(), &#39;13&#39;);
//score 为timestamp uid为2000的用户关注tid为13的topic

$redis->expire(&#39;user:2000:feed:topic&#39;,24*60*60);
#关注有效期为24小时
# ttl 30天之内按秒数计算 30天之外以timestamp为准

最新清單&排行榜


#用於記錄使用者剛剛喜歡的商品最新清單or排行榜等業務場景

商品最新清單-sorted set結構呈現

    $redis->zAdd(&#39;user:1000:product:like&#39;, time(), &#39;3002&#39;);
    $redis->zAdd(&#39;user:1000:product:like&#39;, time(), &#39;3001&#39;);
    $redis->zAdd(&#39;user:1000:product:like&#39;, time(), &#39;3004&#39;);
    $redis->zAdd(&#39;user:1000:product:like&#39;, time(), &#39;3003&#39;);
    
    $redis->zRange(&#39;user:1000:product:like&#39;, 0, -1,true); 
    #默认喜欢时间升序序排列
    #
      Array(
        [3002] => 1463565179
        [3001] => 1463565189
        [3004] => 1463565199
        [3003] => 1463565209
      )
    
    $redis->zRevRange(&#39;user:1000:product:like&#39;, 0, -1,true); 
    #以喜欢时间降序排列
    #
      Array
      (
        [3003] => 1463565424
        [3004] => 1463565414
        [3001] => 1463565404
        [3002] => 1463565394
      )
排行榜-list資料結構呈現

    $redis->lPush(&#39;user:1000:product:like&#39;, &#39;3002&#39;);
    $redis->lPush(&#39;user:1000:product:like&#39;, &#39;3001&#39;);
    $redis->lPush(&#39;user:1000:product:like&#39;, &#39;3004&#39;);
    $redis->lPush(&#39;user:1000:product:like&#39;, &#39;3003&#39;);
    
    $redis->lRange(&#39;user:1000:product:like&#39;, 0, -1);
    
    Array
    (
      [0] => 3003
      [1] => 3004
      [2] => 3001
      [3] => 3002
    )

訊息通知

採用Hash結構對訊息通知業務場景計數

$redis->hSet(&#39;user:1000:message:notice&#39;, &#39;system&#39;, 1);
#设置1条未读系统消息

$redis->hIncrBy(&#39;user:1000:message:notice&#39;, &#39;system&#39;, 1);
#未读系统消息+1

$redis->hSet(&#39;user:1000:message:notice&#39;, &#39;comment&#39;, 1);
#设置1条未读评论

$redis->hIncrBy(&#39;user:1000:message:notice&#39;, &#39;comment&#39;, 1);
#未读评论+1

$redis->hGetAll(&#39;user:1000:message:notice&#39;);
#查看所有消息通知数量

Array
(
  [system] => 2
  [comment] => 2
)

將Redis用作訊息佇列

採用Redis的List資料結構實作分散式的訊息佇列

相關推薦:

PHP之Redis擴充功能從安裝到使用

PHP利用redis實作session實例分享

#phalapi-快取的使用以及redis拓展

以上是PHP專案中需要用到Redis的場景的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn