會話維持
使用Token維護用戶登陸狀態(tài),作為用戶操作憑證补君。
更新Token
hset login: token userId
將登陸的用戶Id和token用hash做映射
zadd recent: timestamp token
將token放入到最近操作的有序集合中,以當前時間戳作為分數(shù)
zadd viewed:Token timestamp ItemId
將最新訪問的商品Id加入到該用戶的最近訪問商品有序集合中
zremrangebyrank viewed:Token 0 -26
刪除該用戶最近訪問的商品的比較老的記錄俩滥,保持只記錄25個歷史足跡
zincrby viewd: item -1
將當前瀏覽的商品的分值減一,這樣訪問次數(shù)越多的商品的分值就會越小
zremrangebyrank viewed: 0 -20001
定期將20000名以后(分值從大到小的后20000名)的商品刪除
zinterstore viewed: 1 viewed: weights 0.5
將剩余商品的瀏覽次數(shù)減半檢查Token
hget login:token
根據(jù)token獲取登陸用戶画切,如果為空宜岛,說明未登陸或者登陸已過期清理過期會話长踊,保持同時在線人數(shù),最多500w萍倡,下列操作可以創(chuàng)建為定時任務身弊,定時執(zhí)行
zcard recent:
獲取當前在線人數(shù),判斷如果人數(shù)大于500w列敲,則清理長時間沒有更新token的用戶
zrange recent: 0 100
獲取最久沒更新的token阱佛,100為 min(在線人數(shù)-500w, 100)
del viewed:Token
循環(huán)刪除過期用戶的瀏覽歷史
hdel login: Token
循環(huán)刪除過期用戶的token-user綁定
zrem recent: token
循環(huán)刪除token
購物車
使用cookie做保存購物車的問題,每次http請求都會帶著cookie戴而,一旦購物車數(shù)量比較大凑术,那么請求和處理速度都會有影響。另外還需要解析cookie中的商品所意,判定其是否仍然有效淮逊。
hset cart:token item counts
將item加入購物車,數(shù)量為counts
hdel cart:token item
如果counts為0扶踊,則刪除購物車中的這個商品
del cart:token
在上邊清理會話中泄鹏,同時清理掉這個會話的購物車
通過將會話cookie和購物車cookie 放入到redis中,可以利用這些數(shù)據(jù)秧耗,進行商品的統(tǒng)計分析
頁面緩存
一般上备籽,很多商品頁面,一旦該商品創(chuàng)建后绣版,就幾乎不會再修改了胶台。通過【數(shù)據(jù)+模版】生成靜態(tài)頁面并緩存的方式,可以有效減少動態(tài)生成頁面的時間杂抽,大大提高訪問速度诈唬。
Laravel中,可以創(chuàng)建一個中間件缩麸,給可以緩存的路由加上這個中間件铸磅。在中間件中,將第一次動態(tài)生成的頁面存到redis中杭朱,并給這個緩存加上過期時間阅仔。下次請求先訪問緩存,緩存失效或不存在的情況下弧械,才再次動態(tài)生成八酒。
get cacheName
根據(jù)一定規(guī)則(可以是Url),獲取redis中緩存的結果刃唐,如果不存在羞迷,再去訪問數(shù)據(jù)庫界轩,并將結果存入redis
set cacheName cacheResult
將結果存入redis
expire cacheName 60
緩存1分鐘
秒殺
秒殺商品頁面和普通商品頁面最大的不同,就是秒殺商品有購買的時間和庫存的限制衔瓮。這兩個數(shù)據(jù)不能通過上一步中【頁面緩存】的方式顯示浊猾。
我們可以通過ajax請求的方式,動態(tài)獲取庫存和秒殺時間热鞍,這兩個數(shù)據(jù)可以放入到redis葫慎,避免短時間大量請求堵塞數(shù)據(jù)庫。
我們維護兩個有序集合來實現(xiàn)這個功能薇宠。
- 一個有序集合key為要緩存的數(shù)據(jù)的id偷办,如商品id,分值為時間戳澄港,代表什么時候應當重新從數(shù)據(jù)庫將最新的數(shù)據(jù)加載數(shù)據(jù)到redis
- 一個有序集合key也是要緩存的數(shù)據(jù)的id爽篷,分值為延時時間,代表每隔多久緩存一次慢睡。如果這個值小于0,則不應該繼續(xù)緩存這個數(shù)據(jù)铡溪,應當將其從redis刪除漂辐。
創(chuàng)建任務 id, delay
zadd delay: delay id
延時列表,分值為緩存更新的間隔時間
zadd schedule: timestamp id
任務列表棕硫,分值為下一次緩存更新的時間-
定時任務髓涯,更新緩存
zrange schedule: 0 0 withscores
從任務列表中獲取最新要更新的任務,如果這個任務的更新時間還沒有到哈扮,就sleep一段時間纬纪,從新檢查
zscore delay: id
獲取這個任務的緩存更新間隔時間,如果這個間隔時間小于0滑肉,說明不需要再緩存這個數(shù)據(jù)包各,將這個數(shù)據(jù)從redis刪除
zrem delay: id
刪除時間間隔
zrem schedule: id
刪除任務調度
del inv:id
刪除緩存的數(shù)據(jù)set inv:id
如果間隔時間大于0,就從數(shù)據(jù)庫查出最新的數(shù)據(jù)靶庙,放入redis中
zadd schedule: timestamp+delay id
將這條數(shù)據(jù)的下次更新放入任務隊列问畅,分值為當前時間+延時的時間