一些案例中有的同學說為什麼不可以用string型別,string型別完全可以實現呀採用redis 的型別: hash. 如果你對redis資料型別不太熟悉,可以參考我建議你看下我的專欄文章《redis高階用法》,裡面介紹了用hash型別的好處
為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 簡單的key-value儲存來說,redis眾多的資料結構(list,set,sorted set,hash,
etc)
可以更方便cache各種業務資料,效能也不亞於memcached。
note: rpush pagewviews.user: expire pagewviews.user: 60 //注意要update timeout
針對這些spam制定一系列anti-spam規則,其中有些規則可以利用redis做實時分析
#獲取5秒內操作記錄
$res = $redis->zrangebyscore('user:1000:comment', time() - 5, time());
if (!$res) else
if($redis->zrangebyscore('user:1000:comment',time()-5 ,time())==1)
if(count($redis->zrangebyscore('user:1000:comment',time()-5 ,time()))<2)
應用於關注的人、主題、品牌及專欄redis在這邊主要當作cache使用
$redis->zadd('user:2000:feed:topic', time(), '13');
//score 為timestamp uid為2000的使用者關注tid為13的topic
$redis->expire('user:2000:feed:topic',24*60*60);
#關注有效期為24小時
# ttl 30天之內按秒數計算 30天之外以timestamp為準
用於記錄使用者剛剛喜歡的商品最新列表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);
#預設喜歡時間公升序序排列
#array(
[3002] => 1463565179
[3001] => 1463565189
[3004] => 1463565199
[3003] => 1463565209
)$redis->zrevrange('user:1000:product:like', 0, -1,true);
#以喜歡時間降序排列
#array
([3003] => 1463565424
[3004] => 1463565414
[3001] => 1463565404
[3002] => 1463565394
)排行榜-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);
array
([0] => 3003
[1] => 3004
[2] => 3001
[3] => 3002
)
採用hash結構對訊息通知業務場景計數
$redis->hset('user:1000:message:notice', 'system', 1);
#設定1條未讀系統訊息
$redis->hincrby('user:1000:message:notice', 'system', 1);
#未讀系統訊息+1
$redis->hset('user:1000:message:notice', 'comment', 1);
$redis->hincrby('user:1000:message:notice', 'comment', 1);
$redis->hgetall('user:1000:message:notice');
#檢視所有訊息通知數量
array
( [system] => 2
[comment] => 2
)
採用redis的list資料結構實現分布式的訊息佇列
Redis在Php專案中的實際應用場景
採用redis 的型別 hash.如果你對redis資料型別不太熟悉,可以參考 為product定義個key product 為每種數值定義hashkey,譬如喜歡數like num redis hset product 123 like num 5 新增 id為123的商品 like num 為5...
Redis在Php專案中的實際應用場景
一些案例中有的同學說為什麼不可以用string型別,string型別完全可以實現呀 我建議你看下我的專欄文章 redis高階用法 裡面介紹了用hash型別的好處 採用redis 的型別 hash.如果你對redis資料型別不太熟悉,可以參考 為product定義個key product 為每種數值定...
Redis在Php專案中的實際應用場景
採用redis 的型別 hash.如果你對redis資料型別不太熟悉,可以參考 為product定義個key product 為每種數值定義hashkey,譬如喜歡數like num redis hset product 123 like num 5 新增 id為123的商品 like num 為5...