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

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                - https://blog.csdn.net/heihaozi/article/details/123394487 - https://i6448038.github.io/2019/12/01/redis-data-struct/ - https://www.cnblogs.com/kuangtf/articles/15459957.html - https://pdai.tech/md/db/nosql-redis/db-redis-x-redis-ds.html - https://gitee.com/mirrors/redis/tree/unstable/src - hash 怎么覆蓋數據 --- 有個統計頁面的頁面, 數據是存在redis有序集合里, score 是日期, 成員是統計的結果。 現在遇到一個問題, 當天的統計結果需要每隔幾秒要更新一次。 但是有序集合不能根據score去更新成員的值, 需要根據socre找到成員, 然后再刪除成員,再添加回score 和成員。再刪除成員期間,還未添加回更新的值時, 有客戶端查詢的話, 就會少看到一條統計結果, 這要怎么解決? ``` script := ` local zset_key = KEYS[1] local score = ARGV[1] local new_member = ARGV[2] -- 獲取指定 score 的所有成員 local members = redis.call('ZRANGEBYSCORE', zset_key, score, score) -- 刪除所有這些成員 for i = 1, #members do redis.call('ZREM', zset_key, members[i]) end -- 添加新的成員 redis.call('ZADD', zset_key, score, new_member) return true ` _, err := g.Redis("cache4").Do("EVAL", script, 1, key, score, m) ``` - 如果需要 `ZRANGEBYSCORE` 返回的結果順序相反,可以使用 `ZREVRANGEBYSCORE` 命令,它會按分數從高到低的順序返回結果。 ### 關鍵點 1. **原子性**:Lua 腳本在 Redis 內部執行時是原子操作,這意味著所有命令會連續執行,期間不會被其他操作打斷。 2. **避免不一致性**:通過將 `ZREM` 和 `ZADD` 封裝在同一個腳本中執行,可以避免刪除成員期間有客戶端查詢到不完整數據的情況。 ### Lua 腳本的工作流程: 1. 先執行 `ZREM` 刪除舊成員。 2. 然后執行 `ZADD` 添加新成員,確保刪除和添加操作在同一個原子操作中執行。 由于 Lua 腳本執行期間沒有任何其他命令能夠干擾,因此你可以確保沒有其他客戶端會在刪除和重新添加成員的時間點進行查詢,從而避免數據不一致。 --- - 可視化工具: Redis Insight - Redis Desktop Manager --- - 刪除一個score - DoVar("ZRANGEBYSCORE", "ladder:limit_up_count", score, score) 取出對應score的成員 - 刪除成員 - DoVar("ZREM", "ladder:limit_up_count", delSCORE.Maps()[0]) --- - ZRANGEBYSCORE ladder:limit_up_count:1110 (20240911 +inf LIMIT 0 1 - ZREVRANGEBYSCORE ladder:limit_up_count:1110 (20240911 -inf LIMIT 0 1 ~~~ data1, err := g.Redis("cache4").DoVar("ZRANGEBYSCORE", "ladder:limit_up_count:"+binaryStr, "+inf", "("+score, "LIMIT", 0, 1) if err != nil { return nil, nil, nil, nil, err } data2, err := g.Redis("cache4").DoVar("ZREVRANGEBYSCORE", "ladder:limit_up_count:"+binaryStr, score, "-inf", "LIMIT", 0, 11) if err != nil { return nil, nil, nil, nil, err } ~~~ 在 Go 中,`float32` 類型的值可以是 `NaN`(Not-a-Number),表示一個未定義或無法表示的數字。這通常會出現在無效的數學操作中,例如: 1. 0 除以 0 (`0/0`) 2. 開平方負數 (`math.Sqrt(-1)`) 3. 對 `NaN` 進行數學操作 ### 檢查 `NaN` 的情況 Go 提供了內置函數 `math.IsNaN` 來判斷一個 `float32` 或 `float64` 值是否為 `NaN`。不過,對于 `float32` 你可以先將它轉換為 `float64` 再使用此方法。 ### 例子: ~~~ go復制代碼package main import ( "fmt" "math" ) func main() { // 引發 NaN 的情況 var a float32 = float32(0) / float32(0) fmt.Println("a:", a) // 檢查是否是 NaN if math.IsNaN(float64(a)) { fmt.Println("a 是 NaN") } else { fmt.Println("a 不是 NaN") } } ~~~ ### 輸出: ~~~ r復制代碼a: NaN a 是 NaN ~~~ ### 觸發 `NaN` 的常見情況: 1. **除以零:** ~~~ go復制代碼var a float32 = 0 / 0 ~~~ 2. **負數的平方根:** ~~~ go復制代碼var a float32 = float32(math.Sqrt(-1)) ~~~ 3. **`NaN` 傳播:** 如果你對 `NaN` 進行任何數學操作,結果也會是 `NaN`。比如: ~~~ go復制代碼var a float32 = float32(0) / float32(0) var b float32 = a + 1 // b 也是 NaN ~~~ 請注意,當進行一些無效數學運算時,`NaN` 是一個標準表示,程序本身不會崩潰或拋出異常,但計算結果會產生 `NaN`。 --- --- ~~~go type Person struct { age int } func main() { person := &Person{28} // 1. defer fmt.Println(person.age) // 2. defer func(p *Person) { fmt.Println(p.age) }(person) // 3. defer func() { fmt.Println(person.age) }() person.age = 29 } ~~~ ``` ### 答案解析: 參考答案及解析:29 29 28。變量 person 是一個指針變量 。 1.person.age 此時是將 28 當做 defer 函數的參數,會把 28 緩存在棧中,等到最后執行該 defer 語句的時候取出,即輸出 28; 2.defer 緩存的是結構體 Person{28} 的地址,最終 Person{28} 的 age 被重新賦值為 29,所以 defer 語句最后執行的時候,依靠緩存的地址取出的 age 便是 29,即輸出 29; 3.很簡單,閉包引用,輸出 29; 又由于 defer 的執行順序為先進后出,即 3 2 1,所以輸出 29 29 28。 ```
                  <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>

                              哎呀哎呀视频在线观看