Redis應用場景

常見的Redis應用場景

爲了節約內存,建議使用hashset而不是set/get的方式來使用Redis
Redis的命令都是原子性的,你可以輕鬆地利用INCR,DECR等命令來計數。

用於計數

常見的模塊比如商品,用戶相關的計數,採用Redis 的類型: Hash.
商品:評論數,瀏覽數,收藏數等計數
用戶:動態數、關注數、粉絲數、收藏商品數、發帖數等計數
消息:系統消息,評論提示等計數

// 添加 id爲5945125的商品 瀏覽數 爲5
$redis->hSet('goods:5945125', 'view_num ', 5);  
// 添加 id爲10011的用戶粉絲數 +1
$redis->hIncrBy('user:10011', 'fans_num ', 1);  
// 獲取id爲10011的用戶相關信息
$redis->hGetAll('user:10011'); 

社交信息

類似社區模塊將用戶的好友/粉絲/關注,可以存在一個sorted set中,score可以是timestamp
默認集合按照score遞增排序
這樣求兩個人的共同好友的操作,可能就只需要用求交集命令即可

//uid爲2000用戶關注1001和1002用戶 , score值設定時間戳
$redis->zAdd('user:1000:follow', 1463557212, '1001'); 
$redis->zAdd('user:1000:follow', 1463557333, '1002'); 

//uid爲2000用戶關注1001和1003用戶 , score值設定時間戳
$redis->zAdd('user:2000:follow', 1463577568, '1001'); 
$redis->zAdd('user:2000:follow', 1463896964, '1003');

//對集合'user:1000:follow'和'user:2000:follow'取交集'com_fllow:1000:2000'來獲得共同關注的uid                      
$redis->zInter('com_fllow:1000:2000', array('user:1000:follow', 'user:2000:follow')); 

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

用作緩存代替memcached

相對memcached 簡單的key-value存儲來說,redis衆多的數據結構(list,set,sorted set,hash,etc)
可以更方便cache各種業務數據,性能也不亞於memcached。
緩存的應用場景有很多,這個需要根據具體的業務來做,例如商品信息,評論列表等

用作緩存代替memcached

應用系統評論、發佈商品、論壇發貼的spam控制(垃圾評論、發佈垃圾商品、廣告、刷自家商品排名等)
針對這些spam制定一系列anti-spam規則,其中有些規則可以利用redis做實時分析

譬如:1分鐘評論不得超過2次、5分鐘評論少於5次等

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

//獲取5秒內操作記錄
$res = $redis->zRangeByScore('user:1000:comment', time() - 5, time());
//判斷5秒內不能評論
if (!$res)
    $redis->zAdd('user:1000:comment', time(), '評論內容');
else 
    echo '5秒之內不能評論';

最新列表&排行榜

用於記錄用戶剛剛喜歡的商品最新列表or排行榜 等業務場景

//商品最新列表-sorted set結構呈現
$redis->zAdd('user:1000:product:like', time(), '3002');
$redis->zAdd('user:1000:product:like', time(), '3001');
$redis->zAdd('user:1000:product:like', time(), '3004');
$redis->zAdd('user:1000:product:like', time(), '3003');

//默認喜歡時間升序序排列      
$redis->zRange('user:1000:product:like', 0, -1,true); 

//以喜歡時間降序排列
$redis->zRevRange('user:1000:product:like', 0, -1,true); 
//排行榜-list數據結構呈現
$redis->lPush('user:1000:product:like', '3002');
$redis->lPush('user:1000:product:like', '3001');
$redis->lPush('user:1000:product:like', '3004');
$redis->lPush('user:1000:product:like', '3003');
        
$redis->lRange('user:1000:product:like', 0, -1);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章