Redis実戦ノート-ショッピングサイト
3112 ワード
セッションの維持は、Tokenを使用して、ユーザ操作証明書としてユーザ登録状態を維持する. 更新Token に半減する. Token .は期限切れのセッションをクリーンアップし、同時にオンライン人数を維持し、最大500 w、以下の操作はタイミングタスクとして作成することができ、 ショッピングカート
クッキーを使ってカートを保存する問題は、httpリクエストのたびにクッキーを持参し、カートの数が多いとリクエストや処理速度に影響します.また、クッキーの商品を解析し、まだ有効かどうかを判定する必要があります.
セッションクッキーとカートクッキーをredisに入れることで,これらのデータを利用して商品の統計分析を行うことができる.
ページキャッシュ
一般的に、多くの商品ページは、その商品が作成されると、ほとんど変更されません.【データ+テンプレート】静的ページを生成してキャッシュすることで、動的にページを生成する時間を効果的に低減し、アクセス速度を大幅に向上させることができます.
Laravelでは、キャッシュ可能なルーティングにこのミドルウェアを追加するミドルウェアを作成できます.ミドルウェアでは、最初に動的に生成されたページをredisに保存し、このキャッシュに有効期限を追加します.次回のリクエストがキャッシュに先にアクセスし、キャッシュが無効になったり、存在しない場合に再動的に生成されます.
秒殺
秒殺商品ページと普通の商品ページの最大の違いは、秒殺商品には購入時間と在庫の制限があることです.この2つのデータは、前のステップの「ページキャッシュ」では表示できません.ajaxリクエストにより、在庫と秒殺時間を動的に取得できます.この2つのデータはredisに格納され、短時間で大量のリクエストがデータベースを塞ぐことを避けることができます.
この機能を実現するために2つの秩序化された集合を維持します.は、商品idのような秩序化された集合keyがキャッシュするデータのidであり、タイムスタンプに分割され、いつデータベースから最新のデータをredis に再ロードすべきかを表す.秩序化された集合keyもキャッシュするデータのidであり、遅延時間であり、どのくらいごとにキャッシュされるかを表す.この値が0未満の場合、このデータをキャッシュし続けるべきではなく、redisから削除する必要があります. タスクid,delay である.タイミングタスク、更新キャッシュ に値する.
hset login: token userId
登録されたユーザIdとtokenをhashでマッピングするzadd recent: timestamp token
tokenを最近の操作の順序集合に入れ、現在のタイムスタンプをスコアzadd viewed:Token timestamp ItemId
として最新のアクセス商品Idを当該ユーザの最近のアクセス商品順序集合のzremrangebyrank viewed:Token 0 -26
に加えて当該ユーザが最近アクセスした商品の比較的古い記録を削除し、履歴足跡25個のみを記録するzincrby viewd: item -1
は、現在閲覧している商品のスコアを1つ減らすことで、アクセス回数が多い商品のスコアが小さいzremrangebyrank viewed: 0 -20001
ほど定期的に20000名以降(スコアが大きいものから小さいものまでの後20000名)の商品をzinterstore viewed: 1 viewed: weights 0.5
削除し、残りの商品の閲覧回数をhget login:token
をチェックtokenに基づいてログインユーザを取得し、空の場合はログインしていないか、ログインが期限切れであることを示すzcard recent:
をタイミング的に実行して現在のオンライン人数を取得し、人数が500 wより大きい場合、tokenを更新していないユーザーzrange recent: 0 100
をクリーンアップして最も長い間更新していないtokenを取得すると判断し、100はmin(オンライン人数-500 w,100)del viewed:Token
ループ削除期限切れユーザの閲覧履歴hdel login: Token
ループ削除期限切れユーザのtoken-userバインドzrem recent: token
ループ削除token クッキーを使ってカートを保存する問題は、httpリクエストのたびにクッキーを持参し、カートの数が多いとリクエストや処理速度に影響します.また、クッキーの商品を解析し、まだ有効かどうかを判定する必要があります.
hset cart:token item counts
はitemをカートに追加し、数量がcounts hdel cart:token item
でcountsが0の場合、カートのこの商品del cart:token
を削除して上でセッション中をクリーンアップし、同時にこのセッションのカートをクリーンアップします.セッションクッキーとカートクッキーをredisに入れることで,これらのデータを利用して商品の統計分析を行うことができる.
ページキャッシュ
一般的に、多くの商品ページは、その商品が作成されると、ほとんど変更されません.【データ+テンプレート】静的ページを生成してキャッシュすることで、動的にページを生成する時間を効果的に低減し、アクセス速度を大幅に向上させることができます.
Laravelでは、キャッシュ可能なルーティングにこのミドルウェアを追加するミドルウェアを作成できます.ミドルウェアでは、最初に動的に生成されたページをredisに保存し、このキャッシュに有効期限を追加します.次回のリクエストがキャッシュに先にアクセスし、キャッシュが無効になったり、存在しない場合に再動的に生成されます.
get cacheName
は、一定のルール(Urlであってもよい)に従って、redisでキャッシュされた結果を取得し、存在しない場合はデータベースにアクセスし、結果をredis set cacheName cacheResult
に格納し、結果をredis expire cacheName 60
に格納して1分間キャッシュする秒殺
秒殺商品ページと普通の商品ページの最大の違いは、秒殺商品には購入時間と在庫の制限があることです.この2つのデータは、前のステップの「ページキャッシュ」では表示できません.ajaxリクエストにより、在庫と秒殺時間を動的に取得できます.この2つのデータはredisに格納され、短時間で大量のリクエストがデータベースを塞ぐことを避けることができます.
この機能を実現するために2つの秩序化された集合を維持します.
zadd delay: delay id
遅延リストを作成し、値はキャッシュ更新の間隔時間zadd schedule: timestamp id
タスクリストであり、値は次のキャッシュ更新の時間zrange schedule: 0 0 withscores
タスクリストから最新更新するタスクを取得し、このタスクの更新時間がまだ来ていない場合は、sleepについてしばらくの間、新しいチェックzscore delay: id
からこのタスクのキャッシュ更新間隔時間を取得し、この間隔時間が0未満である場合は、このデータをキャッシュする必要がないことを示します.このデータをredis削除zrem delay: id
削除間隔zrem schedule: id
削除タスクスケジュールdel inv:id
削除キャッシュのデータset inv:id
削除間隔時間が0より大きい場合はデータベースから最新のデータを検出し、redisに入れるzadd schedule: timestamp+delay id
このデータの次回の更新をタスクキューに入れ、現在時間+遅延時間