點贊功能程式設計
阿新 • • 發佈:2019-01-09
不太推薦LS用HASH來儲存點讚的資料. 因為沒辦法進行排序(如果需要的話. 我想一定需要)
目前 我們是這樣處理的.
可以使用ZSET有序集合進行儲存. 理論上說一個ZSET中, 10W以內的數量並無任何鴨梨. 也就是說一條微博點讚的人數再10W以內(這是不可能的).
$redis->ZADD("t:$tid:liked", time(), $uid); //$tid 為你的微博ID, $uid 為你的點贊人的UID
//取出點讚的人(支援按照點贊時間來排序的哦:)).. 按照LSD的說的 HASH取出來的值沒有任何順序的.
$uids = $redis->ZREVRANGE("t:$tid:liked" , $offset, $max, TRUE); //倒序取值
$uids = $redis->ZRANGE("t:$tid:liked", $offset, $max, TRUE); //順序取值
//$offset 和 $max 這樣來算
$pagesize = 20;
$offset = ($page > 1) ? ($page - 1) * $pagesize : 0;
$max = ($page * $pagesize) - 1;
//一次性取出所有的這樣取.
$total = $redis->ZCARD("t:$tid:liked");
$uids = $redis->ZREVANGE ("t:$tid:liked", 0, $total - 1, TRUE);
//拿到的$uids 是一個array 哦..
//判斷一個使用者是否點讚了這一來哦
$redis->ZSCORE("t:$tid:liked", $uid);
//取消贊這樣來
$redis->ZREM("t:$tid:liked", $uid);
//批量取消某短時間內的點贊這樣操作
$redis->ZREMRANGEBYSCORE("t:$tid:liked", $start_timestamp, $end_timestamp);
//諸如此類的操作, 要比HASH強很多.
恩再PS一下!!!
如果需要用到NOSQL這樣的資料庫來儲存類似微博的資料的話, 可以這樣儲存:).
$pipe = $redis->MULTI(Redis::PIPELINE);
$pipe->SET("t:$tid", json_encode($data)) //json這種格式儲存貌似有點廢物. 如果能想到更好的格式的話,不要用JSON, 因為JSON太大了.. 比如MSGPACK這個個是就比JSON要好很多
->ZADD("t:scores", time(), $tid);
$pipe->EXEC();
//PIPE 這樣的操作贊爆了. 如果你的REDIS支援事務的話, PIPE就不是一個原子性的操作了
//取出資料的話就很好取出了!!
$tid = $reids->ZREVRANGE("t:scores", 0, 100);
$pipe = $redis->MULTI(Redis::PIPELINE);
foreach($tid as $key=> $value){
$pipe->GET("t:$value");
}
$list = $pipe->EXEC();
//$list就是你的資料啦
再再PS一下, 微博評論也是類似的儲存方法. 只是需要約定$redis KEYS的名稱. 比如:
c:<評論ID> 怎麼和微博資料關聯起來可以這樣:
t:$tid:comments:scores (ZSET timestmap 評論ID);
這樣取資料的時候就用PIPELINE方便很多了.
最後囉嗦一句, NOSQL這種資料庫的 KEY 一定要設定好.