之前在開發的時候,是用incrBy沒有注意很多,只知道他可以加一個整數。
突然有一天,端傳進來一個浮點數。
這時候出現問題了。incrBy會把浮點數轉爲整數,會截斷浮點數。比如1.23會轉爲1.98也會轉爲1。
所以。數據就會出現問題。
當我用redis直連的時候,如果插入一個浮點數。會報錯。但是用PHP操作,不會報錯。
當我以爲問題解決的時候,我發現了另一個問題。
當這個數初始值爲小數的時候,無論incrBy加的是一個整數還是浮點數都會報錯。並且,值沒有任何變化。
當這個數字初始值是整數的時候,incrBy會把浮點數強轉爲整數並且存儲進去。
PHP是弱類型語言,而redis是用強類型語言C語言實現的。中間的轉換如果類型不同會出現強轉。會出現缺失的問題。
有兩個建議:
第一個,用incrBy的時候無論傳進來數字是什麼,一定要強轉爲int。
第二個,直接用incrByFloat進行原子加操作。