<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 什么是冪等性 任意多次執行所產生的影響均與一次執行的影響相同。 簡述:某個操作多次重復執行,最終結果是一致的,不會因為多次重復執行對系統造成影響。 # 什么操作會出現冪等性問題 項目里主要處理**添加接口**的冪等和**特殊情況**下的**編輯接口**冪等 1. 重復提交問題:用戶多次連續點擊提交按鈕或者網絡波動再次點擊提交 2. 重復點贊 3. Mq重復消費消息 4. 更新庫存:增減商品庫存,領取優惠券 # 常用解決方案 Token令牌,版本號,業務唯一標識 ## Token令牌 主要是解決表單重復提交問題 簡單方式:每次進入表單頁面,前端去后臺獲取生成的全局唯一Token,后臺以token為key放到redis中,點擊提交時一起發給后臺,同時前端將按鈕置灰,存在則刪除 token,執行方法。 這個存在的問題是:先刪除token,還是先處理業務。 先刪除token:業務數據校驗失敗或其他異常,需要重新修改提交,則此token已刪除了。 后刪除token:網絡波動,業務復雜可能會出現這種情況:先處理業務,那么未刪除token前,前端再次點擊請求過來又將執行方法了。 復雜版本:token對應的value 有狀態,value 狀態為 1 是可提交,2是執行中,3是執行完成。點擊提交時一起發給后臺,同時前端將按鈕置灰,后臺驗證token以判斷后續流程。 ![](https://img.kancloud.cn/19/55/195512114f4c3381cc41265f1f8de384_830x365.png) ## 版本號 數據庫增加數字類型的版本號字段,當讀取數據時,會將 version 字段的值一同讀出,更新時版本號加1,提交更新時會用當前數據里的版本號和數據庫中的版本號比對,如果不一致則表示有人修改過了。適合讀多寫少的業務。 ## 唯一標識 優惠券重復領取:優惠券主鍵和用戶id做聯合唯一校驗,如果存在了則表示已領取 點贊:用戶id和被點贊id做聯合唯一校驗,如果存在了則表示已點贊 ## 實際案例1(token解決表單重復提交) 非洲的后臺管理項目,那邊的網速比較慢,也沒有并發,就是網絡差 當時只是前端頁面按鈕加loading 效果的,沒使用token機制,超時之后,就又能點擊了,導致成功了倆條。 ### 需要解決的問題 1. 接口冪等性問題 2. 用戶環境網速差,超時之后提交問題,單純token無法處理 ### 解決方式 大概內容如下:細節記不清了 使用token: 前端進入表單頁面后, 向后臺請求一個唯一token,后臺以token為key放到redis中了(過期時間不要太短), value默認1, 用于在點擊提交時傳給后臺, 后臺通過此token在redis中的值來判斷是不是執行接口方法。 value有三個值, 1 初始值, 2 正在執行, 3 執行完成 第一次獲取token提交時, 在aop的前置通知里判斷token在redis中是否存在, 存在且等于1, 則將此token改為2,如果token 為2 則表示方法正在執行中, 如果為3, 表示方法已執行完成,也就是只有1時才繼續執行 在aop的后置返回通知(在目標方法返回之后執行)里,判斷返回的狀態碼是200嗎, 是修改value值為 3, 否則改為1.(因為有些參數校驗失敗, 也是在這里捕獲) 在aop的異常通知里修改value值為 1 這樣用戶第一次提交, value是1, 正常執行, 如果是超時以后, 方法value是2或者3就提示用戶相應信息。 如果第一次提交報錯了或者表單數據校驗沒通過, 那么value初始化為1了, 用戶再次點擊提交就相當于第一次提交 ### 實際案例2 庫存更新 [電商庫存系統的防超賣和高并發扣減方案](https://xie.infoq.cn/article/741d651fdc8b4daf824fb8b31) 當時是訂單下單時預扣庫存,支付后才實際減庫存。鎖定庫存字段+真實庫存字段 #### MySQL直接更新 流量小,無并發,直接用java層面的鎖或者MySQL行鎖解決,減庫存是在一條sql里完成, 也會判斷庫存字段-具體扣減數>0才執行(就是update 表 庫存數量=庫存數量-具體扣減數 where 庫存數量-具體扣減數要>0)防止扣成負數,更新完成記錄流水日志 #### Redis + MySQL 先在redis中扣減, 在異步落庫 #### 實際案例3(唯一標識解決點贊) 使用唯一標識方式:用戶id和被點贊業務id做唯一標識 簡單版本:流量小且可以接受適度重復點贊。點贊后前端直接修改為不能點擊,后臺加鎖查詢下是否已點贊, 點贊和查詢都直接在數據庫。三無項目我們就這么應付, 這個可以實時顯示點贊數量, 開發簡單。 復雜:redis + mysql 在redis中點贊, 然后異步落庫(mq或者定時任務), 如果redis宕機,會有丟失數據風險 Redis 使用 set 類型, set集合有方法判斷 value 元素是否存在于集合 key 中(list沒有) Key是業務標識:用戶id value是 被點贊業務id 列表 ``` // 視頻都有哪些用戶點贊 格式 video:likeuser:videoId1 userId1 userId2 userId3 userId4 sadd video:likeuser:videoId1 userId1 用戶1給視頻1點贊了 ``` 可以獲取當前用戶是否點贊(set可以判斷value是否在key中)、當前視頻點贊數量 // 用戶給哪些視頻點贊 這個根據業務確定是否需要 ``` sadd video:userlike:userId1 videoId1 用戶1給視頻1點贊了 ``` Set 支持取交集并集 ![](https://img.kancloud.cn/a4/6b/a46bf88e31e405d6c8691a2738a9e304_831x190.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看