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

2021-08-27 11:26:36 字數 4210 閱讀 9547

採用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專案中的實際應用場景

一些案例中有的同學說為什麼不可以用string型別,string型別完全可以實現呀 我建議你看下我的專欄文章 redis高階用法 裡面介紹了用hash型別的好處 採用redis 的型別 hash.如果你對redis資料型別不太熟悉,可以參考 為product定義個key product 為每種數值定...

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