Redis在Php專案中的實際應用場景

2021-09-25 00:23:16 字數 4331 閱讀 9466

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

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

採用redis 的型別: hash. 如果你對redis資料型別不太熟悉,可以參考

為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...